[iphone] iOS遊戲和運行循環管理



Answers

Question

首先,我的問題是:你如何管理你的iOS Run-Loop?

接下來我的理由是:我一直在研究各種原型(v。早期開發),並發現了許多令人困惑的問題。

  • 首先,輸入問題和運行循環使我嘗試以下方法:
    • 當使用最推薦的系統(CADisplayLink)時,我注意到一旦CPU負載導致緩衝區翻轉(presentRenderBuffer)必須等待一幀,某些觸摸輸入就會被丟棄。 這只發生在設備而不是模擬器中(令人討厭 - 這似乎與等待主線程上的vsync阻塞以及應用程序運行循環過程觸摸輸入和吃消息的方式有關)
    • 當使用下一個最推薦的系統(NSTimer)時,我注意到一旦CPU負載達到模擬器中的某個點而不是設備中的某個點(也令人討厭),某些觸摸輸入就會被丟棄。 NSTimer在我的更新發佈時也會導致精度降低
    • 當使用推薦最少的系統(在內部使用由mach_absolute_time構建的高精度定時器管理自己的線程中運行運行循環時,我的所有觸摸輸入問題都會消失,但是我的ASSERT代碼現在陷入了錯誤的線程,只有當我睡著了跟隨軟件中斷。(我的斷言代碼類似於http://iphone.m20.nl/wp/?p=1 )我真的很喜歡我的斷言代碼陷阱導致問題,所以這個解決方案是對我來說不太適合:更難調試。
  • 第二,失去的時間:
    • 在調查系統時,我發現無論幀速率如何(奇怪的是,但我認為統計上它仍然有意義w / vsync)我在vsync上等待大約22%的時間。 我已經通過移動glFlush / glFinish並通過玩我多久經常進行presentRenderBuffer調用來證實這一點。 這是我喜歡處理AI等關鍵時刻,而不是簡單地停止阻塞gl調用。 我能想到的唯一方法就是將渲染轉移到它自己的線程中,但我不確定是否有理由開始在單處理器設備上重新構建多線程。

那麼有沒有人圍繞這些問題找到靈感? 有沒有人在這個平台上有一個殺手運行循環架構? 目前看起來我必須選擇較少的邪惡。




Related