Open6

em2native: Win32対応

okuokuokuoku

というわけで、ビルド環境の準備が一巡したので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はファイルシステムをどう扱うか良いアイデアがない。専用品を別途用意するしかないかも。

okuokuokuoku

raw filesystem デプロイメント

UWPやAndroid、iOSでは、プラットフォームの持つパッケージシステムを直接使用してアセットにアクセスしている。(Androidはアセットの圧縮機能が存在するためOSカーネルのファイルアクセス機能を直接使えないという制約がある。)

Win32も、一応これらに相当する仕組みが .exe のリソースという形で存在するが、ちょっと取り回しが悪いため、 .exeの横にフォルダを作り、そこに置く というシンプルな仕組で実装することにした。

SDLはこのような機能を提供していないが、例えばlibuvの uv_exepath APIのように相当機能を提供しているライブラリは割と存在する。

okuokuokuoku

.slnを生成するとダメ

GPUデバッガを使うために.slnを生成すると諸々あやしい感じに。。

アセットファイルをコピーするコマンド1つ1つが deploy_0deploy_4 のようなプロジェクトとして生成されてしまうので、実際のゲームだと間違いなく破綻してしまう。Androidとそれ以外でdeploy手法を分けるか、単純にCMakeスクリプトを用意して一発走らせるだけにするとかにした方が良さそうだな。。

あと

  • Visual Studio generatorだとマルチプロセッサコンパイル( /MP )が有効になってない。。
  • ターゲットのexecutable pathにアセットをコピーする必要があるのに CMAKE_CURRENT_BINARY_DIR にしているのでVisual Studioのようなマルチconfigurationなgeneratorに対応できていない

要修正。

okuokuokuoku

直した

https://github.com/okuoku/em2native-proto/commit/b0d16b5a790fb8a11ae69142500f6df40f08873d

https://github.com/okuoku/em2native-proto/commit/7f9e8a228c2f7c07a932af3231fb1beb44a1e916

CMAKE_CFG_INTDIR とか存在を忘れてた。。基本的にはGenerator expressionを使えというのが最近のCMakeだけど使えないところもあるので。

あとはアセットのビルドルール再考か。。

重大な問題は、ちょっと修正する度に冒頭の表にあるそれぞれのビルドも(本来)確認する必要があり非常に面倒な点。。さっさとCIを組まないといけない。

okuokuokuoku

すっきりさせた

https://github.com/okuoku/em2native-proto/commit/e20f0c9963bfac40d8bb3d16d9d5c3c0dccd5ed4

ついでにAndroidのビルドが壊れたのも直した。elseelseif を取り違えるバカみたいなミスと、リンク順序を修正。

https://github.com/okuoku/em2native-proto/commit/50459161ecd2931d9ce17c93e1131dcbae6e8519

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 のように中身を書いてもエラーにならない)