2013-11-03 6 views
6

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); 

    } 
} 

Antwort

6

Ich werde versuchen und seelisch debuggen hier -

1) Sie haben ARC

aktiviert

2) Einige der Zwischenvariablen in Ihren Ausdrücken (z. B. data.sprite, self.settings) sind Objective-C-Objekte

3) Eines oder mehrere dieser Zwischenobjekte sind schwach oder atomar (oder sind die selbst auf schwache oder atomare Eigenschaften zugreifen), die bei Zugriffen eine zusätzliche Retain/Release-Behandlung erfordern. - IIRC atomaren Eigenschaften werden nicht die Beistelltisch Rigamarole, nur normal Autoreleasing, aber keine Garantien dafür.

Ich würde versuchen, einige/alle dieser Verweise auf eine lokale (auf dem Stapel) Variable vor der Aufzählung zuweisen, und innerhalb Ihrer Schleife verwenden Sie ausschließlich die lokalen Referenzen. Dies hat den zusätzlichen Vorteil, dass Sie die Accessor-Zeit aus Ihrer Schleife entfernen.

Wenn Sie wissen, dass diese Referenzen 100% der Zeit durch die gesamte Enumeration stark referenziert werden, können Sie den __unsafe_unretaited-Spezifizierer für Ihre lokalen Variablen verwenden, was (meistens) ARC-Shenanigans in dieser Methode verhindert .

+0

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