2013-08-05 57 views
3

我有一個RGBA malloc編輯數據的原始位圖圖像;行顯然是4個字節的倍數。這些數據實際上源於AVI(24位BGR格式),但我將它轉換爲32位ARGB。每幀大約有8mb的32位數據(1920x1080)。有效的可可動畫w /原始位圖數據

對於每一幀:

  • 我該幀的數據轉換成NSData對象經由NSData:initWithBytes:length
  • 然後,我通過CIImage:imageWithBitmapData:bytesPerRow:size:format:colorSpace將其轉換爲CIImage對象。
  • 從那CIImage,我使用NSOpenGLView:drawImage:inRect:fromRect將它繪製到我的最終NSOpenGLView上下文中。由於目標圖像具有「馬賽克」特性,因此有大約15至20個來自各種源/目標Rects的調用。

使用30Hz的NSTimer,關於NSOpenGLView呼籲[self setNeedsDisplay:YES],我可以達到在2012 MacMini/2.6GHz的/ i7的約20-25fps - 這不是在30Hz堅如磐石。這是預期與NSTimer而不是CVDisplayLink

但是......現在忽略NSTimer問題,有沒有關於使這種逐幀渲染更高效一些的建議/指針?

謝謝!

注意:我想繼續使用CIImage對象,因爲我想在某些時候訪問過渡效果。

回答

1

每幀,調用NSDatainitWithBytes:length:會導致一個8MB的內存分配&一個8MB的副本。

您可以通過使用一個持久NSMutableData對象(在開始設置一次)更換NSData對象,並使用其mutableBytes作爲幀的24至32目標緩衝區擺脫這種每幀分配/副本位轉換。

(或者,如果你喜歡自己管理的目的地緩衝存儲器,離開對象作爲NSData類,但與initWithBytesNoCopy:length:freeWhenDone: &通NO作爲最後一個參數進行初始化。)

+0

更新:產生我的原代碼一幀約19.3ms。使用NSMutableData對象花了16.6ms。使用NSData:initWithBytesNoCopy花了14.6ms。所以...大約減少25%的運行時間。偉大的提示!謝謝。 – zzyzy