WebGL内存和性能优化

发表于2017-10-25
评论0 9.7k浏览

WebGL内存和性能优化

1WebGL应用程序分配多少堆空间

减少堆的大小可以减少浏览器无法为WebGL内容分配足够的内存的情况,但是你如何知道要设置的内容?可以通过一个简单的JavaScript代码片段获得你的应用程序使用的内存量,代码如下(可以复制到浏览器控制台调试):

setInterval(function() {

  if (typeof TOTAL_MEMORY !== 'undefined') {

    try {

      var totalMem = TOTAL_MEMORY/1024.0/1024.0;

      var usedMem = (TOTAL_STACK (STATICTOP - STATIC_BASE)

                    (DYNAMICTOP - DYNAMIC_BASE))/1024.0/1024.0;

      console.log('Memory stats - used: ' Math.ceil(usedMem) 'M'

                  ' free: ' Math.floor(totalMem - usedMem) 'M');

    } catch(e) {}

  }

}, 5000);

代码每5秒输出一次使用和可用的内存到控制台。通过这个简单的代码,可以了解如何调整堆大小,你可以在玩游戏时观查输出数字,获得你的应用内存使用量的最大值。

 

2)出现性能问题的另一个意想不到的来源是加载资产包引起的。对于低于5.5Unity版本,默认情况下使用LZMA压缩资产包。WebGL上解析LZMA资产包会引起非常明显的卡顿。这些卡顿不仅让游戏运行得很糟糕,而且还会带来可怕的“内容没有响应”的对话框。幸运的是,Unity 5.3或者更高版本支持更快的LZ4格式的资产包,我们可以相对容易地解决这个问题。

如下C#代码使WebGL强制使用LZ4压缩:

BuildAssetBundleOptions options = (buildTarget == BuildTarget.WebGL) ?

                                  BuildAssetBundleOptions.ChunkBasedCompression :

                                  BuildAssetBundleOptions.None;

BuildPipeline.BuildAssetBundles(bundlePath, buildMap,  options, buildTarget);

 

3Unity团队经常为Unity版本发布补丁。及时关注他们的动态,看看是否有任何与WebGL相关的更改,可能会解决我们遇到的问题。如果升级不是一个好的选择的话,可以使用以下构建设置在较低版本上减少程序占用的空间:

PlayerSettings.SetPropertyString("emscriptenArgs",

                                 " -s MEMFS_APPEND_TO_TYPED_ARRAYS=1",

                                 BuildTargetGroup.WebGL);

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引