一个大bug,tilemap在安卓web下疑似内存溢出

一开始我的项目用安卓手机web和iosweb和desktop web做测试,不知道是不是因为今天刚更了1.1.0的问题,安卓web会卡死而其他平台的不会,排查后发现是tilemap的问题,为了让问题更简洁明了,我建了个测试工程,里面什么都没有,就几段有问题的代码而已。

这图是这个测试工程所有的东西和代码:

这个是工程图:

这个是3个平台的溢出log(只有安卓的溢出,其他俩正常):

第一个是安卓的,第二个是ios的,第三个是桌面的

这个问题查了好久。。。

显示似乎也有问题,在creator里,tilemap都是一片土黄色

请问你使用的 Creator 是否为 1.1 rc1 版本?在这个版本之前,是有可能 tilemap 显示异常。如果你是在 1.1 rc1 以及之后的版本中遇到此问题,麻烦你提供一下测试工程或者资源。我重现一下问题并尽快解决。谢谢反馈!

@hellengoodd
能不能麻烦你把测试工程发出来我测试一下呢?

PS:
请教一下,你列出的溢出 log 数据是怎么获取到的啊?

好吧…我刚刚仔细看了一下你截图中的代码。知道你的 log 数据怎么获取的了。我这边尝试一下看看能不能重现。

另外,请问一下,你的 android web 是在模拟器测试还是真机测试?

昨天自动更新的版本。你们提供的tilemap的范例就是这个样子。运行没问题,但是在creator里显示就是这个样子

麻烦看一下当前的 Creator 版本。另外,自动更新之后是否有重启 Creator?

真机和模拟器都试过,真机出现了我怀疑是不是机型的问题我才用的模拟器,海马的模拟器,这个很好重现的,唯一的代码test.js我已经贴出来了,挂在havetile节点上就行,havetile就是有80个tile的图层而已,for循环已经超过80次了因为溢出还继续循环

昨天那个工程我已经删了,再弄个吧,这个是工程:
TestProject.rar (123.9 KB)

我刚刚测试了一下,这个问题跟浏览器有关。发现在 搜狗浏览器能重现你遇到的问题。但是试了其他几个浏览器(Chrome,QQ浏览器,百度浏览器,UC浏览器,猎豹浏览器,遨游云浏览器)都没有遇到这个问题。

建议更换遍历数组的方式,使用这样的方式遍历:

for (var i = 0; i < tiles.length; i++) {
    ....
}

更进一步的测试发现,如果用 for (var i in arrayData) 进行遍历,而 arrayData 是一个 [] 数组的话,并没有问题(搜狗浏览器也没有问题)。

经过排查发现这个问题跟浏览器中 window.Uint32Array 类的实现有关。因为当 TiledLayer 数据格式为 base64(zlib) 时,TiledMap 解析逻辑中使用了 window.Uint32Array 对象来存储 tiles 数据。这时使用 for (var i in tiles) 的方式遍历就可能出现问题。

而使用 window.Uint32Array[] 的性能会更高。所以还是建议更换遍历数组的方式。

是用电脑测的吗,我用电脑的搜狗高速浏览器还是没问题啊:

但是手机的UC还是有问题,模拟器的UC和真机的UC都有问题,模拟器自带浏览器也是这样

版本的话就是6月1号发的1.1.0。我两台电脑试过都是这情况。新添加的tilemap显示没问题,但是保存重新启动Creator后又会变成这样。你们不妨打开范例的Puzzle场景看看。
又测试了一下,第一次打开这个场景就会这样,再双击一遍场景就显示正常了。

我在桌面版测是没有遇到问题。前面提到的测试结果是在 android 机器上测试的。

不管怎么样,你换遍历方式试试吧。我只能说用 for ... in ... 遍历 tiles 有风险。

恩,好的,遍历方法试了没问题了:clap:

@Neveis
我在 Windows 版本上重现了你描述的问题(在浏览器和模拟器预览都没问题),我会尽快解决的。对此带来的不便请谅解。 谢谢你的反馈!

1赞