はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX ビルドの壁

あいさつ

ビルドの壁に阻まれていたはかせです。
VS2017を使っているのですが、
いままでUnityぐらいしかろくにやってこなかったもので
結構詰まりましたw
今回はそこで得た知見をまとめたいと思います。

VS2017のビルドの種類

visual studio2017のビルドには大きく分けて2種類あります。

Debug
多分なんもしなければこれになってると思います。
名前の通りデバッグ用のビルドです。

Release
リリース用のビルドです。
コードの最適化が行われ動作速度とかが向上します。

見る限りだと問答無用でReleaseビルドで良さそうに思います。
ただReleaseビルドだとコードの最適化により、
プログラムがプログラマーが書いたものとは大きく変わってしまうようです。
よってバグなどが起きたとき原因がわかりづらいみたいです。

またDebugビルドだとメモリの上書き検知の機能など、
よりデバッグに特化したビルドになるそうです。
あとDebugビルドではコードの最適化は原則禁止らしいです。

なのでDebugビルドでバグをつぶしReleaseビルドで仕上げるというのが一般的みたいです。

ただDebugビルドだと出ないがReleaseビルドだとバグがでる、そんなケースもあるみたいです。
これはそれぞれのメモリアロケータが違うとか、
コードの最適化の結果とか色々理由はあるっぽいです。

今回詰まったこと

①Debugビルドしたexeを実行しようとしても動かない
②Releaseビルドしようとしても出来ない
この2つです。

Debugビルドしたexeを実行しようとしても動かない

①はいつも通りF5でデバッグしたものをexeから実行したいと思い試したら遭遇しました。
F5で実行するとなんの問題もなくできるのに、exeからはできない・・・

ネットでググってもそれっぽいものはあんまないし、
あって試しても解決しないしで途方に暮れていました。

解決

一言で言うとパスがありませんでしたw
私のプログラムは
・シェーダー
・画像
・音

この3つを外部ファイルから読み込み使っています。
そのファイルへのパスが違っていたのです。

今まではこんな感じのフォルダ構成で実行していました。
f:id:hakase0274:20181126190459p:plain

んで、実行しようとしたフォルダは
f:id:hakase0274:20181126190736p:plain

同じ階層に必要な外部ファイルがありませんね・・・
結果読み込みに失敗して実行できなかったわけです。
(ここで実行できないならF5でも失敗してほしいもんです)

必要なフォルダを同じ階層においてやったらなんの問題なく実行できましたw

Releaseビルドしようとしても出来ない

これはしょーもないんで解決から。
①Releaseビルドのパスを設定していなかった
②DirectXTexのライブラリをDebugビルドでしていた

・・・・
どっちもアホですねw
はい。ただのポカミスでした。
現場からは以上です。

ついでに小ネタ

今回できないできない言ってリビルドしたら、
c4316 ていうwarningがでました。

これはアラインメントがおかしいぞっていうものです。

アラインメントについては以下のサイトが詳しいです。
データ型のアラインメントとは何か,なぜ必要なのか?

簡単に言うと読み書きの効率化のためにメモリをキレイに並べることです。
このwarningはDirectX::XMMATRIXを使っているところで出ていました。
なにやら調べたところ、windowsのアラインメントが8なのに対し、
DirectX::XMMATRIXは高速化のために16でアラインメントしてるそうです。

メモリのアラインメントを変えるには
new/deleteをオーバーライドする方法があるそうです。

実装は以下のサイトを見てやりました。ほぼ同じです。
qiita.com

あとがき

今回はホントにパスとかの設定の大事さを痛感しました・・・
ただ解決のために色んなことを調べまわって知識が増えたので
まぁいいかって感じです。

それでは今回はこの辺でノシ

今回作ったものはgithubに上げました
github.com