遊戲全速執行,畫面卻卡頓
任天堂 DS 的 3D 遊戲即使以正常速度執行,畫面仍會卡頓。1.5.0 為每一幀決定顯示時間,讓畫面一張一張均勻地顯示。
玩任天堂 DS 的 3D 遊戲時,有時遊戲速度沒變,畫面卻一卡一卡的。遊戲以正常速度產生幀,但其中約三分之一沒有顯示到畫面上。
為了找出卡頓發生在哪裡,製作了幀率顯示。第一行是遊戲每秒產生的幀數和相對實機的速度,第二行是畫面上新顯示的幀數和畫面更新次數。如果第一行是正常速度、只有第二行偏低,問題就在畫面而不在遊戲。可在暫停選單的「畫面」中開啟或關閉。
DS 遊戲常常每秒繪製 30 次 3D,重幀與輕幀交替出現,於是兩幀幾乎同時完成。畫面每次更新都取最新的一幀,因此幾乎同時完成的兩幀中,前一幀沒能顯示就被跳過了。
現在為每一幀決定顯示到畫面上的時間,也就是遊戲原本應輸出該幀的時間加上一小段等待時間。最多保留 4 幀,畫面每次更新時,顯示已到顯示時間的幀中最新的一幀。同時完成的兩幀也會各自按順序一張一張顯示。
等待時間起初以大多數幀完成的時間為準,後來改為最近 2 秒內最晚完成的那一幀。但當慢幀離開這個時間範圍時,等待時間會縮短,導致跳過其他幀。現在只要幀完成的延遲超過目前等待時間,就立即增加等待時間並維持。只有在縮短 1 幀的等待時間後仍能讓所有幀準時顯示的狀態持續 30 秒,才會縮短這 1 幀。等待時間最多為 2 幀。即使畫面稍晚顯示,也選擇減少卡頓。
iOS 和 Android 都用這種方式選擇要顯示的幀。遊戲機的執行週期與畫面更新週期相差不超過 1.2% 時,會將遊戲執行速度與畫面更新週期對齊,聲音播放速度也依相同比例調整。在 iOS 上,DS 的 3D 畫面也改在與遊戲執行不同的執行緒中繪製,並在建置 DS 核心時開啟連結時最佳化(LTO)。
在實機上只用一台 iPhone 確認過。在 Android 裝置和其他遊戲中能顯示得多均勻,目前還沒有測量。
相關開發故事
- 開發故事v1.3.0封閉 Beta 測試
用預先執行讓按鍵反應更快
遊戲讀取按鍵後,要過一幀以上才會把結果畫到畫面上。預先執行會提前執行這些幀,讓反應更快,但計算量增加,也會更耗電。
- 開發故事v1.2.0封閉 Beta 測試
減少暫停畫面的重複處理
畫面靜止時,繪製仍可能重複進行。1.2.0 區分了需要重繪的時機,並允許先試用設定再儲存。