DirectX12の描画処理 #2 [Devlog #003]
Table of Contents
DirectX12を使った描画処理
環境構築の続き
プリコンパイル済みヘッダーの追加
Source
フォルダ以下にstdafx.h
とstdafx.cpp
と追加
dev-dx12-202308(プロジェクト名)
└─ Source
├─ Application
│ ├─ Application.h
│ └─ Application.cpp
├─ Graphics
├─ System
│ └─ Window
│ ├─ Window.h
│ └─ Window.cpp
├─ stdafx.h
└─ stdafx.cpp
プロジェクトのプロパティの設定からプリコンパイル済みヘッダー
を使用(/Yu)
に設定(プリコンパイル済みヘッダーファイルはstdafx.h
)

プロジェクトのプロパティの設定から必ず使用されるインクルードファイル
にstdafx.h
を追加設定

追加したstdafx.cpp
のプロパティの設定からプリコンパイル済みヘッダー
を作成(/Yc)
に設定(プリコンパイル済みヘッダーファイルはstdafx.h
)

以下コード
// stdafx.h
#pragma once
// 基本
#pragma comment(lib,"winmm.lib")
#define NOMINMAX
#include <Windows.h>
#include <iostream>
#include <cassert>
#include <wrl/client.h>
// STL
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <array>
#include <vector>
#include <stack>
#include <list>
#include <iterator>
#include <queue>
#include <algorithm>
#include <memory>
#include <random>
#include <fstream>
#include <iostream>
#include <sstream>
#include <functional>
#include <thread>
#include <atomic>
#include <mutex>
#include <future>
#include <fileSystem>
#include <chrono>
#define _USE_MATH_DEFINES
#include <math.h>
// stdafx.cpp
# include "stdafx.h"
スマートポインタ"ComPtr"の追加(初期化に使用)
ComPtrとは、MicrosoftのC++言語用のスマートポインタ型で、COM(Component Object Model)オブジェクトの参照カウントを自動的に管理するためのユーティリティ
参考:https://cocoa-programing.hatenablog.com/entry/2018/11/16/000242
COM(Component Object Model)は、オブジェクトのライフタイムを管理するために参照カウント方式を採用しており、参照カウントに応じてメモリの解放を行う
DirectXの大部分はCOMオブジェクトで実装されている
System
フォルダにUtility
フォルダとSystem.h
を追加し、Utility
フォルダにUtility.h
、Utility.cpp
を追加
dev-dx12-202308(プロジェクト名)
└─ Source
├─ Application
│ ├─ Application.h
│ └─ Application.cpp
├─ Graphics
├─ System
│ ├─ Utility
│ │ ├─ Utility.h
│ │ └─ Utility.cpp
│ ├─ Window
│ │ ├─ Window.h
│ │ └─ Window.cpp
│ └─ System.h
├─ stdafx.h
└─ stdafx.cpp
stdafx.h
でSystem.h
をインクルード
//stdafx.h
#include "System/System.h"
どこでも使うプログラム(今回はUtility.h
)はSystem.h
でインクルード
//System.h
#include "Utility/Utility.h"
ComPtrはstdafx.h
で<wrl/client.h>
をインクルードしているので使用可能
ComPtrの実際の使われ方
Microsoft::WRL::ComPtr<ID3D12Device> device; // deviceはCOMオブジェクト名
Microsoft::WRL::ComPtr<>
を省略するためのusing宣言
//Utility.h
using Microsoft::WRL::ComPtr;
Utility.cpp
は以下のようにする
//Utility.cpp
#include "Utility.h"
デバッグ時にメモリリークを自動検出するため、Visual C++のランタイムライブラリにあるデバッグルーチンと呼ばれるデバッグ専用の関数の中にある_CrtSetDbgFlag
関数を利用してメモリリークを検出する
参考:http://marupeke296.sakura.ne.jp/TIPS_No7_SearchMemoryLeak.html
ComPtrの初期化関数CoInitializeEx()
と解放関数CoUninitialize()
をApplication.cpp
で呼び出す
参考:https://learn.microsoft.com/ja-jp/windows/win32/learnwin32/initializing-the-com-library
//Application.cpp
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
Application::Instance().Execute();
CoUninitialize();
return 0;
}