Updated at: 2013-12-16

Adobe AIR ゲーム開発メモ

リンク集




  • Starling 関連
    • Showcase
    • Extension の下の方にある関連記事のリンク集とかおもしろい



ActionScript 3.0 一般

AS3 Tips

null と undefined

  • JS のノリで undefined とか null とか使うと事故るよ
    • AS3 は型ごとにデフォルト値決まってる
    • Boolean は false, int/uint は 0, Number は NaN, 後は大体 null
    • 未宣言とか * で型指定ない場合が undefined
    • Boolean, int/uint, Number は null 入れられない
      • null 入れるとデフォルト値に変換されるので注意
      • Number に null 入れて if (num == null) とかダメ
      • そういうときは Number に NaN 入れて if (isNaN(num)) ってやる

ASC2.0 をコマンドラインから使うとコンパイル時間長くね?

配列の走査のパフォーマンス

すごく適当に実験してみた。

[0, 1, 2, 3, ... 999999] の要素数 100 万の配列 list があったとして、 色んな書き方で走査して終了までの時間を flash.utils.getTimer() で計測する。 当然実行するたびに値揺れるけど、傾向を見るのにやってみた。

  • 昔ながらのやり方で書く
  • 233 ms くらい

    for (var i:int = 0;  i < list.length;  ++i) {
        tmp = list[i];
    }
    

  • length を外に出す
  • 133 ms くらいで、確かに速くはなる

    var len:int = list.length;
    for (var i:int = 0;  i < len;  ++i) {
        tmp = list[i];
    }
    

  • 現代人がよく書くやつ
  • 156 ms くらい。概ねこれで問題ない

    for each (var val:int in tester) {
        tmp = val;
    }
    

  • Array クラスの forEach
  • (引数面倒だし使うことはないだろう。 JS と違って最初から for each あるし)
  • 318 ms くらい。関数コールのオーバヘッドはこんなもん

    list.forEach(function(val:*, index:int, array:Array):void {
        tmp = val;
    });
    

  • オブジェクトのキーの走査に使うやつを配列で
  • 5522 ms もかかったのでダメだ。 i がほしい時は昔ながらので書くべし

    for (var i:String in list) {
        tmp = list[i];
    }
    

Array から Vector への変換

こんな書き方をする

var vector:Vector.<String> = new <String>["a", "b", "c"];

またはビルトインの Vector のグローバル関数を使う。 これは Vector から型の違う Vector への変換にも使える。

var array:Array = ["a", "b", "c"];
var vector:Vector.<String> = Vector.<String>(array);

【参考】Vector の新しい初期化方法 (Flex 4 & Flash Professional CS5)

立ち上げ時の背景色 2〜3 秒出るの気になるよね問題

  • Feathers のサンプルコード の showLaunchImage() が参考になる
    • Starling の初期化前に Flash の DisplayObject で画像 addChild してる感じかな

画像の解像度って

  • できるだけ 1 枚にまとめたいけど、どれくらいのサイズまで安定して使えるんだっけ?
    • 要は端末の OpenGL のスペックによりけりだろうけど
    • Android がどれくらい 2048 x 2048 を許容できるか、がキモかな
    • 1024 x 1024 なら大抵大丈夫だからそれで頑張るか
      • その場合 960 x 640 の背景画像はそれだけで 1 枚みたいになっちゃうけど、まあ背景ならいいか

圧縮テクスチャ

メモリのマネジメント

GC

  • Scout とか Starling のモニター見てたりする感じだと、律儀に null 入れてやったりするのは効果ありそう
    • System.gc() 呼んだときに解放されないものでも、時間が経つと解放されたりするので gc() 信用してはダメ
    • 循環参照してても、基本的に ROOT から辿れないものは GC 対象になるっぽいが、 あまりに複雑に循環してる固まりが ROOT から浮いた状態になってると、GC は「諦める」らしい
    • お互い参照してるところ(何かを登録する系だとよくある)ではインスタンス破棄時に null 入れてあげよう

参考リンク

インスタンスの消費メモリ

  • flash.sampler.getSize(obj) で obj のメモリサイズ(Byte)がとれるよ!

バッテリー消費

mp3 ってライセンス的にどうなんすかね

  • 正式なところまだわかってない
    • フォーラムにも書き込みあるけど回答ない
  • でも Flash / AIR って基本読み込めるの mp3 だしね…

  • 商用利用じゃなければ関係ない
  • ライセンス払うならゲームごとに 3750 ドル

mp3 どうしても避けたいなら

  • .fla にライブラリで wav 読み込んで、書き出しの設定を mp3 じゃなく raw にする
    • swc に書き出して、ゲームではそこから音源を読み込む
    • ファイルサイズの比較
      • mp3 44 kHz / Stereo / 128 kbps で swc にすると 1 分 0.8 MB くらい
      • wav 22 kHz / Stereo で swf にすると 1 分 5.0 MB 弱くらい
    • wave でやると周波数半分で 6 倍くらいファイルサイズ大きい。 単純に非圧縮か。これは使えないな…

  • もしくは ANE 書く
    • 誰もそんなことやりたがらないけど

zip のダウンロードとかアップロード

実機でのファイルの保存先ってどうするのが正しいの

iOS の参考リンク

  1. ユーザが生成した情報、またはアプリだけでは生成できない情報のみ /Documents ディレクトリ以下に保存し、自動的に iCloud にバックアップされる
  2. 再ダウンロード、あるいは再生可能なデータは /Library/Caches ディレクトリ以下に保管する
  3. 一時的な利用のためのデータは /tmp ディレクトリ以下に保存する。これらのファイルは iCloud にはバックアップされないが、余分な記憶領域を使用しないよう、不要になったら削除する
  • 2 はこうとれるけどマジか

    var path:String = File.applicationDirectory.nativePath + "/\.\./Library/Caches";
    cacheDir = new File(path);
    

  • いや AIR 3.6 (2013 年 3 月) からこれでいける

    File.cacheDirectory.nativePath;
    

  • もしくはファイル単位で iCloud 対象にならないように指定
  • AIR 3.6 以降、iOS 5.1 以降で利用可能
  • ディレクトリに対して使えばそのディレクトリ以下全て iCloud 対象じゃなくできる

    var foo:File;
    foo = File.applicationStorageDirectory.resolvePath("foo.txt");
    foo.preventBackup = true;
    

Android の参考リンク

外部メモリにインストールした場合でも、アプリケーション記憶域ディレクトリの内容、共有オブジェクト、 一時ファイルなどのアプリケーションキャッシュおよびユーザーデータは、内部メモリに保存されます。 内部メモリを使用し過ぎないように、アプリケーション記憶域ディレクトリに保存するデータは慎重に選択してください。 大量のデータは File.userDirectory または File.documentsDirectory の場所を使用して、 SD カードに保存してください(これらの場所は両方とも Android の SD カードのルートにマッピングされます)。

app-storage: ってあれどこに保存されるの

とはいえ結局

  • 世の中のアプリは Android の内部ストレージに保存してる
  • 2011 年頃に内部ストレージなさすぎのイケてない端末(acro とか)あったけど、もう時効かな
  • 長期でプレイして累計 200 MB くらいまでなら保存してもよいかな
  • iOS で iCloud 対象になっちゃうところが気になるくらい

Mac での開発時、SharedObject ってどこに保存されてるの

/Users/your.name/Library/Application\ Support/com.your.app-id/Local\ Store/
  • app-storage: で保存したアセットや sqlite のファイルもここに保存される

フォントの埋め込みとかってどうやるの

AIR の WebView

BASIC 認証

  • どうやら StageWebView だと BASIC 認証通せないっぽい?
    • http://user:pass@... みたいに埋め込んでみてもダメだった
  • URLRequest は普通に Request Header に渡してやれば通るけど

iPad の Retina ってそこまで対応しなくね

  • config の xml に以下を足すと、「新しい iPad」において 2048 x 1536 ではなく 1024 x 768 ターゲットで描画を行う

<requestedDisplayResolution excludeDevices="iPad3">high</requestedDisplayResolution>

  • 当然こちらの方が描画パフォーマンスは上がる
  • フォントや解像度高く入れた画像は iPad 〜 iPad2 相当の見た目になるが、概ね気にならないだろう
  • スマフォターゲットだと iPhone 4 の 960 x 640 レベルでゲームの画面を作ることが多いと思うので、 パフォーマンスを優先するならやっておいてもよい
  • iPad Air 系列も Retina 避けたいなら "iPad4" を指定する