やや濃厚なソース

プログラミングやゲームについて。

UnityでのPSVita開発

普段Android端末でチェインクロニクルをやっているのですが、
PSVita版もやってみようと思い遊んで見ました。
チェインクロニクル◆本格シナリオRPG/チェンクロ - Google Play の Android アプリ
が、時々カクカクして不規則にフレームレートが落ちてる?
と感じたのがきっかけです。

チェインクロニクルはUnityで開発されており、
1つのソースからAndroidiPhoneも、そしてVitaへも書き出せます。
なぜ、Vita版だけカクカクするんだろう?ガベージコレクション(GC)でも走ってるのかしら?
ということで実際に1ソースからAndroid,Vitaに書き出して調べてみました。
なおAndroidの端末はASUS製のZenfone5、2014秋に発売の中くらいの性能です。

まず2Dスプライトの描写でベンチマーク
Androidでは、1500個だと約19fps、2500個だと約11fps、3500個だと約7fps
f:id:hidetobara:20150114013752j:plain
Vitaでは、1500個だと約20fps、2500個だと約12fps、3500個だと約8fps
f:id:hidetobara:20150111233350j:plain
ほとんど両者変わらず、
というかVitaは3年前に販売されたものなのにこれだけの性能が出るのはさすがゲーム機だな、と感じました。

次にGCのテストです。
以下のように毎フレーム、無駄にメモリを消費させ、GCを働かせました。
Countの数を多くして負荷を徐々に上げました。

string box = "";
for (int i = 0; i < Count; i++) box += "a";
System.GC.Collect();

Androidでは、1500で28fps、2500で11fps
f:id:hidetobara:20150114013751j:plain
Vitaでは、1500で3fps、2500で3fps
f:id:hidetobara:20150111231358j:plain
あー、やっぱりボトルネックGCか。
確かに、ゲーム機のメモリ管理は伝統的に開発者がするものだし、
ゲーム機側ではあんまりうまくGCしてくれないんだろうな、というのは推測できました。
昔のAndroid、特に1.xの時もゲーム中にGC走ると、フレームレートすごく落ちたし、
最近のスマホOSはすごくうまくGCしてるんだなあ、と思いました。

このように、ちょっと実験してみて、
Unityで開発したAndroid, iPhoneアプリ
Vitaに移植するのは、特にリアルタイム系のゲームでは一筋縄ではいかないんだろうなあ、
と感じました。