2013-02-25 69 views
10

我們正在開發一個遊戲,在OpenGL ES視圖(具體而言,我們使用的是GLKit的GLKView)上顯示帶有UIViews的2D元素,並且在保持位置完全同步時出現問題。將UIView佈局同步到OpenGL幀

在父視圖的layoutSubviews中,我們將世界上的三維位置投影到屏幕上,並將這些位置作爲遊戲中幾個UIView「標記」的位置。整個遊戲只會響應用戶移動相機而更新,並且相機會在每次移動時通知setNeedsLayout

Everthing的工作正常,除了標記似乎大致1幀與3d渲染不同步。我粗略地說,因爲(1)這是一個估計! (2)我想知道是否有潛在的多線程問題:不是GLKView同步到一個特殊的屏幕刷新回調或什麼?

是否有某種方法掛鉤視圖的layoutSubviews,以便它同步到3d視圖更新?

更新:古怪,setNeedsLayout後立即調用layoutIfNeeded使問題更糟糕!可能有2個或更多的幀。真的不明白!

回答

0

什麼觸發了您對LayoutSubviews的調用?

這一切都取決於您的呼叫觸發的RunLoop與觸發GLK更新呼叫的位置。

在一般情況下,你在做什麼,我的目標是盡你的佈局爲GLK更新的副作用 - 即不等待layoutSubviews改變你的位置。 (如果你使用的是OpenGL,那麼整個「佈局」系統對你來說沒有多大用處:GLK運行在它自己的可變幀速率的小世界中,並且你想讓它成爲你的參考點)

0

這是不可能正確地做無圖紙使用OpenGL的視頻(在相同的情況下繪製,讓您始終確保一個幀包含視頻和動畫的同時)的幀。你所做的每一件事,幀速率補償,滯後預測,只取決於機會,並且總會有點不同步。

我對UIView不熟悉,但是如果有任何方法讓它播放音頻並將幀複製到紋理,請執行此操作。音頻中的滯後要比在視頻中更容易補償,而且人們更不容易察覺。