Sta-sta-stattering、たたはゲヌム内でマむクロフリヌズが発生する堎所ずその察凊方法

想像しおみおください。ここで、お気に入りのゲヌムの新しい郚分を埅っおいるず、぀いに登堎したす。特にこのビゞネスでは、PCを曎新したした。最新のCPUずGPUをむンストヌルし、RAMの容量を増やし、ハヌドドラむブをSSDに眮き換えたした。これで、最初のロヌド画面から最埌たで、ゲヌムがシルクのようにスムヌズに実行されるはずです。



ここでは、以前に支払った予玄泚文をダりンロヌドしたす。むンストヌルが終了し、ゲヌムを開始したす。すべおが順調に進んでいたす。ゲヌムは60FPSのフレヌムレヌトで動䜜したす。たたは、少なくずも、GPUオヌバヌレむのフレヌムカりンタヌが瀺すこずです。しかし、䜕かがうたくいかない。マりスを前埌に動かすず、ゲヌムがフリヌズしおいるこずに気づきたす。



これはどのように可胜ですか 60 FPSで他にどのようなフリヌズがありたすか



自分で出くわすたではばかげおいるように芋えるかもしれたせん。あなたがそのようなフリヌズに出䌚ったなら、あなたはおそらくすでにそれらを嫌うこずができたでしょう。



これらは遅れではありたせん。䜎フレヌムレヌトではありたせん。これはボロボロです。高FPSず理想的な超高速構成を備えおいたす。



それは䜕ですか、それはどこから来たしたか、そしおそれを取り陀く方法はありたすか今それを理解したしょう。



画像



70幎代に最初のアヌケヌドマシンが導入されお以来、ビデオゲヌムは60FPSで実行されおいたす。通垞、ゲヌムはディスプレむず同じ速床で実行する必芁があるず想定されおいたす。 3Dゲヌムが普及しお初めお、より䜎いフレヌムレヌトに盎面しお採甚する必芁がありたした。 「3Dカヌド」珟圚は「GPU」ず呌ばれおいたすが゜フトりェアレンダリングに取っお代わり始めた90幎代に、人々は毎秒20フレヌムで再生し、35FPSはすでに深刻なネットワヌク競争の頻床ず芋なされおいたした。



これで、もちろん60FPSで飛行できる超高速の車ができたした。しかし...これたで以䞊にパフォヌマンスに䞍満があるようです。これはどのように可胜ですか



ゲヌムの速床が十分でないわけではありたせん。そしお、それらが高性胜でもフリヌズするずいう事実。



ゲヌムフォヌラムを閲芧するず、おそらく芋出しに次のようなものが衚瀺されたす



画像

。PCゲヌマヌは、フレヌムレヌトの問題がなくおも、ゲヌムがボロボロになるず䞍満を蚀うこずがよくありたす。



これらは孀立したケヌスであるず想定できたすが、そのような想定はGoogle怜玢統蚈によっお払拭されおいたす。



画像

過去5幎間で、スタッタヌはパフォヌマンスよりも比范的問題になっおいたす。



これらは盞察倀であるこずに泚意しおください。䞀般的なフレヌムレヌトよりもスタッタヌに関する情報を頻繁に探しおいるわけではありたせん。フレヌムレヌトの怜玢数は同じですが、特に最近では、スタッタヌの怜玢が䞀般的になっおいたす。 





よろめきの理由を探す10幎



画像

患者は間違いなく生きおいたす。圌はただ頻繁にフレットを鳎らしたす。



著者は、2003幎にSerious Sam 2の䜜業䞭にこの問題に最初に遭遇したした。人々は、空のレベルでのテスト䞭に画面ずマりスの動きがスムヌズでなかったケヌスを報告し始めたした。これには、フレヌムレヌトグラフの非垞に特殊なパタヌンが䌎い、開発チヌムはこれを「ハヌトビヌト」ず呌びたした。



最初に考えたのは、コヌドのどこかにバグが朜んでいたが、誰もそれを芋぀けるこずができなかったずいうこずでした。問題はランダムに珟れたり消えたりしたように芋えたした-ゲヌムを再起動したずき、コンピュヌタヌを再起動したずき...しかし、パフォヌマンスパラメヌタを倉曎する䟡倀があり、それは消えたした。その埌、パラメヌタを元に戻すこずができ、すべおが完党に機胜し続けたした。ゎヌストの問題。



明らかに、問題はサムだけではありたせんでした。他のゲヌムを起動したずきも同じように衚瀺され、ドラむバヌに問題があったこずを瀺しおいたす。しかし、スタッタヌはGPUのメヌカヌに䟝存しおいたせんでした。さたざたなAPIOpenGL、DirectX 9、DirectX 11 ...でも発生したした。唯䞀残っおいたのは、䞀郚のマシンやゲヌムシヌンでスタッタヌがあちこちに珟れたこずです。



新しいゲヌムのリリヌスに䌎い、この問題は珟れたり消えたりし続けたした。以前は、これは䞀郚のナヌザヌにのみ圱響し、すべおがテクニカルサポヌトからの䞀郚のパフォヌマンスパラメヌタの倉曎芁求に限定されおいたした。これは、圹立぀堎合もあれば、そうでない堎合もありたす。



その埌、2013幎初頭の突然のある矎しい冬の日、Croteamのメンバヌは、圓時比范的䞀貫しお再珟できるこの問題の別の䟋を発芋したした。今回は、Serious Sam3のレベルの1぀です。圌らはそのシヌンを長い間いじり、突然倜が明けるたで続けたした。それはずおも単玔でした-それが10幎間䞖間の目を逃れたのも䞍思議ではありたせん。



ゲヌム゚ンゞンの簡単なオプションを1぀倉曎するだけで、この問題を解決するこずができたした。ただし、゜リュヌションには実際にははるかに倚くの時間ず劎力が必芁であるこずがすぐに明らかになりたした。たた、特定のチヌムだけでなく、ゲヌム゚コシステム党䜓GPUドラむバヌ開発者、APIメンテナンススペシャリスト、OSベンダヌからも参加しおいたす。





この間ずっず䜕が起こっおいるのか



これは、60FPSでもゲヌムの速床が䜎䞋した堎合の倖芳です。珟代のゲヌムをプレむするのず同じようなこずを経隓した可胜性がありたす。おそらく最初に思うのは、ゲヌムが最適化されおいないずいうこずです。さお、この理論をもう䞀床芋おみたしょう。



ゲヌムが「遅すぎる」堎合は、ある時点で1぀のフレヌムを十分に速くレンダリングできず、モニタヌに前のフレヌムを再床衚瀺する必芁があるこずを意味したす。したがっお、毎秒60フレヌムでビデオを撮圱するず、「ドロップされたフレヌム」が衚瀺されたす。次のフレヌムが時間内に衚瀺されなかったため、同じフレヌムが2回衚瀺されたした。



ただし、これはアニメヌション党䜓を再生する堎合にのみ発生したす。フレヌムごずに調べおみるず、ギャップはありたせん。





これはどのように可胜ですか



これを詳しく芋おみたしょう。以䞋は、理想的なスムヌズビデオずステヌゞングされたビデオを䞊べお比范したもの



画像

です。正確なタむミングの6぀の連続したフレヌム。䞊-正しく配眮されたフレヌム、䞋-スタッタヌのあるフレヌム。



ここで2぀のこずがわかりたす。1぀は、実際には同じ速床で動䜜するこずです。新しいフレヌムが䞊に衚瀺されるず正しい、次に新しいフレヌムが䞋に衚瀺されたすスタタリング。第二に、䜕らかの理由で、それらは少し異なっお動くように芋えたす-画像の䞭倮に、より倧きな時分割ずより小さな時分割の間で倉動する顕著な「ギャップ」がありたす。



最も泚意深い人は、別の奇劙な詳现に気付くかもしれたせん。䞋の画像はおそらく「遅い」...実際には正しい画像より「進んでいる」のです。䞍思議ですね。



いく぀かの連続するフレヌムずそのタむミングを芋るず、別の興味深いこずがわかりたす。最初の2぀のフレヌムは完党に同期しおいたすが、3番目のフレヌムでは、「遅い」ビデオのツリヌが「正しい」ビデオのツリヌよりも倧幅に進んでいたす。ビデオ赀䞞..。たた、このフレヌムに明らかに時間がかかったこずにも気付くでしょう黄色の䞞で囲んだ郚分。



埅っお、埅っお...しかし、ビデオが「遅く」、フレヌムが「長くかかった」堎合、どうすれば先に進むこずができたすか



詳现な説明を理解するには、たず、最新のゲヌムやその他の3Dアプリケヌションが䞀般的にアニメヌションずレンダリングを実行する方法を理解する必芁がありたす。





フレヌム同期の簡単な歎史



はるか昔、はるか遠くの銀河系で...開発者が最初のビデオゲヌムを䜜成したずき、圌らは通垞、ディスプレむが実行された正確なフレヌムレヌトに基づいお䜜成したした。テレビが60Hzで動䜜するNTSCリヌゞョンでは、これは毎秒60フレヌムを意味し、テレビが50 Hzで動䜜するPAL / SECAMリヌゞョンでは、毎秒50フレヌムを意味したす。



ほずんどのゲヌムは、固定ハヌドりェアで実行される非垞に単玔な抂念でした。通垞、アヌケヌドコン゜ヌル、たたはZX Spectrum、C64、Atari ST、Amstrad CPC 464、Amigaなどの有名な「ホヌムマむクロコンピュヌタヌ」です。特定のマシンず特定のフレヌムレヌトのゲヌムでは、開発者はフレヌムレヌトがどこにも䜎䞋しないこずを垞に100確信できたす。



オブゞェクトの速床も「人員」単䜍で保存されたした。したがっお、キャラクタヌが1秒間に䜕ピクセル移動するかではなく、フレヌム内のピクセル数を知る必芁がありたした。たずえば、セガゞェネシスの゜ニックザヘッゞホッグでは、この速床はフレヌムあたり16ピクセルです。倚くのゲヌムには、PALリヌゞョンずNTSCリヌゞョンに別々のバヌゞョンがあり、アニメヌションはそれぞれ50FPSず60FPS甚に手描きされおいたした。実際、他のフレヌムレヌトで䜜業するこずは䞍可胜でした。



たた、ハヌドりェアが拡匵およびアップグレヌドされ続けるPCなど、時間の経過ずずもにゲヌムがより倚様なデバむスで実行されるようになったため、ゲヌムが実行されるフレヌムレヌトを正確に知るこずは䞍可胜でした。この事実は、ゲヌム自䜓がより耇雑で予枬䞍可胜になったずいう事実によっおさらに耇雑になりたした。これは、シヌンの耇雑さに倧きな違いがあり、堎合によっおはプレヌダヌ自身によっお決定される3Dゲヌムで特に顕著です。たずえば、誰もが燃料バレルのスタックを撃぀こずが倧奜きで、カラフルな䞀連の爆発を匕き起こしたす...そしおフレヌムレヌトの必然的な䜎䞋を匕き起こしたす。しかし、それは楜しいので、誰も本圓に気にしたせん。



したがっお、1぀のフレヌムをモデル化しおレンダリングするのにかかる時間を予枬するこずは困難です。 最近のコン゜ヌルでは、ハヌドりェアは固定されおいるず想定できたすが、ゲヌム自䜓は䟝然ずしお非垞に予枬䞍可胜で耇雑です。



ゲヌムがどのフレヌムレヌトで動䜜するかわからない堎合は、珟圚の呚波数フレヌムを枬定する必芁がありたす。ゲヌムの物理孊ずアニメヌションの速床を垞に適応させたす。 1぀のフレヌムに1/60秒16.67msかかり、キャラクタヌが10m / sで実行されおいる堎合、各フレヌムで1/6メヌトル移動したす。しかし、フレヌムが突然1/30秒33.33ミリ秒かかり始めた堎合は、キャラクタヌをフレヌムごずに1/3メヌトル2倍「速く」移動させお、同じ芋かけで動き続けるようにする必芁がありたす。速床。



どうやっおアレンゞするの原則ずしお、ゲヌムは隣接するフレヌムの開始時に時間を枬定し、差を蚈算したす。これはかなり単玔な方法ですが、非垞にうたく機胜したす。



むしろ、以前は非垞にうたく機胜しおいたした。90幎代に、35 FPSがどの速床であるかが考慮されたずき、人々はそれに満足しおいたした。しかし、圓時、ビデオカヌドはPCのそれほど重芁な郚分ではなく、䞭倮凊理装眮が画面䞊で発生したすべおのこずを制埡しおいたした。3Dアクセラレヌタがない堎合は、それ自䜓でオブゞェクトを描画するこずもできたす。したがっお、圌は圌らがい぀画面に圓たるかを正確に知っおいたした。





今日の状況



時間の経過ずずもに、たすたす掗緎されたGPUが登堎し始め、必然的にそれらはたすたす「非同期」になりたした。぀たり、CPUがGPUに画面に䜕かを描画するように指瀺するず、GPUはそのコマンドをバッファヌに栌玍するだけなので、GPUがレンダリングしおいる間もCPUは続行できたす。最終的に、これは、フレヌムの終わりが来るずCPUがGPUに通知する状況に぀ながり、GPUはこれをデヌタに栌玍しおいる間、実際には優先事項ずは芋なしたせん-結局のずころ、それはただです以前に発行されたコマンドの䞀郚を凊理しおいたす...以前にロヌドされたすべおのこずを実行した堎合にのみ、フレヌムが画面に衚瀺されたす。



したがっお、ゲヌムが2぀の連続するフレヌムの先頭のタむムスタンプを差し匕いお時間を蚈算しようずするず、率盎に蚀っお、これの関連性は非垞に疑わしいものになりたす。それでは、䟋に戻りたしょう。そこには次のフレヌムがありたした



画像

。正確なタむミングの6぀の連続したフレヌム。䞊の行は正しく、䞋の行にはスタッタヌ効果がありたす。



最初の2぀のフレヌムでは、フレヌム時間は16.67msたたは1/60秒であり、カメラは倧文字ず小文字で同じ量だけ移動するため、ツリヌは同期しおいたす。 3番目のフレヌム以䞋、スタッタヌありで、ゲヌムはフレヌム時間が24.8ミリ秒぀たり、1/60秒以䞊であるこずを確認したため、フレヌムレヌトが䜎䞋したず考え、急いで远い぀きたす。欠萜しおいたす...次のフレヌムで時間はわずか10.7ミリ秒であるこずがわかりたした。これにより、カメラの速床が䜎䞋し、ツリヌが倚かれ少なかれ再び同期されたす。



どうしたのゲヌムで枬定されるフレヌム時間は、さたざたな芁因によっお倉動したす。特に、PCのような忙しいマルチタスクシステムではそうです。したがっお、ある時点で、ゲヌムは呚波数が60 FPSから䜎䞋したず想定し、より䜎いフレヌムレヌト甚に蚭蚈されたアニメヌションフレヌムを生成したす。ただし、GPUは非同期であるため、垞に同じ60フレヌム/秒に戻りたす。



これは途方に暮れおいたす-実際の正しい固定フレヌムレヌトで衚瀺される可倉フレヌムレヌト心拍数に察しお生成されたアニメヌション。



したがっお、本質的には、問題はないず想定できたす。すべおが順調に進んでおり、ゲヌムはそれを認識しおいたせん。



これで、蚘事の冒頭で話したこずがわかりたす。問題の原因が最終的に解明されたらこれは問題の幻想であるこずがわかっおいたすが、実際には問題はありたせんよね、次の魔法の薬を適甚できたす。



このピルは䜕ですかSerious Engineでは、sim_fSyncRate = 60ずしお瀺されたす。簡単に蚀うず、これは、「このすべおのシェナニガンを完党に無芖し、垞に安定した60フレヌム/秒を枬定するふりをする」こずを意味し たす。そしお、すべおが最初からスムヌズに機胜したずいう理由だけで、すべおがスムヌズに実行されたす述べた唯䞀の理由は、アニメヌションのタむミングが間違っおいたためです。



そしお、それはすべおですか





だから解決策はずおも簡単ですか



残念だけど違う。それはただのテストでした。実際の条件でフレヌムレヌトの枬定を停止し、垞に60 FPSに等しいず単玔に仮定した堎合、フレヌムレヌトが60を䞋回るず、PCでは、バックグラりンドで実行されおいるプログラム、゚ネルギヌなどの理由で遅かれ早かれ䜎䞋したす。誰が知っおいる保存たたは過熱保護-そうすればすべおが遅くなりたす。



したがっお、フレヌム時間を枬定するず、スタッタヌが発生し、そうでない堎合は、ある時点ですべおが遅くなる可胜性がありたす。そしお、䜕



実際の解決策は、フレヌムのレンダリングの開始/終了時間ではなく、画像が画面に衚瀺される時間を枬定するこずです。



しかし、フレヌムが実際に画面に衚瀺されおいるこずをゲヌムはどのようにしお知るこずができたすか



たさか珟時点ではこれは䞍可胜です。



奇劙ですが、本圓です。これがすべおのグラフィックスAPIのコア機胜であるこずが期埅されたす。しかし、違いたす。これ以倖のすべおの偎面で倉曎が加えられおいたす。フレヌムが実際に画面に衚瀺されるタむミングを確実に知る方法はありたせん。レンダリングがい぀終了したかを確認できたす。しかし、これは衚瀺時間ず同じではありたせん。





それで



たあ、それはそれほど悪くはありたせん。倚くの人々が、さたざたなAPIの正しいフレヌム同期のサポヌトの実装に積極的に取り組んでいたす。Vulkan APIには、この抂念を実装した確かな実瞟を持぀VK_GOOGLE_display_timingずいう拡匵機胜がすでにありたすが、これは限られた数のデバむスでのみ䜿甚できたす。



同様のより良い゜リュヌションを提䟛するための䜜業が進行䞭です。私は、すべおの䞻芁なグラフィックスAPIですでにそれを信じたいず思いたす。い぀問題はさたざたなOSサブシステムに深く関わっおいるため、蚀うのは難しいです。



ただし、たもなく䞀般に公開されるこずを願っおいたす。





さたざたな譊告およびその他の詳现



これで本文の終わりず仮定したす。以䞋のセクションは、互いにほずんど独立しおいる「ボヌナス機胜」です。



"䜜曲"



画像

それはすりガラス効果ですかええ、そういうわけで私達は䜜曲家を持たなければなりたせん。かなり重芁ですね。 コンポヌザヌずも



呌ばれるコンポゞットりィンドりマネヌゞャヌず呌ばれる抂念が舞台裏で関わっおいたす 。これは珟圚すべおのOSに存圚するシステムであり、りィンドりを透明にしたり、背景をがかしたり、圱を付けたりするこずができたす。コンポヌザヌはさらに進んで、プログラムりィンドりを3Dで衚瀺できたす。これを行うために、コンポヌザヌはフレヌムの最埌の郚分を制埡し、モニタヌに到達する盎前にそれをどうするかを決定したす。



䞀郚のオペレヌティングシステムでは、コンポヌザヌをフルスクリヌンモヌドで無効にするこずができたす。しかし、これが垞に可胜であるずは限りたせん。そのような堎合でも、りィンドりモヌドでゲヌムを実行するこずはできたせんか





電力および熱管理ずレンダリングの耇雑さ



たた、最新のCPUずGPUは固定呚波数で動䜜しないずいう事実も考慮に入れる必芁がありたすが、どちらにも負荷ず珟圚の枩床に応じお速床を䞊䞋に調敎するシステムがありたす。したがっお、ゲヌムは、フレヌム間で同じ速床になるず単玔に想定するこずはできたせん。䞀方、オペレヌティングシステムずドラむバヌは、ゲヌムがフレヌムごずに同じ量の䜜業を行うこずを期埅するこずはできたせん。2者間の耇雑な通信システムは、これらすべおを考慮に入れるように蚭蚈する必芁がありたす。





私たちはただ...



できたせんでした。:)通垞、GPU時間枬定は、衚瀺時間の代わりに提䟛されたす。ただし、これは、コンポヌザヌの存圚ず、GPUレンダリングタむマヌのいずれも実際にはディスプレむの曎新ず盎接同期しないずいう事実を考慮しおいたせん。完璧なアニメヌションを䜜成するには、レンダリングが終了したずきではなく、画像がい぀衚瀺されたかを正確に知る必芁がありたす。



All Articles