em2native: Win32対応
というわけで、ビルド環境の準備が一巡したのでPCビルドを復活させたい。基本的にモバイル系のパッケージビルドをCIで担保しつつ、機能開発はPCを中心に行うことになる。
最終的な対応ビルドの予定
形状 | プラットフォーム | GUI | GPU | パッケージング | |
---|---|---|---|---|---|
PC | Win32 | Win32 | DirectX 11 | raw filesystem | |
PC | Win32 | Win32 | Vulkan | raw filesystem | |
✅ | TV | UWP | UWP | DirectX 11 | UWP |
PC | Linux | X11 | Vulkan | raw filesystem | |
PC | Linux | X11 | OpenGL ES2(Mesa) | raw filesystem | |
TV | RaspberryPi | EGL | OpenGL ES2(Broadcom?) | raw filesystem | |
✅ | PC | macOS | Cocoa | Metal | OSX Bundle |
✅ | 電話 + TV | iOS / iPadOS | UIKit | Metal? | OSX Bundle |
TV | tvOS | UIKit | Metal? | OSX Bundle | |
✅ | 電話 + TV | Android | Android | OpenGL ES2 | .apk |
電話 + PC | Emscripten | HTML5 | WebGL1 | ??? |
OpenGL ESを直接使用しないものは全てANGLE。
iOSはMetalに移行予定(iOS対応版のANGLEを使うか、Cocoa部分を手パッチするかは考え中。)
Linux + Waylandはまだちょっとシステムの理解が不足していて実装できるかどうかがよくわかっていない。
Emscriptenはファイルシステムをどう扱うか良いアイデアがない。専用品を別途用意するしかないかも。
raw filesystem デプロイメント
UWPやAndroid、iOSでは、プラットフォームの持つパッケージシステムを直接使用してアセットにアクセスしている。(Androidはアセットの圧縮機能が存在するためOSカーネルのファイルアクセス機能を直接使えないという制約がある。)
Win32も、一応これらに相当する仕組みが .exe
のリソースという形で存在するが、ちょっと取り回しが悪いため、 .exeの横にフォルダを作り、そこに置く というシンプルな仕組で実装することにした。
SDLはこのような機能を提供していないが、例えばlibuvの uv_exepath
APIのように相当機能を提供しているライブラリは割と存在する。
- Win32: https://github.com/libuv/libuv/blob/cc506dd97c7348abb54ef5c51eb563e1b512b45f/src/win/util.c#L96
- Linux: https://github.com/libuv/libuv/blob/47e0c5c575e92a25e0da10fc25b2732942c929f3/src/unix/procfs-exepath.c
- macOS: https://github.com/libuv/libuv/blob/1addf9b88a17bc32d009d377a14d540ccddd06db/src/unix/darwin.c#L75
書けた
バカだと思われるといけないからこういうコードも真面目に書くべきかもしれないな。。まぁ後で警告退治大会を実施するって事で。。
.slnを生成するとダメ
GPUデバッガを使うために.slnを生成すると諸々あやしい感じに。。
アセットファイルをコピーするコマンド1つ1つが deploy_0
〜 deploy_4
のようなプロジェクトとして生成されてしまうので、実際のゲームだと間違いなく破綻してしまう。Androidとそれ以外でdeploy手法を分けるか、単純にCMakeスクリプトを用意して一発走らせるだけにするとかにした方が良さそうだな。。
あと
- Visual Studio generatorだとマルチプロセッサコンパイル(
/MP
)が有効になってない。。 - ターゲットのexecutable pathにアセットをコピーする必要があるのに
CMAKE_CURRENT_BINARY_DIR
にしているのでVisual Studioのようなマルチconfigurationなgeneratorに対応できていない
要修正。
直した
CMAKE_CFG_INTDIR
とか存在を忘れてた。。基本的にはGenerator expressionを使えというのが最近のCMakeだけど使えないところもあるので。
あとはアセットのビルドルール再考か。。
重大な問題は、ちょっと修正する度に冒頭の表にあるそれぞれのビルドも(本来)確認する必要があり非常に面倒な点。。さっさとCIを組まないといけない。
すっきりさせた
ついでにAndroidのビルドが壊れたのも直した。else
と elseif
を取り違えるバカみたいなミスと、リンク順序を修正。
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b0e3321..407f40e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -189,7 +189,7 @@ if(WIN32 OR WINDOWS_STORE)
# dx11 (Yuniframe)
d3d11
)
-else(YFRM_CWGL_USE_METAL)
+elseif(YFRM_CWGL_USE_METAL)
# FIXME: Pass these from yuniframe
set(platform_deps
"-framework QuartzCore" # for CALayer
10年以上CMakeやってんのに未だにこういう間違いをする。。
(CMakeでは else()
コマンドとして else
を書く必要があり、 elseif
のように中身を書いてもエラーにならない)