ゲームプログラマーのためのVisual Studio C^LM^LMプロジェクト設定入門

261 Views

December 19, 25

スライド概要

ゲームプログラマー向けにVisual StudioのC++プロジェクト向け設定を色々と紹介します

profile-image

ゲームエンジンプログラマー

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

ゲームプログラマーのための Visual Studio C++プロジェクト設定入門 M. K. (@rytorion) C++ Breaktime 2025 Winter 1

2.

自己紹介 • M. K. (@ryutorion) • タイトル開発7年 • メインも経験 • ゲームエンジン関係7年 • C++バージョン更新の推進 • C++11から20まで • クロスコンパイル環境の整備 • 各種プラットフォームへの移植 2

3.

設定をいじれる人は少ない • 自動生成されていて触る必要が無い • テンプレート • Unreal Engine • CMake • プロジェクト規模が大きいほど設定担当がいて触る必要が無い • 設定周りを分かっていると一目置かれるかも? • 設定しておくと嬉しい設定を一挙大公開 • あくまでもゲーム業界視点なのでご注意を • 資料にはドキュメントへのリンク有り 3

4.

プロジェクト設定の種類 • GUIから設定 • 多くの設定はこれ • プロジェクトのプロパティから設定できる • コマンドライン実引数として設定 • /utf-8や/Zc関連 • プロパティの「C/C++」>「コマンドライン」で設定できる • バージョンアップでGUIから設定可能になることも • vcxprojに直接書き込む • PreferredToolArchitectureなど • それぞれプロジェクト全体以外にコンフィギュレーション単位, ファイル単位でも設定可能 • 全てのコンフィギュレーションにしていると消える項目もあるので注意! 4

5.

言語標準 • 「全般」>「C++言語標準」でC++の言語バージョン設定 • Visual Studio 2022まではC++14,2026からはC++20がデフォルト • 「全般」>「C言語標準」でCの言語バージョン設定 • ターゲットプラットフォーム全てを考慮して設定する 5

6.

/MP • 「C/C++」>「全般」>「複数プロセッサによるコンパイル」 を「はい」に • Visual Studio 2026でもデフォルトオフ • 問題がなければONにするのが吉 6

7.

/W • 警告レベルを指定したり,警告をエラーにしたりできる • 「C/C++」>「全般」で設定 • 新規のプロジェクトは警告レベルを4にしておくと良い • 「警告をエラーに」も設定しておくと完璧 • 「警告をエラーに」しておかないと警告を放置する人も • 既存のプロジェクトで上げられない場合 • /WXで警告をビルドエラーにしておく • 一旦レベルを上げて多い警告を確認する • /Wnnnnと番号指定で部分的に指定していく • 最終的にレベルを上げる 7

8.

/permissive• C++標準への準拠を強化する設定 • Visual Studio 2017から登場 • 構成プロパティ > C/C++ > 言語 > 準拠モードを「はい」にする • C++20にすると強制的に設定される • あくまでも強化するだけで完璧ではない • C++標準に準拠していないコードがエラーや警告になる • 他のコンパイラーでもビルドが通るコードが書きやすくなる 8

9.

/Zc:preprocessor • プリプロセッサの挙動を標準に合わせる • 「C/C++」の「プリプロセッサ」の「標準対応のプリプロセッサを使 用する」を「はい」に • Visual Studioの場合とそれ以外の場合で分岐させているところで問題 を起こすかもしれないので注意 • 「すべての構成」にまとめて設定しようとすると表示されない罠も • /permissive-でも有効にならない • これを設定しないとC++20で追加された__VA_OPT__が利用で きない 9

10.

/Zc:__cplusplus • __cplusplusが正しい値になる • __cplusplusの値でC++標準のバージョンを判定している箇所が正しく 機能するように • /permissive-で有効にならない • Clangなどと同じ方法で判定できるようになって便利 10

11.

/EH • 例外の有効無効を切り替える • 「C/C++」>「コード生成」>「C++の例外を有効にする」で設定 • ゲームの場合,速度重視で例外を無効にすることも • 無効にする場合,_HAS_EXCEPTIONS=0を指定しないと警告が出たり する 11

12.

プリプロセッサの定義 • 「C/C++」>「プリプロセッサ」>「プリプロセッサの定義」 • _CRT_SECURE_NO_WARNINGS • sprintfを使うとsprintf_sを使うようにと出る警告を抑える • • _ITERATOR_DEBUG_LEVEL • • • Microsoft独自の関数を指定してくることが多く移植性に難がある DebugビルドとReleaseビルドなど設定が違うものをリンクしようとするとログに_ITERATOR_DEBUG_LEVELが違うと出る 実行速度が落ちるのでゲーム開発ではオフにすることもある NOMINMAX • 関数形式マクロのmin/maxを除外する • • std::min(1, 2)と書くとstd::( (1) < (2) ? (1) : (2))のようになりコンパイルエラー 関数形式マクロのmin/maxが無い環境でのビルドエラーの原因に • • • • WIN32_LEAN_AND_MEAN • 古いAPIを除外しヘッダーファイルのサイズを小さくする • • • min(1U, 2.5f)はmin(T a, T b)と同じ型として推論ができないがマクロでは通る 百害あって一利無しなので是非設定を そのほかのNO系はWindows.hを参照 ビルド時間が短縮される WinSock2.hのインクルード順を気にしなくて済む _HAS_EXCEPTIONS=0 • 例外無効な場合に0に設定することで標準ライブラリ内の警告を抑制する 12

13.

/Zc:enumTypes • enumの挙動をC++標準に合わせる • Visual Studioではintに固定されているため,64bitの値を指定すると下 位4バイトに切り取られる • 例: 0x1’FF’FF’FF’FF が 0xFF’FF’FF’FF に • https://godbolt.org/z/hxcM4MG5W • 警告も出ないのでテストしないような人がいると大変なことに • コマンドラインでしか指定できない • /permissive-で有効にならない 13

14.

/Zc:checkGwOdr • 最適化でODR違反を無視するケースを検出 • 詳細はMS Dev blogsを参照 • コマンドラインでのみ設定可能 • /permissive-でも設定されない 14

15.
[beta]
/Zc:templateScope
• テンプレートパラメーター名の隠蔽を検出
• コマンドラインでのみ設定可能
• /permissive-でも設定されない
• 例
template <class T>
struct X
{
template <class T> // ここでTが被っている
struct iterator { … };
};

15

16.

/arch: • 利用できる拡張命令セットを指定できる • 「C/C++」>「コード生成」>「拡張命令セットを有効にする」 で設定 • 新しいものを指定するとより高速なコードを生成できる(かも) • デフォルトではAVX2を利用しない • 対応していないハードで実行しようとするとクラッシュする • 指定していても間違えて生成するなんてことも • それぞれの命令の普及具合を見るのが吉 • Steam Hardware & Software Surveyを参照 • 何故かGPUは最新なのにCPUは10年以上前なんてケースも 16

17.

/utf-8 • 日本語環境でのみビルドエラーになることも • コンパイラーのインターナルエラーを報告したら,発生しないと言わ れ,日本語環境のみの問題だった,なんてことも • 日本語環境でのみコメントにある非ASCII文字の扱いで問題を起こして コンパイルエラーになることも • いきなり変えるとコンソール出力が化けたりもするので注意 17

18.

Clang-CLにご注意 • プロパティの「全般」にある 「プラットフォームツールセット」を 「LLVM (clang-cl)」にするとClangでビルドできる • 無い場合はVisual Studio Installerから追加が必要 • Visual Studioのマイナーバージョンで Clangのメジャーバージョンが変わることもあるので注意 • ある日突然ビルド時間が延びたなんて報告が来ることも • ある日突然ビルドが通らなくなったなんてことも • 一部のオプションはClangでは無効になるので コマンドラインでの指定が必要 • マップファイル生成など 18

19.

おまけ ツール設定 「メニュー」>「ツール」>「オプション」からの設定 19

20.

ビルド時間を計測する • 「VC++プロジェクトの設定」>「ビルド時間」を 「はい」にする • それぞれのタスクにかかった時間を簡易的に計測できる • MSBuildのタスクの時間なので実際にはC#プロジェクトでも利用でき る • より細かく計測したい場合はC++ Build Insightsなどを活用 20

21.

プロジェクトの並列ビルド数 • メモリ価格高騰の昨今,ビルド時のメモリ使用量も気になる • 「プロジェクトとソリューション」>「ビルドして実行」の 「並行してビルドするプロジェクトの最大数」 を減らすと多少抑えられるかも • コア数に合わせて勝手に増えてたりするので注意! 21

22.

同時実行するC++コンパイルの最大数 • 「VC++プロジェクトの設定」にある • デフォルトは0でコア数をフルに使おうとする • コア数に対してメモリが不足しているとビルドに失敗することも 22

23.

まとめ • プロジェクト設定を適切に設定することで • 移植性の高いコードを書きやすくなる • 何もせずに速度を上げられることもある • ビルドエラーや警告の原因を排除できることも • メモリ不足などは環境や変更の影響範囲次第で出たりでなかったりする • たまに標準ライブラリ内に警告が出るコードが埋め込まれることも • Visual Studioのメジャーバージョンアップ時には見直しが重要 • Visual Studioの設定の学び方 • Microsoft Learnを読む • リリースノートを眺めておくと新規のオプションは追いやすい • Microsoft Dev Blogsでしか言及していないオプションがあることも • -d2SSAOptimizer-とか 23

24.

ご清聴ありがとうございます 24