Unity5はC#をC++化する技術でパフォーマンス大幅UPするかも
UnityのIL2CPP(C#をC++に変換する技術)だが、別のプラットフォームにも使うらしい。(正しくはC#の吐いたアセンブリをC++に直す。なのでjsもどきでも動作するっぽい)
そもそもIL2CPPはWebGL 具体的にはasm.jsに対応する為の技術として公開されていた(C++をJSへ変換する技術)。で、これを他のプラットフォームでも行う事が今日のUnity公式ブログにあった。
The future of scripting in Unity
(ユニティのスクリプトの未来)
凄く要約すると、こんな感じ。
・C#コードもC++化して最適化がかけられるのでパフォーマンスが2〜3倍上がる
・静的解析もできるんで深く最適化出来る
・.NET(Mono)がアップデートされるかも。Microsoftと共同で互換性を担保
・静的解析によりGCが減るらしい(スコープが短い処理はスタックに置くとか?)
・とりあえずWebGL版が上手く行ったら他にも移植する
・AOTと同じ制約
C#で記述したスクリプトをC++へ自動変換してパフォーマンスアップ…
これは地味に大きいと思う。そもそも何だかんだ言ってC#よりC++の方が細かくチューン出来るから、正しくチューン出来るなら高速で実行できる(特に大きな配列の扱いとか)。しかも技術的にはC#からC++へ変換してビルドするだけなので、ユーザーは今までどおり使いやすいC#でゲームが作れる(AOTにしても)。
Unityの処理の一部をC++で記述して高速化する話は実は少し前からあって、この記事では大体ボトルネックの処理を25倍くらい高速化したらしい。自分も検証した記事をその内上げる
面白いのが、システム自体がC++化することでマーシャルのコストがほぼ0になりそうな事。(この方法をサポートするかは不明だが)C++(アンマネージドコード)とC#(マネージドコード)がメッセージをやりとりする際、メモリの情報を一旦コピー等してお互い安全に使えるようにする。これがマーシャルでネイティブプラグインのコストな訳だが、これがお互いアンマネージドコードになることでコスト0になる事が予想される。(現状もunsafeやref使う事で突破出来ていそうな感じはあるが)
もっと極端に言えば、C++のソースをプロジェクトにぶち込めばC#から読んでくれるようになるかも。(だといいなあ)
もしコレが可能なら、基本的なゲームの流れはコーディングが容易で学習コストの低いC#で記述し、パフォーマンスが必要な部分(AIとか当たり判定、シリアライズ)はC++でコードを自作して最適化する・・・といった手法が来るかもしれない。(この辺りはUnityがどの程度C++のコードを最適化するかによって有用性は変わる)
もう一つ、.NETのバージョンが上がる事をほのめかしてる。Unityの.net(mono)は2.0改な訳だけど、それをついでに現代版にするとの事。ちなみにUnity Editor(ゲームを実行していない部分)はIL2CPP変換を前提とした.NETではなくmonoを継続して使う模様。一応どっちもアップデートされるっぽいかな。
ちなみにAOTなので、リフレクションやその他諸々のライブラリは使えない模様。要するにiOSと同じ制限。まあC++だし仕方な無いね。(でも静的リフレクションは使えたらいいなあ)
そう!
IL2CPPの力でUnityは最適化され、拡張性が上がり、.NETがバージョンアップし、汚いリフレクションは排除され、彼女が出来る(出来ません)
少し補足。
この高速化のキモは、C++の最適化技術を使えることにあると思う。AOTやJITの最適化もあるにはあるが、やはり細かくチューン出来るC++の最適化エンジンを使った方が良いと踏んだんだと思う(LLVMと比較してこの手段を選んだ所を見るに)
ちなみに、C++を開発言語に組み入れるのは、「IL2CPPの範囲ではないが将来的にやりたい」との事。