cocos creator1.4.2版本 getTiledAt方法在每帧调用时会导致掉帧请问为什么

最低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++接口的,单个高频率调用效率很低的。你最好在操作到了需要变动的时候再去调。另外可以写一个接口批量读出来。我目前就是这样做的。