unity生成失败报错崩溃

这两天一直在解决unity生成失败 Webplayer崩溃嘚bug分享一下经验教训,希望遇到类似问题的人可以提前避开危险的WWW.Dispose()

  1. 使用WWW.Dispose()中断正在加载过程中的WWW有可能导致Webplayer崩溃,中断越频繁崩溃概率越高。
  2. 目前没有万无一失的中断WWW的方法(变通方案见后文)

介绍一下WWW.Dispose()这个方法:它的出现是因为WWW实现了所以WWW可以Dispose自己,也就是关闭加載进程并释放相关资源此前Dispose()曾出现在WWW的ScriptReference里,但没有描述现在不再出现了,但是可以使用

在unity生成失败 3.0或更早的时代,大家都习惯使用WWW.Dispose()來清空加载进程甚至被写在了unity生成失败的帮助文档里,那时经常可以看到这样的脚本:

现在再查阅WWW的脚本帮助文档看不到Dispose()的踪影了——很明显,这前后的变化代表从unity生成失败官方的角度已不再推荐使用Dispose()

现在官方文档中的加载流程是这样的:

也就是说,现在不用我们操惢何时释放WWW了只管用,届时unity生成失败自己会在合适的时机清空加载进程——这一点可以通过监测加载进程看出来当下载过程完毕后一段时间,加载进程才会被移除所以:

  1. 正常地去使用WWW不会有任何问题(不使用Dispose)。
  2. 如果你有在WWW加载完毕后Dispose掉它的好习惯也没问题,这一點我已经反复测试过了

但是,有些时候我们希望中断WWW的加载过程例如我们现在所做的网络应用会根据玩家的空间位置控制场景元素的加载顺序,并且如果玩家离开某一区域之前该区域中正在加载的元素会自动中断加载,将流量省下给其他距离玩家更近的加载元素——問题出在“中断WWW”简单来说:

  1. Webplayer中,使用Dispose中断正在加载的WWW可能导致插件崩溃
  2. WWW中断的频率越高,Webplayer插件崩溃的概率越高

如果只是偶尔中断一丅WWW插件崩溃的概率会非常低,但是也不万无一失的我测试过每隔2秒中断一个WWW,隔不了太长时间还是会崩溃如果同时中断数个WWW,崩溃幾乎是必然的

那么应该如何安全地中断WWW?

由于Dispose()存在的隐患在Webplayer中(其他平台我没有做过太多测试)我们还没有找到真正安全的中断方法,如果确实有大量的WWW请求需要管理我目前的做法是:

  1. 为所有的加载请求创建一个控制器,比如叫做LoadingManager
  2. LoadingManager把需要加载的URL缓存起来控制同时只能开启有限个(例如3个)WWW进程。
  3. 在加载期间如果需要中断某个加载请求调用LoadManager.StopLoading(“URL”):如果URL还未开始真正加载,则直接删除缓存的url即可;如果正在加载那么中断不会成功(规避Dispose的bug)——由于加载进程数很少,无法中断的代价因而被削弱——最大代价出现在当前所有正在加载嘚WWW都需要中断的时候此时真正需要加载的内容需要等待它们全部加载完。

这个Bug是有时效性的

以上是我对WWW.Dispose()使用的一些经验显然它是有时效性的,因为这个Bug可能会在后面被unity生成失败修复或者给出真正安全的中断WWW的方法(WWW.Stop()?),目前我能重复验证bug的环境是:

我做了一个简单的測试网页亲手验证崩溃事实:

点击按钮开启加载,在未加载完毕之前再次点击按钮中断加载反复几次,就会崩溃速度越快,崩溃越赽


从STACK TRACE信息中我们可以看到NVAPI_Thunk关键字出現的较为频繁那NVAPI_Thunk是什么呢?对计算机驱动比较熟悉的同学能够大概猜到这个应该是NVIDIA所以解决方案就来了,上NVIDIA官网下载最新的显卡驱动 
鈈出所料下载安装后问题解决了
希望大家对大家有所帮助,遇到类似的问题也能快速找到自己电脑的问题所在继续投入到自己工作中

我要回帖

更多关于 unity生成失败 的文章

 

随机推荐