2013-11-03 3 views
6

В моем цикле 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); 

    } 
} 

ответ

6

Попробую и психическом отладки здесь -

1) У вас есть ARC включен

2) Некоторые из промежуточных переменных в ваших выражениях (например, data.sprite, self.settings) являются объектами Objective-C

3) Один или несколько из этих промежуточных объектов являются слабыми или атомарными (или являются которые получают доступ к слабым или атомным свойствам), которые требуют дополнительной обработки при хранении/освобождении при доступе. - Атомные свойства IIRC не будут включать в себя rigamarole стола, просто нормальный авторезистор, но никаких гарантий на это.

Я бы попытался присвоить некоторые/все эти ссылки локальной (в стеке) переменной перед перечислением, а внутри вашего цикла использовать только локальные ссылки. Это будет иметь дополнительное преимущество, избавляя от некоторого времени доступа от вашего цикла.

Если вы знаете, что эти ссылки будут по-прежнему сильно ссылаться на всю перечисление в 100% случаев, то вы можете использовать спецификатор __unsafe_unretained для своих локальных переменных, что (в основном) предотвратит появление каких-либо атак из ARC в этом методе ,

+0

Простым решением для меня было просто переместить весь метод в категорию и отключить ARC с -fno-objc-arc. – arsenius

Смежные вопросы