グラフィックカードで実行中のゲームを完了した

最後に、ビデオカードで動作するゲームを完了しました。 彼女はインセンティブに数ヶ月間早期アクセスにかかっていましたが、ついにリリースしました。 ゲームの主な特徴は、GPU上で実行される物理シミュレーションであることです。 メインのゲームコードは、HLSLの6000行の巨大な計算シェーダーです。 数万の相互作用する粒子が並行して処理され、非常に迅速に終了します。 ゲーム内のすべてはこれらの粒子でできています。 これがどのように機能するかについてのいくつかのgifはここにあります:



画像



画像



画像



この種のゲームを開発した経験を要約したいと思います。 グラフィックカードでのコンピューティングの長所と短所は何ですか。



利点:



1. GPUのパフォーマンスは、並列コンピューティングに関してはプロセッサのパフォーマンスの10〜100倍です。 これはたくさんあるので、ビデオカードでは、プロセッサとは根本的に異なるゲームを作成できます。 私のゲームはCPUで動作しません(つまり、速度が遅すぎます)。



短所:



1.いくつかのチュートリアル。 私はすべてを学ぶためにかなりの時間を費やしました。 そしてさらに-発生した問題を解決する。



2.グラフィックコア用にプログラムすることは基本的に困難です。 プロセッサコンピューティングになじみのあることは機能しない場合があります。 たとえば、3次元配列の3次元サイクルの代わりに、1次元配列を同時に処理するスレッドの3次元空間を整理する必要がありました(元の3次元を分解する必要がありました)。 さらに、保護されたモードで共有スレッドで並列スレッドが動作するように注意する必要があります。 一般に、これはすべて解決できますが、時間がかかります。



3.ビデオメモリからデータを読み取るときに問題が発生しました。 これはすべてのサイクルで実行する必要がありましたが、動作が遅すぎました。 グラフィックスパイプラインにとって都合の良い時間にユニット内で非同期読み取りが行われず、データの読み取り中は常にブロックされていたためです。 その結果、fpsは半分に低下しました。 私は、directXを使用してビデオメモリから非同期読み取りを行うためにネイティブプラグインを使用する必要がありましたが、まず、ウィンドウの外では機能しませんでした。



4.誰もがシェーダーをサポートし、十分なパフォーマンスを備えた最新のグラフィックスカードを持っているわけではありません。 これにより、私のゲームをプレイできるプレイヤーの数が制限されました。 そして、遅くなった人たちはSteamで否定的なレビューを書くことに嫌気がさしていませんでした。



5.異なるプラットフォーム上のグラフィックAPIは、互いにわずかに異なります。 単純なケースでは、directX標準と互換性がありますが、私にとっては単純なケースではなく、多くの制限に近づきました。 たとえば、DX11では、単一のカーネルは8つのバッファーでしか動作できません。 そして、Android APIは4つだけです。 Metalには、スレッドに共通のテクスチャに保護されたレコードがないなどの独自の制限もあり、Vulkanには他の制限もあります。 その結果、ゲームはWindowsでのみ機能します。



6.確定的な計算を行うことができなかったため、マルチプレイヤーなしで実行する必要がありました。 ただし、理論的には明らかです。すべてを整数で行う必要があり、各サイクルの結果はフローの順序に依存しないようにする必要があります(フローは同じ条件下で異なる場合があります)。 しかし、私の実験はまだコンピューティングの決定論に至っていません。



しかし、最終的に、私は自分がやりたいことをやったことをまだ嬉しく思っています。



プレイヤーとして、私は完全に物理的なゲームをプレイするのがどのようなものかを知りたいので、すべてが破壊されました。 おそらく将来的には、このようなものを3Dで表現しようと思います。



ゲームデザイナーとして、物理シミュレーション以外では不可能な、物理学で遊ぶこと、ユニークなゲームプレイを作成することは興味深いことでした。



また、プログラマーとして、GPUでのコンピューティングのスキルを身につけることは役に立ちました。 将来、これは生産性の向上につながると思います。 ただし、すべてのグラフィックスAPIがdirectx11標準と互換性がある場合は、開始するのがよいでしょう。 ゲーム全体をGPUで作成する必要はまったくありません。ゲームの一部をビデオプロセッサで処理することができます。 たとえば、戦略でパスを見つける。 そして今、ビデオカードでのコンピューティングをサポートしていないプラットフォームでゲームが実行されている場合、コンピューティングシェーダーを複製する必要がある場合、すべての開発者がコンピューティングシェーダーを作成できるわけではありません。



さて、誰かが突然このエリアで手を試したいと思ったら、ここにいくつかのチュートリアルがあります、彼らはかつてこのエリアで私のために道を開いた:



最初に

第二



All Articles