Updated at: 2013-12-16
Adobe AIR ゲーム開発メモ
リンク集
- ゲームエンジン / フレームワーク
- ツール開発
- Starling 描画系
- [AS3] 2D lighting with normal map, take 2
- onebyoneblog
- Filters in Starling
- ピクレセートとかポスタリゼーションっぽいの
- Starling Filter Collection
- 色々使えそうなフィルタがたくさん
- Filters in Starling
- KrechaBlog
- ミミズみたいなぐにゃぐにゃとか
- Deferred shading extension for Starling..
- 法線マップのアレ
- Displacement maps and Metaballs
- Forum - Light rings using BlendMode
- ライティングっぽいのどうやればいい? スレッド
- Forum - Where to learn how to write simple shaders?
- AGAL とか学び始める時のよいリソースのリンクがある
- Forum - work in progress: Starling extension for lighting and dynamic shadows
- 2D の shadow casting の demo と extension のソースがある
- Digging more into the Molehill APIs
- AGAL の記事
- nekobit.eu
- おもしろい Demo が色々
- AS3 とか Starling とか読み物とか
- akihiro kamijo さんのブログ
- Adobe の中の人
- (blog) Pierre Chamberlain
- CRT ディスプレイな shader が素敵
- Adobe Flash Platform
- AS3 / AIR / Stage3D まわりの情報
- TypedArray.org
- サイトデザインがおしゃれ
- Quick As A Flash: Optimization Strategies for AS3 and Flash
- AS3 / Flash のパフォーマンスのスライド(ちょっと古い)
- Pete Shand | Flash and New Media
- Haxe とか Starling + Away3D とか
- akihiro kamijo さんのブログ
- Stage3D
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 をコマンドラインから使うとコンパイル時間長くね?
- 参考リンク
- FCSH with new AIR / ASC2.0 compiler (faster compilation iterations)
- http://jcward.com/FCSH+for+ASC+2.0+Compiler
- 試してみたけど俺の環境だと ascshd の立ち上げに 7 秒くらいかかって差し引きゼロだった……
配列の走査のパフォーマンス
すごく適当に実験してみた。
[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);
立ち上げ時の背景色 2〜3 秒出るの気になるよね問題
- Feathers のサンプルコード
の showLaunchImage() が参考になる
- Starling の初期化前に Flash の DisplayObject で画像 addChild してる感じかな
画像の解像度って
- できるだけ 1 枚にまとめたいけど、どれくらいのサイズまで安定して使えるんだっけ?
- 要は端末の OpenGL のスペックによりけりだろうけど
- Android がどれくらい 2048 x 2048 を許容できるか、がキモかな
- 1024 x 1024 なら大抵大丈夫だからそれで頑張るか
- その場合 960 x 640 の背景画像はそれだけで 1 枚みたいになっちゃうけど、まあ背景ならいいか
圧縮テクスチャ
- 各プラットフォーム向けの圧縮テクスチャまとめてくれる ATF (Adobe Texture Format) ってのがある
- きれいなATF (Adobe Texture Format)ファイル の作り方 - Togetter
メモリのマネジメント
GC
- Scout とか Starling のモニター見てたりする感じだと、律儀に null 入れてやったりするのは効果ありそう
- System.gc() 呼んだときに解放されないものでも、時間が経つと解放されたりするので gc() 信用してはダメ
- 循環参照してても、基本的に ROOT から辿れないものは GC 対象になるっぽいが、 あまりに複雑に循環してる固まりが ROOT から浮いた状態になってると、GC は「諦める」らしい
- お互い参照してるところ(何かを登録する系だとよくある)ではインスタンス破棄時に null 入れてあげよう
参考リンク
インスタンスの消費メモリ
- flash.sampler.getSize(obj) で obj のメモリサイズ(Byte)がとれるよ!
バッテリー消費
- ある程度エネルギー食いなのは AIR 依存で仕方ないかなー
- Android とか AIR 上で中間コード実行する感じだしね
- iOS はネイティブコードに変換されてるのでマシかな
- スリープ時も、実は FPS 4 でスクリプトが動いてる
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 の参考リンク
- ユーザが生成した情報、またはアプリだけでは生成できない情報のみ /Documents ディレクトリ以下に保存し、自動的に iCloud にバックアップされる
- 再ダウンロード、あるいは再生可能なデータは /Library/Caches ディレクトリ以下に保管する
- 一時的な利用のためのデータは /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: ってあれどこに保存されるの
- (Adobe 公式) アプリケーション記憶領域ディレクトリの参照
- Mac, Win, Linux, Android の説明がある
- Android は内部ストレージを食うことに注意
とはいえ結局
- 世の中のアプリは Android の内部ストレージに保存してる
- 2011 年頃に内部ストレージなさすぎのイケてない端末(acro とか)あったけど、もう時効かな
- 長期でプレイして累計 200 MB くらいまでなら保存してもよいかな
- iOS で iCloud 対象になっちゃうところが気になるくらい
Mac での開発時、SharedObject ってどこに保存されてるの
/Users/your.name/Library/Application\ Support/com.your.app-id/Local\ Store/
- app-storage: で保存したアセットや sqlite のファイルもここに保存される
フォントの埋め込みとかってどうやるの
- Embed ってしたくないんだけど
- swf に埋め込んで動的に読み込む
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" を指定する