In meiner OpenGL-Schleife zeigt Instruments insgesamt 14% meiner Prozessorzeit in meiner Partikelverarbeitungsschleife an objc_object::sidetable_release(bool)
und objc_object:sidetable_retain()
. Das ist wichtig, weil die Schleife 100% einer CPU auf einem iPhone 5 verwendet.Optimierung: Was sind sidetable_release() und sideTable_retain()?
Ich frage mich, ob es eine Möglichkeit gibt, die ich reduzieren kann. Ich weiß nicht, was es verursacht, und ich sehe das nicht in sehr vielen meiner Methoden. Ich denke, dass sie mit einer schnellen Aufzählung einer Reihe von Objekten zusammenhängen. Hier
ist das, was die betreffende Methode wie folgt aussieht:
-(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);
}
}
Die einfache Lösung für mich war, die gesamte Methode in eine Kategorie zu verschieben und ARC mit -fno-objc-arc zu deaktivieren. – arsenius