スマホのアプリ開発を検討する際に、ネイティブ言語と中間プラットフォームのどちらを選択するべきか迷う方は多いのではないでしょうか? ネイティブ言語であるObjective-C/SwiftやJavaを選択するほうがパフォーマンスが高いと言われていますが、それで開発すると固有のOSだけにしかデプロイできません。中間プラットフォームであるAdobe AIRUnityを使うとiOSとAndroidの両方にアプリをデプロイできますが、見返りにネイティブと比べてパフォーマンスが低下すると言われています。

本記事ではスマホアプリ開発の技術選定の参考になることを目指し、異なる4種類の技術を使ってiOSでの描画パフォーマンスを検証しました。

今回使用したテクノロジー・フレームワーク

検証動画

※動画はiPhone 6 Plusで検証したものとなります。他の端末で検証した結果は下記に記述しています。

iOS端末における描画パフォーマンスの検証結果

検証結果は次のグラフにまとめました。スコアが大きいほどパフォーマンスが高いことを示しています。 20150421_bunny_performance_グラフ

検証環境の仕様

検証デモ

今回の検証は記事「ブラウザのCanvas/CSS3描画パフォーマンス徹底検証」でも使用したBunnyMarkで検証しています。Bunnyの表示は「移動スピード・方向」「回転」「拡縮」「透明度」をランダムで適用し、毎フレーム移動をさせています。時間経過とともにオブジェクト数を増やし、直前3回のフレームレートの平均が30fpsを下回った段階での表示されているオブジェクトの個数をスコアにしています。

上記のデモは「PhoneGap」用の検証デモを、Webページとして掲載したものです。4種類のテクノロジーそれぞれで同一の動作する検証デモを用意しました。

表示オブジェクトの生成コードの紹介

  • Swift (Sprite Kit)
let sprite = SKSpriteNode(imageNamed:"bunny.png")
  • Unity
/** bunnySpriteはSpriteRendererとスピードを保持できるスクリプトを持ったPrefab */
Transform transform = Instantiate(bunnySprite) as Transform;
  • Adobe AIR (Stage3D と Starling)
var image:Image = new Image(Texture.fromBitmapData(bitmapData));
  • PhoneGap (WebGL と pixi.js)
var sprite = new PIXI.Sprite(texture);

検証の結果

  • ほとんどの端末で Swift > Adobe AIR > PhoneGap > Unity の順でパフォーマンスが高い傾向が確認できた (Swift が一番スコアが良い)
  • 「Swift」で作成したアプリは他の方法で作成したアプリより108%〜190%ほど良いパフォーマンスがでている。
  • 「iPad 2 Air」上での「Swift」は突出してパフォーマンスが良い。
  • 中間言語を使うものとしては「Adobe AIR」が最もパフォーマンスが良好だった。
  • 「iPhone 5」上ではどのテクノロジーも「iPhone 6」の半分ほどしかパフォーマンスが出ない。
  • 「Unity」は比較的パフォーマンスが優れない傾向があった。
  • Adobe AIR (Stage3D)とPhoneGap(WebGL)は低レベルではともにOpenGL ES 2.0を使っているが、スコアに差があるのは言語の違いかもしれない。前者はActionScript 3.0がアプリ生成時にコンパイルされるものの、後者はJavaScriptがWebView内で実行されている形である。

まとめ

冒頭の説明の通りiOSのネイティブ開発言語であるSwiftが最も良好な結果でしたが、中間言語を使った場合はSwiftよりも52〜92%ほどのパフォーマンスとなりました。iOS/Androidの両方にデプロイできる(工数を削減できる)見返りが52〜92%のパフォーマンス低下だと考えると、中間プラットフォームを採用するメリットは十分あるかと思いました。一画面に同時に2000以上の表示オブジェクトを表示可能ということなので、多くの2Dアプリ開発に必要十分なパフォーマンスをクリアしているのではないでしょうか。

アプリ開発はパフォーマンス以外の観点もありますので、選定基準の一つとして参考にして頂ければ幸いです。Android (Java)やCocos2dなど他の中間プラットフォーム等、今回実施できなかった検証は本記事の評判がよければ実施したいと思います。

今回作成した検証コードはこちらです。