WebGL内存和性能优化
WebGL内存和性能优化
1)WebGL应用程序分配多少堆空间
减少堆的大小可以减少浏览器无法为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.5的Unity版本,默认情况下使用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);
3)Unity团队经常为Unity版本发布补丁。及时关注他们的动态,看看是否有任何与WebGL相关的更改,可能会解决我们遇到的问题。如果升级不是一个好的选择的话,可以使用以下构建设置在较低版本上减少程序占用的空间:
PlayerSettings.SetPropertyString("emscriptenArgs",
" -s MEMFS_APPEND_TO_TYPED_ARRAYS=1",
BuildTargetGroup.WebGL);