強火で進め

このブログではプログラム関連の記事を中心に書いてます。

SCEの中の人が紹介されていたPlayStation Mobileプログラムの最適化テクニックやTips

同人・インディーゲーム部会(SIG-Indie) 第10回研究会「PlayStation Mobileの現状と可能性」に行って来ました。

IGDA Japan chapter - IGDA日本 同人・インディーゲーム部会(SIG-Indie) 第10回研究会「PlayStation Mobileの現状と可能性」【6月1日(土) 11:20-】東京
http://www.igda.jp/modules/bulletin/index.php?page=article&storyid=1014

Togetterまとめ

IGDA日本 同人・インディーゲーム部会(SIG-Indie) 第10回研究会「PlayStation Mobileの現状と可能性」 - Togetter
http://togetter.com/li/512512

このイベントでSCEさんが紹介されていたPlayStation Mobileプログラムの最適化テクニックやTipsがとても有用だったのでまとめておきます。

よくある問題に対するTIPS

  • パフォーマンスが思ったほど良くない
    • まずはStopwatchクラスを利用してボトルネックを見つけるところから
      • ElapseMilliseconds 経過時間の合計を取得(ミリ秒単位)
      • ElapseTicks 経過時間の合計を取得(タイマ刻み) ※こちらの方が細かい刻みで測定できる
  • 重い処理はCPU処理なのか、描画なのか?
    • 描画と言っても、GPU内の処理そのものが重たいのではなく、CPU側からGPU側へのデータを送ったり、データのセットアップなどで時間がかかっている場合がある

実機での正しいパフォーマンスを知るには

  • Releaseモードでビルドする
  • PSMアプリのデプロイ後、DevAssistantのメニューからPSMアプリを立ち上げる。
    • PSM Studioから起動すると、実機とPC間の通信が行われるため、オーバーヘッドがかかる。

Debugビルド - Debug実行に比べて20〜30%早くなる

最適化オプションの有効化

  • パフォーマンスの向上
    • ソリューションの中から有効化したいプロジェクトを選択した状態でメニューから [プロジェクト] - [(ここにプロジェクト名)のオプション] - [ビルド] - [コンパイラ] - [最適化を有効にする]にチェック。



描画最適化のヒント

  • DrawArraysの呼び出し回数を減らす
  • SetTextureの呼び出し回数を減らす
  • テクスチャ一体化ツール UnifyTexture.exe ※ C:\Program Files (x86)\SCE\PSM\tools に有ります
  • SetVerticesの呼び出し回数を減らす
    • 頂点データはまとめてセットする
  • floatをshort,byte型に変更し、データ量を減らす。Vitaくらいの画面サイズで有ればshortで充分

よくある問題に対するTIPS

  • Vitaでテクスチャローディングが遅い
    • 現時点では圧縮テクスチャフォーマットがサポートされていないので、サイズの大きなテクスチャを読み込まないといけない
    • プロパティ「署名と暗号化」の設定でリソースからチェックをはずしてみる
      • SignedAndEncypted > Signed > Plain
      • ローディング時間を考えて、Plainを選ぶことも検討

(※筆者注)Android環境で有れば暗号化されてないとデータを簡単に見れることになると思われるのでその辺りが気になる場合は特にユーザに見られても問題無いUI関連の画像データなどのみ変更するなどの工夫が必要かと思われます。

(※筆者注:画像付きの「署名と暗号化」を外す手順解説)
1. 画像ファイルを選択
2. プロパティを開く

3. プロパティの項目をスクロールした最後に有る「Content Protection」の値を「SignedANdEncrypted」から「Plain」に変更する

※それぞれの項目の画面上での位置

  • メモリ使用設定について
    • 設定できるメモリ量は96MB
    • Resource Heap + Managed Heap = 96MB
    • SDK 1.10以降で、Resource Heapの使用量がSystemMemoryでチェックできるようになった
      • SystemMemory.Dump()で簡単にメモリ使用量がわかる
    • SDK内部で一時的に確保しているバッファはこのチェックで計測できないため、少し余裕を持たせる必要がある

よくある問題への対処

  • (ご迷惑をお掛けしております。現在修正中です…)

セーブデータの暗号化

  • アプリ内課金を実装する場合、セーブデータは暗号化しておきましょう
    • Sce.PlayStation.Core.Servicesのクラス AccountInfomation の UniqueID プロパティでユーザアカウントごとにユニークな値を取得できます
    • ユニークな値を種にして、セーブデータをSystem.Security.Cryptographyのクラスを使って暗号化し、セーブする。

(※筆者注)この方法で有れば全ステージクリア済みのセーブデータをネットにアップされた様な場合にもアップした本人のデバイス以外では正しく動作しなくなるので上手い方法ですね。

HighLevelライブラリ

GameEngine2Dのこれからの改善予定の部分

  • GameEngine2D
    • 要望の組み込み
      • 上で説明した描画最適化のTIPSを実装
      • 構造をシンプルに
      • 大量のスプライトを手軽に表示可能に
      • 初学者(中高生)でも理解可能に
    • 2Dゲームをより素早く作成可能に
  • より手軽に提出できるサービス
    • F2P(Free to Play:基本無料-アプリ内課金)のプログラムテンプレートを検討
      • メソッド呼び出しで購入ダイアログを表示

今後のロードマップに関して

  • ネットワークサービス用のAPI
    • PSNの利用したランキングシステムの実装検討を進めている
    • ランキングシステム以外についても、検討予定
    • Twitterサンプルなどの提供も予定
  • C#以外のプログラム言語のサポート
  • Luaへの対応を検討、実装を試している
  • Maya以外の3Dツールからのモデルデータ出力をサポート
    • ソースを公開する方向で利用者にカスタマイズして使用してもらうことを検討中
  • 低レベルなオーディオAPI、動画再生検討中

Unity

  • Unityを使っている方は、そのまま使えます!
  • Unityコンテンツを持っている人は、PSMのストアで販売可能!
  • PSMならカジュアルな2Dゲームや課金ゲーム、ハイレベルな3Dゲームも開発可能!

鍵、デバイスシード

    • パブリッシャー鍵
      • ライセンス購入が完了すれば発行可能
      • 基本的には一度作れば変更不要
        • 更新すると色々と面倒です(後述)
        • エクスポートしてバックアップしておくと安心
    • アプリ鍵
      • Application ID(Project Name)と 1:1 の対応
  • バイスシード
    • バイスごとの固有ID、みたいなもの
    • PSM Development Assiatantをインストールし直すと変わっちゃうので注意して下さい

バイスシード/アプリ鍵/アプリ鍵束/は全て1つの「パブリッシャー鍵」に紐づけて有るため、これを変えてしまうとデバイス(Vitaなど)にインストールされたそれらのデータを新たに差し替え直す作業が発生。テスト端末を沢山使っている場合にはかなりの手間に
※「アプリ鍵束」は複数の「アプリ鍵」を1つのグループとしてまとめたもの

アプリを実機テストする際のバッドノウハウ

Androidの設定

  • 充電中にスリープモードにならないように設定する事を推奨
  • (特にIS11Sは)自動回転もOffにしていおいた方が良い ※アプリ転送中に回転が行われると転送エラーになるそうです

PSM Development Assistant

  • 再インストールしたら前に使っていたアプリ鍵束を再作成
  • (Android)プロセスが死なずに残っている場合も(残念ながら)あるので、怪しい場合はAndroidの設定から強制停止して下さい
  • (Vita)巨大ファイル(500MB以上とか)のアプリをインストールする場合、スリープしない様にたまに画面をタップして下さい(SDK 1.20で修正)

PSM Studio、PSM Publishing Utility

  • PSM Device.exeというプロセスが残り続けるケースが(残念ながらかなり)あるので、その場合はタスクマネージャから強制終了して下さい