テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

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の範囲ではないが将来的にやりたい」との事。