
第一个问题,这个游戏的性能,在ios中和Android中性能差距为什么这么大,ios的高端机感觉都不如Android低端机,是不是ios微信小游戏的js运行性能有问题,应该怎么解决呢?
第二个问题是关于ui上sprite动画的,自己接的广告给了很多序列帧动画,所以自己分割成很多个spriteframe,这样的广告有很多个同时在页面上的时候,也有性能问题。写成uv动画会不会有帮助,相比很多个spriteFrame哪个好?

第一个问题,这个游戏的性能,在ios中和Android中性能差距为什么这么大,ios的高端机感觉都不如Android低端机,是不是ios微信小游戏的js运行性能有问题,应该怎么解决呢?
第二个问题是关于ui上sprite动画的,自己接的广告给了很多序列帧动画,所以自己分割成很多个spriteframe,这样的广告有很多个同时在页面上的时候,也有性能问题。写成uv动画会不会有帮助,相比很多个spriteFrame哪个好?
不只是3d,微信在ios上的性能一直都很差。cocos打包空项目,体验版测试,隔天看微信的性能检测,发现内存已经达到了350M
而安卓只有200M。一个中型项目做出来,安卓就400M出头,ios已经逼近600M了
第二个问题忽略,我刚刚发现SpriteFrame里面有rect这个属性,不用切很多个spriteFrame,
还是有问题,为什么rect设置之后,有时不会重新渲染,代码如下
start函数里面,怎么设置rect都能生效,在update里面,怎么设置都不会重新渲染
private count:number = 1
private arr = [v2(0,0),v2(160,0),v2(320,0),
v2(0,160),v2(160,160),v2(320,160),
v2(0,320),v2(160,320),v2(320,320),
]
private indx:number = 2
private spc:SpriteComponent
start () {
// Your initialization goes here.
this.spc = this.node.getComponent(SpriteComponent)
let self = this
cc.loader.loadRes("ttt/spriteFrame", SpriteFrame, function (err, sFrame) {
if (err) {
console.log('err:', err);
return;
}
self.spc.spriteFrame = sFrame
self.spc.spriteFrame.rect = new Rect(self.arr[self.indx].x,self.arr[self.indx].y,160,160)
self.spc.spriteFrame.rect = new Rect(0,0,160,160)
});
}
update (deltaTime: number) {
if(this.count++ > 10){
this.spc.spriteFrame.rect = new Rect(this.arr[this.indx].x,this.arr[this.indx].y,160,160)
this.spc.markForUpdateRenderData()
console.log(this.spc.spriteFrame)
this.count = 0;
this.indx++
if(this.indx == 9){
this.indx = 0
}
}
}
看了底层之后,把这个_applySpriteFrame函数hack到cc.d.ts中,才可以实现rect改变序列帧
感觉这不是个办法,希望可以修复 @
this.spc.spriteFrame.rect = new Rect(this.arr[this.indx].x,this.arr[this.indx].y,160,160)
// this.spc.spriteFrame._calculateUV()
this.spc.markForUpdateRenderData(false)
this.spc._applySpriteFrame(null)
有什么好的方案吗 帮帮ios那边吗 
赋值spriteFrame时也会调用_applySpriteFrame方法的吧,所以应该先设置rect,然后再赋值spriteFrame,不然调用两次_applySpriteFrame,耗性能。另外没搞过ios 3D,所以
试过也没用,,可能因为是同一个spriteFrame,底层代码中,赋值同一个spriteFrame就会reuturn掉,后面没执行
另外设置spriteFrame就是执行这两行代码,,我并没有赋值spriteFrame,而是直接调用这两行
ios js 无jit
如果是一直同一个spriteFrame,赋值时确实会被return。
写起来有点麻烦,做序列帧动画的话,一是可以直接修改 spriteframe 的 uv,然后调用 spritecomponent 的 updateRenderData(true),更新 renderdata.uvDirty = true 来实现,只是在做这个的时候,会多一次顶点的计算,二是把 spritecomponent 的 _markForUpdateUvDirty 开放出来