2014-01-21 35 views
1

我一直在更新Node.JS FFI到SDL以使用SDL2。 (https://github.com/Freezerburn/node-sdl/tree/sdl2)到目前爲止,它進行得很順利,我可以成功渲染1600多種彩色紋理而沒有太多問題。然而,我剛開始遇到一個我似乎無法弄清楚的問題,似乎與FFI,GC,Javascript的速度等沒有任何關係。SDL2 - RenderPresent隨機抽取20-30 + ms(在Node.JS FFI調用中)

問題是,當我調用SDL_RenderPresent在啓用VSYNC的情況下,偶爾會每隔幾秒鐘完成一次該調用需要20-30或更多的毫秒。它看起來像是連續發生2-3次。這導致在屏幕上移動的任何東西都會有一個非常簡短但明顯的視覺障礙。剩下的時間,這個調用將花費正常的時間來顯示在正確的時間繪製到屏幕上的任何東西,以便與屏幕同步,並且一切看起來都很平滑。

如果您克隆上述存儲庫,則可以看到此操作。用node-gyp構建它,然後運行test.js. (我可以將測試代碼嵌入到StackOverflow中,但我認爲只需在GitHub上提供完整示例會更容易)需要SDL2,SDL2_ttf和SDL2_image位於/ Library/Frameworks中。 (這仍在開發中,所以沒有什麼特別的想法可以自動查找SDL2,或者在存儲庫中具有所需的代碼,或者從某處取出所需的代碼等)。

編輯:這應該可能會根據gamedev StackExchange站點。不知道它是否可以移動/鏈接或不。

回答

2

在網上做了更多的研究,我發現了什麼是「問題」。這是我以前從未真正遇到過的,(不知何故),所以我認爲這是一個明顯的問題,我沒有正確使用SDL。事實證明,圖形「緊張」是每個遊戲都可能遇到的問題,並且有常見的方法可以解決這個問題。基本上,問題是CPU不能完全並行地運行OS中的每個進程/線程。有時一個進程必須暫停才能運行別的東西。在幀更新期間發生這種情況時,它可能會導致該幀花費比正常長兩倍的時間,以便實際推送到屏幕。這是抖動來自的地方。在閱讀Unity question about a similar jitter後,問題變得非常明顯,一位評論者指出,在OS X上運行活動監視器等操作會每隔幾秒鐘定期發生一次抖動。大約從活動監視器輪詢所有正在運行的進程獲取信息之間的時間相同。殺死活動監視器導致抖動不規則。

因此,沒有真正的方法可以保證您的代碼每16毫秒就會在點上運行,並且在您的代碼再次運行之前,它總是會持續16毫秒。您必須將處理事件,移動,人工智能等的代碼時間與新幀渲染時間分開,以獲得完美流暢的體驗。這通常意味着您將每秒鐘運行所有邏輯的次數少於繪製幀的次數,然後預測每個對象在實際更新之間的位置,並在該位置繪製對象。有關這方面的一些更具體的細節,請參閱deWiTTERS game loop article,在一般的遊戲循環的夢幻般的概述之上。

請注意,這種提供流暢遊戲體驗的預測方法並非沒有問題。主要的一點是,如果您在預測位置顯示對象而未實際進行完整的碰撞檢測,則該對象可能很容易在幾幀內剪切到其他對象中。在pong克隆中,我寫信來測試SDL綁定和預測的對象繪圖,如果我在牆上時按住右邊,槳會反覆夾到牆上,然後彈出回來,因爲位置預計會遠遠超過它允許。這是一個單獨的問題,必須以不同的方式處理。我只是讓讀者知道這個問題。