unity的www.dispose()卡死freeze bug

    xiaoxiao2025-10-27  4

    unity的www.dispose()卡死freeze bug

    起因

    最近做gearvr开发时,发现了个画面卡死的问题,表现是画面播着播着突然渲染停止,看起来是主渲染线程被无限制卡死,当时只知道具体现象是可能与http请求有关,一直也没有定位到,而在editor模式下不会出现类似的问题,所以大概可以确定是在android平台上发生的。我的unity版本是5.3.4f1

    调查

    最近仔细调试了一下,发现与www的dispose()有关,当然我代码是用的

    using(WWW www = new WWW(url))

    代码块这样的方式自动调用dispose,我试着直接调用www.dispose()也会有卡死的问题。确定了是dispose()的问题,就在网上看了一些其他人遇到类似的问题。这里我的http请求是服务器一直没有回应,无休止的pending,好吧~

    http://answers.unity3d.com/questions/1067499/bug-wwwdispose-when-called-before-wwwisdone-true-f.html

    https://issuetracker.unity3d.com/issues/ios-app-freezes-if-www-is-loaded-with-403-url-and-www-dot-dispose-is-called

    https://issuetracker.unity3d.com/issues/unity-freezes-when-www-dot-dispose-is-used-while-downloading-assetbundle

    https://issuetracker.unity3d.com/issues/android-application-freezes-on-www-dot-dispose-if-connection-is-canceled

    大体上说法就是当调用www.dispose()时,如果之前的请求还没结束,那么可能就会发生阻塞卡死,因为是在协程中调用,如果发生阻塞一样会导致主渲染线程阻塞,大概卡死1分多钟吧。

    解决方案

    要么就不要去调用dispose了,要么换个实现方式吧,比如besthttp插件,哈哈我觉得至少比www使用起来舒服很多。

    坑总是很多的,还是要想办法定位和解决。

    最新回复(0)