Trong vòng OpenGL của tôi, Công cụ hiển thị tổng cộng 14% thời gian xử lý của tôi trong vòng xử lý hạt của tôi sẽ là objc_object::sidetable_release(bool)
và objc_object:sidetable_retain()
. Điều này là quan trọng, bởi vì vòng lặp đang sử dụng 100% của một CPU trên iPhone 5.Tối ưu hóa: sidetable_release() và sidetable_retain() là gì?
Tôi tự hỏi liệu có cách nào tôi có thể làm giảm điều này không. Tôi không biết nguyên nhân gây ra nó, và tôi không thấy điều này trong rất nhiều phương pháp của tôi. Tôi nghĩ rằng chúng có liên quan đến việc đếm nhanh một mảng các đối tượng.
Dưới đây là những gì các phương pháp vi phạm trông giống như:
-(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);
}
}
Giải pháp dễ dàng cho tôi ở đây là chỉ di chuyển toàn bộ phương thức vào một danh mục và vô hiệu hóa ARC bằng -fno-objc-arc. – arsenius