2013-11-03 12 views
6

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

    } 
} 

Trả lời

6

tôi sẽ cố gắng và psychically gỡ lỗi ở đây -

1) Bạn có ARC kích hoạt

2) Một số các biến trung gian trong các biểu thức của bạn (ví dụ: data.sprite, self.settings) là các đối tượng Objective-C

3) Một hoặc nhiều đối tượng trung gian này yếu hoặc nguyên tử (hoặc là mselves truy cập các thuộc tính yếu hoặc nguyên tử), cả hai đều yêu cầu xử lý lưu giữ/giải phóng thêm khi được truy cập. - Thuộc tính nguyên tử IIRC sẽ không liên quan đến rigamarole bảng bên, chỉ cần tự động phát hành bình thường, nhưng không đảm bảo về điều đó.

Tôi sẽ thử gán một số/tất cả các tham chiếu này cho biến cục bộ (trên ngăn xếp) trước khi liệt kê và bên trong vòng lặp của bạn chỉ sử dụng tham chiếu cục bộ. Điều này sẽ có thêm lợi ích của cạo bỏ một số thời gian accessor từ vòng lặp của bạn là tốt.

Nếu bạn biết các tham chiếu này sẽ vẫn được tham chiếu mạnh mẽ trong toàn bộ liệt kê 100% thời gian, bạn có thể sử dụng __unsafe_unretained specifier trên các biến cục bộ của bạn, sẽ (chủ yếu) ngăn chặn bất kỳ ARC shenanigans nào xảy ra trong phương pháp này .

+0

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