В моем цикле OpenGL инструменты показывают в общей сложности 14% моего процессорного времени в моем цикле обработки частиц, идущем на objc_object::sidetable_release(bool)
и objc_object:sidetable_retain()
. Это важно, потому что цикл использует 100% процессора на iPhone 5.Оптимизация: что такое sidetable_release() и sidetable_retain()?
Мне интересно, есть ли способ уменьшить это. Я не знаю, что вызывает его, и я не вижу их в очень многих моих методах. Я думаю, что они связаны с быстрым перечислением массива объектов.
Вот что метод обижая выглядит следующим образом:
-(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);
}
}
Простым решением для меня было просто переместить весь метод в категорию и отключить ARC с -fno-objc-arc. – arsenius