2012-02-07 59 views
0

我正在研究一個應用程序,它根據通過網絡接收到的信息在屏幕上執行一些繪圖。 我的問題是,有時候這些事件的速度比我能畫的還要高,而且我正在經歷一個延遲。現在的問題不在於延遲時間與延遲的類型有關。 如果我會根據事件進行繪圖,例如用鼠標點擊並拖動,這不會發生,我認爲這是因爲事件傳遞的方式。我怎麼才能知道什麼時候該視圖「準備好」再次繪製,因爲那樣我就可以丟棄通過網絡接收到的一些事件並繪製最近的事件。可可繪圖問題

現在我有一個窗口層次結構「頂部」的透明窗口。 在每次繪圖操作之後,我都在屏幕大小的NSImage上繪圖,我對繪圖發生的視圖做了setneedsdisplayinrect()調用。當我收到正確的呼叫時,我畫出包含在髒矩形中的圖像部分。 我解決這個問題的嘗試有點破解,因爲我不知道另一種方法來解決這個問題。在每個setneedsdisplayindexrect後,我將布爾值設置爲true,並將其設置爲false。如果我得到一個後續事件來繪製圖像,我忽略它的布爾值設置爲true。

我還有其他的做法嗎?

我想過使用cashapelayers並修改它們的路徑,但我不確定一旦路徑變大時效果圖層的效率如何。我還想過爲分隔的路徑的不同部分使用多個形狀圖層(不連續),但是如果我想清除圖形,並且如果有很多圖層我會刪除這些圖層,那麼我會注意到一些性能問題。 我能想到的唯一的另一種方式是用開放的gl進行繪製,但考慮到OpenGL視圖的本質(屏幕大小和透明度),我不確定這會帶來多大的性能問題。

任何提示將不勝感激。

謝謝。

回答

0

我想通了:)

從該管理的網絡連接,我將事件發送出使用主調度隊列的對象。根據我的理解 - 我可能錯了 - 可以跨越runloop的多次迭代。我需要的是在運行循環的每次迭代過程中分派事件,並創建一個自定義運行循環源,這個循環源將在每次通過網絡連接獲得新事件時向主循環發送信號,這大大提高了我的性能。