最低20帧以下
getTileAt 会创建一个新的节点出来,本来只是纯数据,所以如果你取得多了,创建对象的开销就导致掉帧了
谢谢panda回复,我初始化时把所有tile都先创建好,再在每帧对tile进行修改颜色或更换SpriteFrame操作,发现以横屏为例,延y轴操作6个tile会导致掉帧,延x轴操作5个会导致掉帧,基本在30帧以下,请问是什么原因?
发一些示例代码来看看
onLoad: function() {
let map = this.getComponent(cc.TiledMap)
if (map) {
cc.log('get map')
this.ground = map.getLayer('ground')
if (this.ground) {
cc.log('get ground')
for (let i = 0; i < 100; i++) {
for (let j = 0; j < 100; j++) {
this.ground.getTileAt(cc.v2(i, j))
}
}
}
}
this.tileX = 0, this.tileY = 0
this.maxX = 1 //Math.floor(cc.winSize.width / 32)
this.maxY = 6 //Math.floor(cc.winSize.height / 32)
this.scheduleOnce(() => {
cc.log('init finished')
this.inited = true
}, 0)
},
update: function(dt) {
if (!this.inited) return
if (this.tileY >= this.maxY) {
this.tileY = 0
this.tileX += 1
}
if (this.tileX >= this.maxX) {
return
}
//改帧
this.ground.setTileGID(2, cc.v2(this.tileX, 99 - this.tileY))
this.tileY++
},
你如果不做 update 的内容帧率是多少?你在 onLoad 中把所有 tile 都取出其实消耗是很高的,本来 tile 都是以数据形式存储在 tilemap 中的,取出之后,他们就是一个节点,节点本身的开销和内存占用都高很多,十分不建议这么使用
不做update是60帧
setTileGID getTileGID这个如果在jsb下是调用c++接口的,单个高频率调用效率很低的。你最好在操作到了需要变动的时候再去调。另外可以写一个接口批量读出来。我目前就是这样做的。
