2011-05-21 60 views
2

我正在製作一款遊戲,並且我使用CAEAGLLayer支持的UIView子類來呈現遊戲引擎。觸摸處理使用-touchesBegan:withEvent: et。人。爲什麼我的iPad觸摸事件被延遲(有時達到一秒)?

一切工作正常,除非很少,如果其中一個屏幕控件快速輕敲,-touchesBegan:withEvent:不會被調用的某個地方在0.1和1-2秒之間。這種情況可能發生在20次之內,並且只有在您首先快速點擊屏幕(4-5次)時纔會發生。如果我還在屏幕上的另一個控件上按住另一個手指,似乎更有可能發生這種情況。

認爲這是我自己的代碼,我分類UIApplication,所以我可以添加一個日誌語句-sendEvent:。當觸碰發生時,-sendEvent:在觸摸開始後的某段時間纔會被調用,所以它在我的UIView子類中的觸摸處理代碼似乎沒有錯。

有沒有人有任何想法這裏發生了什麼(除了iOS有一些晦澀的bug)?是否有某種內部的「事件隊列」讓事件傳遞在填滿時變得遲緩?有沒有其他人經歷過這個?

+0

您是否在這些附近使用了'UIGestureRecognizers'?或者只是原始的'touchesBegan:withEvent:'等等?當我要求手勢識別器在發射前失敗時,我也一樣。 – 2011-05-21 10:24:15

+0

我沒有使用或添加任何'UIGestureRecognizer's,它都是'-touchesBegan:withEvent:'。 '[UIApplication sendEvent:]'本身被延遲了,這比我的觸摸處理代碼要低得多。看起來像更基本的事情是導致這個問題。 – 2011-05-21 10:27:38

+1

觸摸事件可以通過阻塞主線程的任何方法來延遲;您可以分析並確定您沒有對主要進行密集操作嗎?如果觸摸事件時間是非常重要的,那麼我建議只做主要的UI繪圖。 – 2011-05-21 12:18:47

回答

1

觸摸事件僅在主UI運行循環中分派,有時僅在主運行循環閒置一段時才分配。因此,如果您的應用程序忙於在一行中處理多個先前的觸摸事件而不中斷,則主UI界面運行循環可能已飽和,因此在用當前的東西完成之前不會進行任何進一步的觸摸事件。

觸摸事件也有時間戳。因此,如果您希望應用程序保持最大響應,那麼您可以檢查它們是否來得太快(比事件處理程序更快並且可以運行生成的UI更新),並跳過或合併適用於您的應用程序的某些事件處理程序。