好库网 好库网首页 | 我的好库
unity3d的专栏

Unity3D WWW在Android上下载速度慢

发布者:unity3d
发布日期:2018/11/20 14:12:50   更新日期:2018/11/20 14:12:50
阅读次数:59
评分:4.80
介绍:Unity3D 中用WWW下载速度比较慢的问题。
正文:

我尝试从服务器获取数据,范围从100kb到15mb。文件<5mb的下载速度合理,但之后变得非常慢。一个11mb的文件花了4.5分钟下载。WWW类的下载缓冲区大小是否超小?还有其他选择吗?

起初我以为这可能是因为我每帧产生一次,所以每隔几毫秒就会中断文件下载以产生帧。所以我在进度增加5%时才用yield返回,但这只是加快了一点点,仍然非常缓慢。

var progressCounter = .05;
while (!www.isDone) {
if(www.progress/progressCounter > 1) {
progressCounter += .05;
yield return null;
}
}


这里有几点需要注意。
WWW在单独的线程中运行,而不是在主线程上运行。
WWW允许您指定线程优先级threadPriority(低Low,低于正常BelowNormal,正常Normal,高High)

yield是Unity的协程函数。协程不是线程,它所做的就是保存函数的当前状态并等待一帧并在正常执行yield之后恢复。上面的代码通过执行while(!www.isDone)来阻止主线程,并等待直到5%被下载。
这可能会对您的帧速率产生非常不利的影响。主线程也是UI /渲染线程。使用这种方法,主线程依赖于一组外部资源(互联网连接,信号强度,带宽,服务器可用性,服务器上传速度等)。如果WWW线程的优先级较低,则WWW线程执行效率下降。如果WWW线程是高优先级,那么这可能没问题或加快下载速度,但代价是主线程执行效率下降。WWW线程的优先级越高,您的帧速率就越大,因为该线程花费的时间越多。

下载速度缓慢有很多原因。确认它不是外部来源。比较WiFi与Cellular的下载速度。连接到本地服务器以进行下载。确保在测试期间设备下载中没有任何后台服务。尝试使用像Charles或Fiddler这样的Web代理来观察或限制下载速度。代理还可以显示该设备上发生的所有活动。

 

最终解决:

最后还是采用WebClient类来解决这个问题,需要注意的是必须将代理服务器设置为空,否则仍旧很慢!

this.Proxy = GlobalProxySelection.GetEmptyWebProxy ();

 

资源:
http://docs.unity3d.com/ScriptReference/WWW.html
http://docs.unity3d.com/ScriptReference/WWW-threadPriority.html
http://docs.unity3d.com/ScriptReference/Coroutine.html
http://www.charlesproxy.com
http://www.telerik.com/fiddler


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。