2013-11-03 43 views
6

, Araçlar objc_object::sidetable_release(bool) ve objc_object:sidetable_retain() olacak zaman parçacık işleme döngüsünde zaman işlemci zaman% 14 bir toplam gösteriyor. Bunu azaltabilir bir yolu olup olmadığını merak ediyorum 5.Optimizasyon: sidetable_release() ve sidetable_retain() nedir? Benim OpenGL döngüsünde

döngü iPhone'da CPU% 100 kullanarak Bunun nedeni, önemlidir. Bunun nedenini bilmiyorum ve bunların çoğunu yöntemlerimde göremiyorum. Bir dizi nesnenin hızlı sayımını yapmakla ilgili olduklarını düşünüyorum. İşte

gibi kusurlu yöntemi görünür: Ben denemek ve psişik burada hata ayıklama edeceğiz

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

    } 
} 

cevap

6

- Sen ARC etkin olmalı)

1) ara değişkenlerin bazıları ifadelerinizdeki (ex. data.sprite, self.settings) Objective-C bu ara nesnelerin

3) bir veya daha fazla nesneleri vardır zayıf ya atom olan (veya her ikisi de erişildiğinde ekstra tutma/bırakma işlemine ihtiyaç duyan zayıf veya atomik özelliklere erişme). - IIRC atom özellikleri yan masa rigamarole, sadece normal autoreleasing ama bu konuda hiçbir garanti dahil olmayacaktır.

Bazı/numaralandırma önce (yığın) yerel değişkene bütün bu referanslar atama deneyin ve döngü içinde münhasıran yerel referanslar kullanmak. Bu, döngüden bazı erişim zamanını tıraş etmenin ek avantajına sahip olacaktır.

Bu referansların, zamanın% 100'ünün tüm sayımıyla güçlü bir şekilde referans olarak kalacağını biliyorsanız, o zaman bu yöntemde herhangi bir ARC shenanigansının meydana gelmesini (çoğunlukla) engelleyecek olan yerel değişkenler üzerindeki __unsafe_unretained belirticisini kullanabilirsiniz. .

+0

burada benim için kolay çözüm sadece kategoride tüm yöntemi taşımak ve -fno-objc-yay ile ARC devre dışı etmekti. – arsenius