Ten*_*r04 6 optimization objective-c instruments ios
在我的OpenGL循环,仪器是表示我的粒子处理循环去一个总的我的处理器时间的14%objc_object::sidetable_release(bool)和objc_object:sidetable_retain().这很重要,因为循环使用iPhone 5上100%的CPU.
我想知道是否有办法减少这种情况.我不知道是什么导致它,我在很多方法中都没有看到这些.我认为它们与快速枚举对象数组有关.
这是违规方法的样子:
-(void) updateWithTime:(ccTime)dt sceneHeightAboveHorizon:(CGFloat)yMax{
_elapsed = (_elapsed+dt) ;
float farTotalWidth = EQ_SCENE_WIDTH + 2*EQ_SIZE_FAR;
float farHalfWidth = farTotalWidth/2.0;
for (MyParticleData *data in self.farParticleData){
//Calculate position
float newX = data.pos.x + data.xVelocity * dt;
if (newX > 1)
newX -= 1;
float newY = data.y0 + EQ_A_FAR*sin(EQ_F_FAR*_elapsed+data.phasePosition);
data.pos = cc3v(newX,newY,0);
//Apply new position to sprites
data.sprite.position = cc3v(newX*farTotalWidth-farHalfWidth, newY*yMax, 0);
data.reflectedSprite.position = cc3v(data.sprite.position.x,-data.sprite.position.y,0);
//Calculate color
float f = MIN(14, MAX(data.pos.x*14.0, 0));
ccColor4F newColor = cycBlendColors(self.settings.eqColumnColors[(int)f], self.settings.eqColumnColors[(int)f+1], f-(int)f);
float colorAmp = MAX(0, (sin(data.frequencyColor*_elapsed+data.phaseColor)+1)/2.0);
newColor = cycScaleColor(newColor,colorAmp);
colorAmp *= colorAmp;//the alpha (white component) should be squared twice
newColor.a *= colorAmp*colorAmp;
//Apply new color to sprites
data.sprite.color4F = newColor;
data.reflectedSprite.color4F = cycScaleColor(newColor, self.settings.eqReflectionBrightness);
}
}
Run Code Online (Sandbox Code Playgroud)
我会尝试在这里进行精神调试 -
1)您已启用ARC
2)表达式中的一些中间变量(例如data.sprite,self.settings)是Objective-C对象
3)这些中间对象中的一个或多个是弱的或原子的(或者它们本身正在访问弱或原子属性),这两者在访问时都需要额外的保留/释放处理. - IIRC原子属性不会涉及边桌的rigamarole,只是正常的自动释放,但没有保证.
我会尝试在枚举之前将一些/所有这些引用分配给本地(在堆栈上)变量,并且在循环内部仅使用本地引用.这样做还有一些好处,即可以从循环中删除一些访问时间.
如果您知道这些引用将在100%的时间内通过整个枚举保持强引用,那么您可以在本地变量上使用__unsafe_unretained说明符,这将(大多数)阻止在此方法中发生任何ARC诡计.