2011-07-18 59 views
0

我正在尋找創建CGImageRef緩衝區的方法,並將其用於不同的圖像。對不同的圖像使用相同的CGImageRef緩衝區?

我的應用程序正在面臨性能問題,因爲它會創建一個圖像,然後在上下文中繪製它。這個過程在一個定時器中,每1ms觸發一次。我想知道是否有什麼我可以做,以避免呼籲 CGBitmapContextCreateImage(bitmapcontext);在每一個滴答。

感謝

回答

1

有一種方法理論上可以做到這一點:

  1. 創建一個NSMutableData或CFMutableData。
  2. 使用它的mutableBytes/MutableBytePtr作爲位圖上下文的後備緩衝區。
  3. Create a CGDataProvider with the data object.
  4. Create a CGImage with that data provider,確保使用您創建位圖上下文時使用的所有相同參數值。

但是,我不確定這是保證工作。更具體地說,我認爲CGImage不保證不復制,緩存和重用數據提供者提供的任何數據。如果有的話,你會發現你的應用顯示一個陳舊的圖像(甚至是一個部分陳舊的圖像)。

你可能會更好的只是堅持CGImage(s)。如果您基於某些輸入生成圖像,請考慮您是否可以通過該輸入緩存結果圖像 - 例如,如果您在上下文中繪製了一兩個數字,請考慮在字典中緩存CGImages或鍵入NSCache由數字(s)串組成。當然,這是多麼可行取決於圖像的大小以及內存的有限性。如果這是在iOS上,您可能會很快從該緩存中刪除項目。

此外,每1ms執行一次任何操作都不會對用戶可見。如果您的意思是向用戶展示這些圖像,則無法每秒處理1000次,即使您可以在應用程序中執行此操作,用戶也無法快速查看。從Snow Leopard開始(我認爲自Tiger以來,如果不是早些時候),Mac OS X將繪圖限制爲每秒60幀;我認爲這在iOS上也是如此。你應該在一個合理的間隔內做什麼 - 1/60秒是很合理的 - 被設置爲需要顯示的視圖,並且只有當視圖被告知繪製時,你才應該做這個繪圖/圖像生成。

+0

哎喲,LCD面板刷新速度不會超過每秒60次 - 所以即使操作系統允許它,你*仍然*將無法看到它。 –

+0

@Jonathan Grynspan:這取決於液晶顯示器,但是:是的,即使最快的電視也只能達到240赫茲,這還不到提問者試圖做的四分之一。 –

+0

啊,但這些*只接受50Hz或60Hz的信號。*繪製的額外幀是從源數據中插入的。它們仍然只能顯示最多60 Hz的源數據。 –

相關問題