教程Unity WebGL 内存优化:续篇

Posted 泰斗社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教程Unity WebGL 内存优化:续篇相关的知识,希望对你有一定的参考价值。

既然Unity 是过去式了,确保unity webgl 运行更流畅比以前显得更加重要。当尝试玩WebGL游戏时,用户会遇到内存耗尽的错误,这是我们从开发人员口中得到的重要的一点。对于用32位版本的浏览器的玩家来说这是个特别令人懊恼的问题,因为对于unity堆内存来说,他们不可能有如此大的相近的空闲内存。

这篇文章会给出些提示和技巧来诊断和解决与unity webgl 游戏内存相关的问题。

监控内存使用

当概述和优化unity WebGl 游戏时,追踪多种内存使用很重要。第一个是unity 堆,默认是256兆,可以在发布设置界面“WebGL 内存大小修改。在之前的博客中,我们谈到些对于大块内存优化的技术。重申下,你为unity 堆保存越少的内存,浏览器会有更多内存用于其他的事情比如声音,索引型数据库等。

因为减少unity堆的大小很重要,我们添加一个非常简单的内存统计类(基于uity团队优秀的博客)堆到webgl utilities package,为了帮助开发者跟踪信息及发布它到浏览器控制台。

简单地导入包到你的unity项目,添加“webgl memory stats” 脚本到场景中的GameObject,在浏览器控制台中会产生关于free/total内存记录。 

【教程】Unity WebGL 内存优化:续篇 

值得注意的是Unity/Emscripten提供的数据对于内存的使用一个高水位。当对象被清理掉时,使用/空闲的内存不会改变。但是,测量和调整多少内存分配给unity heap的工具也很重要。你应该用这个工具来追踪记录内存使用的最高量,并在高处添加一个安全网接近最高的16兆。

例子中,当我们要求的是32兆的时候,你可以看到我们的应用对于堆来说要的是一个巨大的256兆。

【教程】Unity WebGL 内存优化:续篇 

资源包&IDBFS:沉默杀手

另一个内存资源相关的问题是被Unity使用的IndexedDB 文件系统。任何时间你缓存一个构建选项或者使用任何相关的文件系统方法,他们被IndexedDB存储在一个虚拟的文件系统中.


你可能没有意识到的是虚拟文件系统从unity应用一开始就存在于内存中,。这意味着如果你用默认的unity缓存机制为构建选项,你添加所有大小的选项到游戏中的内存需求,即使他们没有被导入。


你可以通过用开发者工具中的“Application”标签来追踪谷歌浏览器的内存使用。正如你看到的这个,在缓存中有几个存储,选择一个将近有20兆:

【教程】Unity WebGL 内存优化:续篇 

为了看所有内存消耗的结果,我们可以用谷歌(或者火狐)来应用生命周期期间的各个点的堆快照。为了演示,当应用第一次导入并且没有什么缓存的时候,我们进行第一个快照,然后再一次导入一些大的构建选项,再一次重新打开页面。


你可以看到初次导入之后,我们大约用了230兆内存。构建选项全部导入之后我们用了300兆,重新载入页面(但不是构建选项)我们仍然接近300兆。这不好。

【教程】Unity WebGL 内存优化:续篇 

幸运的是,unity团队中成员提供了插件叫做CachedXMLHttpRequest。当与一个非缓存的UnityWebRequest调用合并时,CachedXMLHttpRequest 使用了一个独立的IndexedDB 缓存来存储下载的文件,在内存中保存不了连续,导致内存使用下降。当用CachedXMLHttpRequest时,我们看下例子。

 

内存使用开始大概是236兆,当构建选项导入并缓存时上升到237兆,然后重载页面时退回到236兆。很神奇,因为我们已经消除掉由IndexedDB虚拟文件系统引起的永久的内存肿胀。


值得注意的是,当使用CachedXMLHttpRequest,因为一批能够被不同的处理,webgl堆使用能够提升,因此你要小心,不要同时导入太多束(不管怎么说是最好的练习)当你做完的时候,总是确保不导入他们。优化构建选项超出了我们文章的范围,但通常而言你想他们尽可能的颗粒感,以至于你不能保持内存中没用到的资源并且避免内存掺入可能因为导入大量的构建选项引起的庞大的资源。

游戏网页Webgl功用包

CachedXMLHttpRequest最初的版本有些小问题:

  1. 火狐隐私浏览模式中一个错误的对话框显示出来

  2. 当在浮动框中使用safari,插件不是功能性的

  3. 同期的XHR请求被用作再利用的资源


我们已经释放一个更新版本作为webgl utilities package的一部分,是顺便走访的一个替换来解析上述的问题,并添加下面的功能性:

  1. 支持异步查询缓存来决定是否存在

  2. 为项目添加配置黑名单,不被缓存及不被验证的项目

  3. 允许从Unity清除缓存


我们尽力使我们的unity webgl 团队把这些特性整合到官方插件中,因为我们已经发现当转变这些项目到CachedXMLHttpRequest时,他们非常必要。

转化为CachedXMLHttpRequest

如果你打算用CachedXMLHttpRequest转化你的项目,你可能想用缓存类中的方法来清除你之前缓存的构建选项或设置使用过的最大的磁盘空间来确保你旧的配置不会占用太多的磁盘空间或内存


如果你准备删除缓存,你需要在你访问构建选项或其他文件前删掉,理论上在游戏主体的awak方法中存在于最初的场景中。我们发现一些版本的unity中CleanCache方法可能不能信赖。这个案例中,你用下面的代码来清除缓存直接用IndexedDB,值得注意的是尽管这样会清除掉整个范围内的缓存。可能会插入到Webgl index.html 或列入统一加载程序前的模板。

(function clearCache()

以上是关于教程Unity WebGL 内存优化:续篇的主要内容,如果未能解决你的问题,请参考以下文章

unity2019怎么设置webgl的发布内存?

unity webgl内存最多多大

深入理解Unity WebGL内存

Unity开发WebGL内存概念详解和遇到的问题

unitywebgl允许http没有响应

unitywebgl发布的特效不正常