Unity使用Async/Await下载纹理构建后速度远慢于编辑器,求原因及对应构建选项
问题原因
- 核心原因是异步await操作的同步上下文调度开销:编辑器运行时的同步上下文调度效率更高,而构建后的应用默认会在每次await完成后切回原始同步上下文(通常是UI主线程),频繁的线程上下文切换拖慢了整体下载速度
- 构建配置的优化开关未开启:Debug模式下异步状态机的编译未做性能优化,额外的调试诊断逻辑也会降低异步操作的执行效率
- 代码未禁用上下文捕获:所有await操作默认都会捕获当前同步上下文,每次
ReadAsync完成后都需要排队等待主线程调度,大量小的IO操作叠加之后就会出现数倍的速度差距
解决方案
1. 代码层面修改(优先级最高)
所有异步await操作后添加ConfigureAwait(false),禁用同步上下文捕获,异步完成后直接在线程池线程执行后续逻辑,避免不必要的上下文切换:
HttpWebRequest request = WebRequest.CreateHttp(PATH); WebResponse response = await request.GetResponseAsync().ConfigureAwait(false); Stream stream = response.GetResponseStream(); byte[] data = new byte[response.ContentLength]; int bytesRead = 0, count = (int)response.ContentLength; while (bytesRead < count) { int read = await stream.ReadAsync(data, bytesRead, count - bytesRead).ConfigureAwait(false); if (read <= 0) continue; bytesRead += read; }
如果是在Task.Factory.StartNew中调用异步逻辑,指定使用线程池调度器TaskScheduler.Default,避免和主线程调度绑定。
2. 构建选项调整
- 切换构建配置为Release模式,关闭脚本调试、诊断工具等调试相关选项
- 对于Unity项目:选择.NET 4.x及以上的脚本运行时版本,IL2CPP构建时开启「优化速度」编译选项,关闭「开发构建」开关
- 对于普通.NET桌面项目:在项目属性的生成选项中开启「优化代码」,发布时排除调试符号文件
3. 可选优化
给网络流套一层BufferedStream,设置缓冲区大小为32KB/64KB,减少底层IO调用次数,进一步提升读取效率。
效果验证
修改后构建的程序异步下载速度可以达到和同步模式一致的水平,不会再出现数倍的速度差距。
内容的提问来源于stack exchange,提问作者Marcel Lorenz
相关产品推荐
相关产品推荐

