我一直在尝试使用Chromecast(2013和2015型号)来尝试运行一款小型Unity3D游戏。基本上,在屏幕上显示4个精灵。游戏使用Emscripten在后端编译(使用Unity的工具)到WebGL。
我遇到的一个问题与Javascript文件的大小有关。在这种情况下,Empscripten生成一个大约24MB的Javascript文件。 Chromecast始终以多种方式之一崩溃。屏幕可能会闪烁,它可能会冻结所有黑色或全部白色/灰色,或者可能会导致大脑冻结屏幕。在某些情况下,它最终会重新启动,而在其他情况下,它会冻结直到电源循环。
为了测试理论,我生成了几种大小的Javascript文件,并通过远程调试器手动加载它们。生成的文件会创建一系列变量,每个变量都会从先前变量中加1,以便创建大文件。我无法确定精确的尺寸,但是介于40,000到50,000行之间会导致Chromecast崩溃。当我可以获得成功的堆快照时,它表示大小约为8MB。有时它在拍摄堆的快照之前不会崩溃。
以下用于生成各种大小的javascript文件:
python -c 'numi = 41400; print("a1 = 1"); print("\n".join(["a{0} = a{1}
+ 1".format(i+1,i) for i in range(1,numi)]));
print("document.write(a{0});".format(numi));' > l41400.js
我尝试了一些基于Emscripten的小应用程序,效果很好。使用大型Javascript文件的应用程序会产生与Unity游戏相同的行为。
从调试器控制台调用location.reload()会重新加载页面而不释放内存。重复调用它最终会导致与大型Javascript文件相同的症状。即 - 它会闪烁,冻结或重启。
对于新的ArrayBuffer,似乎还有64MB的大小限制,但至少尝试使用更大的缓冲区在异常中重新启动而不是崩溃。
过去,Emscripten有一个--split或--js-split选项可以将Javascript分割为多个文件。这已被弃用,不再是一种选择。对于更大的Javascript文件,我不确定该解决方案是否可行。
我想知道是否有其他人看过这个问题,如果这是一个已知问题,是否有人解决了Javascript文件大小问题?