GameDev業界で静的コード分析がどのように役立つか

( 2020年12月4日)

ゲーム業界は絶えず進化しており、スピードを上げる弾丸よりも速く発展しています。業界の成長に伴い、開発の複雑さも増しています。コードベースが大きくなり、バグの数も増えています。したがって、現代のゲームプロジェクトでは、コードの品質に特別な注意を払う必要があります。今日は、コードをより適切にする方法の1つである静的分析と、PVS-Studioが実際にさまざまなサイズのゲームプロジェクト開発にどのように役立つかについて説明します。

「私が近年プログラマーとして行った最も重要なことは静的コード分析を積極的に追求します。私が防止した何百もの深刻なバグよりもさらに価値があるのは、ソフトウェアの信頼性とコード品質の見方に関する考え方の変化です。」— John Carmack

私たちは長年にわたって主要なゲーム開発者と協力してきましたが、この間、ゲーム業界にとって興味深く有用なことをたくさん行うことができました。ゲーム業界の

クライアントのリストを考えると、それほど驚くことではありません。 PVS-Studioを独自の開発プロセスに統合し、アナライザーによって検出されたエラーを修正し、特別なカスタム機能を作成するなど、クライアントを積極的にサポートします。

さらに、 GameDev方向のアナライザーは、PVS-Studioを宣伝し、さまざまなビデオゲームで見つかった興味深いエラーについて人々に伝えます。

確かに、興味深い話がいくつかあります。この記事では、そのようないくつかのケースについて説明します。

PVS-StudioとUnity

製品を宣伝する方法の1つは、オープンプロジェクトのチェックに関する記事を書くことです。誰もがこれらの記事から恩恵を受けます。読者は、なじみのあるプロジェクトのいくつかの異常なエラーをチェックして、新しいことを学ぶ機会を得ます。 PVS-Studioチームに関しては、プロジェクト開発者がエラーについて学び、事前に修正できるように、実際のコードで行われた作業を示す機会があります。

Unityに関する最初の主要な知り合いが行われました。 2016年、このゲームエンジンの開発者が、公式リポジトリでいくつかのコンポーネント、ライブラリ、デモのソースコードを開いたとき。当然のことながら、このような魅力的なケースを通過できず、投稿されたコードの確認に関する記事を書きたかったのです。

その後、Unity3Dコード(当時はエンジンがそのように呼ばれていた)であることがわかりました。非常に高品質でした。しかし、それでもかなり多くの重大なエラーを見つけることができました。 記事を書くのに十分な数でした。

2年後、別のことが起こりました。Unity開発者がエンジンのコードを開き、エディター自体。前回同様、気付かずエンジンのソースコードを確認しました。そして、それは無駄ではありませんでした。私たちは、魅力的な欠陥の束も見つけました。

同時に、私たちの意図は単に書くだけではありません。記事。私たちは引き続きPVS-Studioに取り組んでおり、GameDevは私たちの開発にとって最も重要な分野の1つです。したがって、Unityゲーム開発者がプロ​​ジェクトの可能な限り最高の分析を取得できるようにする必要があります。

Unityプロジェクト分析の品質を向上させるためのステップの1つは、Unity ScriptingAPIで定義されたメソッドのアノテーションを作成することでした。 。

メソッドアノテーションは、PVS-Studioで使用される特別なメカニズムです。これにより、ユーザーは特定のメソッドに関する必要なすべての情報をアナライザーに提供できます。これは、アナライザー開発者自身(つまり、私たち)によって特別なコードで記述されています。

この情報は、まったくさまざまな種類のものである可能性があります。たとえば、メソッドが渡されるパラメータにどのように影響するか、メモリを割り当てることができるかどうか、処理する必要のある値を返すかどうかなどです。したがって、アノテーションにより、アナライザーはメソッドのロジックをよりよく理解できるようになり、新しくより複雑なエラーを検出できるようになります。

すでに膨大な数の異なるアノテーションを作成しています(たとえば、システムのメソッド用)。名前付け)、Unity ScriptingAPIからメソッドアノテーションを追加できました。

評価を使用してアノテーションのリストを拡張し始めました。全部でいくつの方法がありますか?最初に注釈を付ける必要があるのはどれですか?全部でたくさんの方法があったので、私たちは最も頻繁に使用されるものに注釈を付けることから始めることにしました。

これが私たちが人気のある方法を探していた方法です。最初に、Unity機能を使用するプロジェクトのプールをGitHubから収集し、次に(Roslynに基づく)自作のユーティリティを使用して関心のあるメソッド。その結果、メソッドが最も頻繁に使用されたクラスのリストが得られました。

  • UnityEngine.Vector3
  • UnityEngine.Mathf
  • UnityEngine.Debug
  • UnityEngine.GameObject
  • UnityEngine.Material
  • UnityEditor.EditorGUILayout
  • UnityEngine.Component
  • UnityEngine.Object
  • UnityEngine.GUILayout
  • UnityEngine.Quaternion

次に、残りましたこれらのクラスのメソッドに注釈を付けます。テストプロジェクトを作成し、ドキュメントを掘り下げて、これらのメソッドに関するできるだけ多くの情報を取得しました。たとえば、プログラムがどのように動作するかを確認するために、さまざまな引数として null を渡してみました。

このようなチェック中に、文書化されていない興味深い情報が時々見つかりました。エンジンにいくつかの注目すべきバグも見つかりました。たとえば、次のコードを実行している場合:

MeshRenderer renderer = cube.GetComponent();
Material m = renderer.material;
List<int> outNames = null;
m.GetTexturePropertyNameIDs(outNames);

Unityエディター自体がクラッシュします(少なくともバージョン2019.3.10f1では)。もちろん、誰もがそのようなコードを書くことはありそうにありません。それでも、このようなスクリプトを実行することでUnityエディターがクラッシュする可能性があるという事実は興味深いものです。

そこで、アノテーションを作成しました。分析を実行した後、すぐに新しいトリガーが見つかりました。たとえば、アナライザーは GetComponent メソッドへの奇妙な呼び出しを検出しました:

void OnEnable()
{
GameObject uiManager = GameObject.Find("UIRoot"); if (uiManager)
{
uiManager.GetComponent();
}
}

アナライザーの警告: V3010 関数「GetComponent」の戻り値を使用する必要があります。 —現在のUIEditorWindow.csの追加22

GetComponent メソッドは、特定の値が返されることを意味します。その名前に。この値を何らかの方法で使用する必要があると想定するのは論理的です。新しいアノテーションのおかげで、アナライザーは、このメソッドへのこのような「無人」呼び出しが論理エラーを示している可能性があることを認識し、警告します。

これは、一連の警告に表示された唯一の警告ではありません。新しい注釈を追加した後、プロジェクトをテストします。この記事が大きくなりすぎないように、残りの部分は引用しません。重要なのは、PVS-Studioを使用したUnityプロジェクトの開発により、バグのない、はるかに安全でクリーンなコードを記述できるようになったことです。

Unityメソッドのアノテーションを使用した作業について詳しく知りたい場合は、記事は次のとおりです: PVS-StudioアナライザーがUnityプロジェクトでさらに多くのエラーを検出し始めた方法

Unreal Engine 4

2014年に、Unrealの開発者がエンジン4はエンジンのソースコードを開きましたが、そのプロジェクトを乗り越えることができず、それに関する記事も作成しました。エンジン開発者はこの記事を気に入り、見つかったエラーを修正しました。しかし、これだけでは不十分であり、アナライザーのライセンスをEpicGamesに販売することにしました。

EpicGamesはPVS-Studioでエンジンを改善することに関心を持っていたため、次のことに同意しました。 :アナライザーが警告を発行しないように、Unreal Engineコードを独自に修正し、Epic Gamesのスタッフがライセンスを購入し、完了した作業に対してさらに報酬を提供します。

すべての警告が必要だった理由修繕?事実、エラーが発生したときにエラーを修正することで、静的分析から最大のメリットを得ることができます。 プロジェクトを初めてチェックするとき、通常、数百(場合によっては数千)の警告が表示されます。これらすべてのアナライザートリガーの中で、新しく記述されたコードに対して発行された警告を簡単に失うことがあります。

一見すると、この問題は非常に簡単に解決できます。座ってレポート全体を確認するだけです。 、徐々にエラーを修正します。ただし、この方法の方が直感的ですが、時間がかかる場合があります。抑制ファイルを使用する方がはるかに便利で高速です。

抑制ファイルは、非表示にできる PVS-Studioの特別な機能です。特別なファイルのアナライザー警告。ただし、非表示の警告は後続のログには表示されません。個別に表示できます。

最初のチェック後に多くのトリガーを行った後、数回クリックするだけで、検出されたすべての警告を抑制ファイルに追加できます。次のチェックの後、エントリが1つもないクリーンなログを取得します。

古い警告がログに含まれなくなったため、新しい警告が表示されたらすぐに簡単に検出できます。アクションの順序は次のとおりです。コードを記述します–>アナライザーで確認します–>新しい警告を見つけます–>エラーを修正します。これが、アナライザーの使用を最大限に活用する方法です。

同時に、suppressファイルの警告を忘れないでください。以前と同様に、重大なエラーや脆弱性に関する警告を含めることができます。したがって、これらの警告に戻り、定期的にその数を減らす必要があります。

間違いなく、このシナリオは便利ですが、Epic Gamesの開発者はコードをすぐに修正したいと考えていたため、合格しました。

そして私たちは仕事に取り掛かりました。プロジェクトコードを確認したところ、Level_1とLevel_2の1821の警告が見つかりました。このような大量の警告を解析するには、深刻な作業が必要です。このプロセス全体を容易にするために、CIサーバーで継続的コード分析を設定しました。

次のようになりました。サーバーでは毎晩、現在のUnreal Engine 4のバージョンがビルドされ、ビルドの直後に分析が自動的に開始されました。したがって、私たちの男たちが午前中に仕事に来たとき、彼らは常にアナライザーからの新鮮なレポートを持っていました。それは彼らが警告を取り除く進行状況を追跡するのを助けました。さらに、このシステムでは、サーバー上で手動で実行することにより、いつでもビルドの安定性を確認できました。

プロセス全体で17営業日かかりました。エラーを修正するスケジュールは次のとおりです。

実際、このスケジュールは私たちの仕事を完全には反映していません。すべての警告を修正した後、最新のプルリクエストを受け入れるまでさらに2日間待ちました。この間ずっと、Unreal Engineの最新バージョンが自動的にチェックされ、新しいコードで更新され続けていました。それで、あなたは何が起こったと思いますか?この2日間で、PVS-Studioはコードにさらに4つのエラーを検出しました。それらの1つは重要であり、未定義の動作につながる可能性があります。

もちろん、これらのエラーも修正しました。その時点で、Unreal Engineの開発者は、私たちが行ったように、自分の場所で自動分析を設定することだけが残っていました。その瞬間から、彼らは自分たちが書いたばかりのコードに対して発行された警告を毎日見始めました。これにより、コードのエラーが表示されたときに、開発の初期段階で修正することができました。

Unreal Engineコードでの作業方法について詳しくは、 公式のUnrealEngineブログまたは

当社のウェブサイト。

の分析さまざまなゲーム

さまざまなオープンプロジェクトをチェックして、それらに関する記事を書きますか?これで、ゲームプロジェクトに関する同様の記事がたくさんあります! VVVVVV Space Engineers コマンド

コンク r、 osu!、さらには(非常に初期の記事) ドゥーム3 。また、ビデオゲーム業界で最も興味深いソフトウェアバグのトップ10 をまとめました。

そこで、おそらくほとんどのよく知られているオープンソースエンジン。 UnityとUnrealEngine 4に加えて、 Godot Bullet Amazon Lumberyard Cry Engine V など多くの製品が私たちの目の前にあります。

このすべての最良の部分は、私たちが説明したバグの多くが後でプロジェクト開発者自身によって修正されたことです。あなたが開発しているツールが世界に現実的で目に見える具体的な利益をもたらすと感じるのは素晴らしいことです。

ビデオゲーム開発に関連するすべての記事のリストを何らかの方法で表示できます。ブログの

特別ページ。

結論

この時点で、私の記事は終わりです。バグやエラーのない、クリーンで正しく機能するコードをお祈りします!

静的分析のトピックに興味がありますか?プロジェクトのエラーをチェックしたいですか? PVS-Studio をお試しください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です