スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

AndEngine メモリ節約術 その1

ということでもないのだが、私が開発している中で嵌ってしまったことのメモ。


画像表示にSpriteを利用しているが、メモリ節約のため「ITextureRegion」を使いまわそう、とある。

そのため、ITextureRegionを使いまわしてSprite(AnimatedSprite)を作成していたのだが・・・





作成しているゲームの性質上、エフェクトを多用しているため敵と戦っているときに沢山の斬撃エフェクトをAnimatedSpriteで乱発させていたのだが、数分立ってくると画面全体がもっさり動作になってしまい、挙句の果てにスマホ自体の描画がおかしくなってしまったのだ。

たぶんだが、斬撃エフェクトが千個近く生成されてしまったのが問題みたいだ。

ITextureRegionは使いまわしているのだが、そのつどAnimateSpriteを生成して、アニメーションが終わったらdetachしているのだが・・・
やはり、当たり前だが貼り付けるSpriteは少ないほうがいいみたい。


そこで、以下の対応をした

1.同じSpriteは初めに作っておいて、detachもしくはアルファ値を0にして見えないようにしておく
2.表示のタイミングでattachもしくはアルファ値を1にして表示する。
3.アニメーションがある場合は、アニメーションの設定を行う。
4.アニメーションが終わったらdetach、またはアルファ値を0にして非表示する
5.また表示するときは1から始める


なにを当たり前のことを・・・っていうのは勘弁w

AndEngine初心者にはやることすべてが初めてなんでw

これやってない人にはお勧めですお。

AndEngine OutOfMemoryについて

AndEngineは気を付けてコーディングしないとOutOfMemoryが頻発する。

ついつい私みたいなJavaやC#に慣れている世代だと「メモリの解放」ということ自体が頭からないため困った困った・・・

■Spriteに読み込んだ画像の解放を忘れずに

私が参考にした以下参考書には書いていなかったのだが、、、



基本的にSpriteを作成するには以下の手順で作成する(はず・・・)
1.gameActivity.getResources().getAssets().open(ファイル)によるInputStreamの生成
2.InputStreamからBitmapの生成
3.BitmapのサイズをもとにBitmapTextureAtlasの作成
4.gameActivity.getEngine().getTextureManager().loadTexture()でBitmapTextureAtlasのロード開始
5.Spriteの生成

で、ゲーム内で画面(Scene)の切り替えなどの時に明示的に表示したSpriteを解放している。
Sprite.detachSelf()やnull格納など。

参考書には上記をやって「メモリ解放しよう」と記載されているが、これだけだと実はちゃんとメモリ解放できていない。

■BitmapTextureAtlasの解放

実は「BitmapTextureAtlas」の解放が必要なのだ。


なので、画面の切り替え時などにSpriteなどを解放するタイミングで、同じように「BitmapTextureAtlas」も解放してあげる。


bitmapTextureAtlas.unload();
bitmapTextureAtlas.clearTextureAtlasSources();
bitmapTextureAtlas= null;


上記三つやると問題ない(と思う・・・)

私はSpriteなどを生成するときに作成する「BitmapTextureAtlas」をどっかにstaticでリスト管理して、画面遷移時にまとめて解放処理を行っている。
※もちろんSprite表示中に「BitmapTextureAtlas」を解放しちゃうと画像が表示されないからね!!


これはAnimatedSpriteでも同じ

AndEngine SDカード上、Web上の画像でSpriteを作成する

AndEngineを利用した初ゲームアプリが完成しました。


ゲーム「バグズ・ウォーズ」
icon2.png


今までScriptの「enchant.js」を利用して作っていたのだが、FPSなどの問題で開発途中でAndEngineで作り直すことにした。
ネット上ではAndroidでのゲームアプリエンジンの本命だ、と言われているが、私もそうだと思う。

ちなみに参考にしたのがこの参考書。

他のAndEngineの参考書は見たことないのだが、これ1冊こなせばAndEngineの開発は一通りこなせると思う。


■assetsフォルダ以外からSprite、AnimatedSpriteを作成するには??



画像を表示するにはSpriteを利用するのだが、
この参考書だからなのかわからないが、基本的にもととなる画像はプロジェクトのassetsフォルダにある画像を利用しているのだ。

画像を扱うためのクラス内で、画像を読み込むためのパスルート(?)がデフォルトassetsフォルダが固定されているため、画像を読み込むときに指定するファイルパスはassetsフォルダからの相対パスを指定している。

しかし、今回このassetsフォルダ以外から画像を読み込む必要が出てきたからさーたいへん。

■拡張ファイルの利用


今回作成したバグズ・ウォーズは大量の画像ファイルを利用するため、APKが50MBを超えてしまった。
そのため、画像ファイルを拡張ファイルとして提供することにしたのだが、拡張ファイルを利用してしまったため、画像ファイルがassetsフォルダ以外に存在する状況となってしまった。

考えたのだが、このSDカード内に作成された画像ファイルを、アプリ起動時にassetsフォルダにロードすればいけるんじゃね??と思ったのだが、そもそもassetsフォルダはAPK内部に存在しており、assetsフォルダに後で追加するということ自体が不可能だということが分かった。



ということで、以下がSDカード内の画像をSpriteに読み込む方法。

■ソース

String fileName = "ファイルパス";
TextureRegion imageFromServer = null;
ITexture mTexture = new BitmapTexture(
gameActivity.getEngine().getTextureManager(),
new IInputStreamOpener() {
@Override
public InputStream open() throws IOException {
InputStream input = new FileInputStream(fileName2);
BufferedInputStream in = new BufferedInputStream(input);
return in;
}
});
mTexture.load();
textureList.add(mTexture);
imageFromServer = TextureRegionFactory.extractFromTexture(mTexture);

Sprite sp = new Sprite(0, 0, imageFromServer, gameActivity.getEngine().getVertexBufferObjectManager());


■ちなみにAnimatedSpriteは

String fileName2 = ""ファイルパス;
int column = 3;
int row = 3;
TiledTextureRegion imageFromServer=null;
ITexture mTexture = new BitmapTexture(
gameActivity.getEngine().getTextureManager(),
new IInputStreamOpener() {
@Override
public InputStream open() throws IOException {
InputStream input = new FileInputStream(fileName2);
BufferedInputStream in = new BufferedInputStream(input);
return in;
}
});
mTexture.load();
textureList.add(mTexture);
imageFromServer = TextureRegionFactory.extractTiledFromTexture(mTexture,column, row);
// AnimatedSpriteを生成
AnimatedSprite sp = new AnimatedSprite(0, 0, imageFromServer,gameActivity.getVertexBufferObjectManager());



■ちなみにWeb上の画像を読み込むには
InputStreamを以下に変更すればよい

//画像URL
URL url = new URL("http://aaaaaaaaaaaaa");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();


これでassetsフォルダ以外の画像データを扱うことができる。

Android enchant.js 各端末でのブラウザのパフォーマンス

昨年から暇を見つけてはAndroidでゲームアプリを作っている。

学生時代から社会人になってずっとシステムを作っていたのだが、JavaやC#などをメインに使った業務システムの開発が大半であり、ゲームの作成とは無縁の技術ばかり使っていた。

スキルでいうと、サーバの構築、Webの設定からWebサイトの立ち上げまで一人で出来るくらい。

いつかはゲームアプリを作ってみたいと思っていたが、そもそも持っている技術が畑違いだと思っていたため、躊躇していたかんじ。

そこで出会ったのが「enchant.js」
これはJavaScriptを使ってゲームを作るというエンジン。

日経ソフトウェアに「30分で作るゲーム」とかそんな感じの記事が書いてあった。

作ってみると本当に簡単に作れる。
もちろん凝ったものを作るとなると作りこみが必要になってくるが、得意な技術の一つがJavaScriptだったため、
自分にとってはとてもうれしいものだった。


そこで、これを利用してAndroidでのゲームアプリが作れないか考えてみた。

・AndroidにはWebViewオブジェクトがあり、これを利用するとアプリ内でHTMLページの表示が可能となる。
 もちろんローカル(assetsフォルダも)に保存しているHTMLページの表示も可。
・WebViewにはJavaScriptとJavaを相互に通信する仕組みがある。
 簡単にJavaScriptからJavaのメソッドが利用できたり、JavaからJavaScriptを制御することも可能。

整理してみたところ
・DB処理(SQLite)やバックグランド処理、ネット通信や重い処理はJava側にて実装
・画面をHTMLとJavaScript、enchant.jsで構築
・JavaからJavaScriptへ連携するデータはJavaScriptで使いやすいJSON形式にする

上記構成で既に数本のゲームを開発してきた。
ブログの右側にあります。

もちろんプロが作ったゲームなんかには足元にも及ばない出来だが、
スマホ用の簡単なゲームアプリだし、個人開発としては十分ではないかと・・・


■enchant.js 各端末でのブラウザのパフォーマンス

前置きが長くなったが、タイトルについて

Androidのアプリ開発で一番問題になるのが「端末の互換性」
Androidはその特性上、非常に沢山の端末がリリースされており、どの端末にもいろんな癖がある。

大手の会社などでは全ての端末が準備されており、アプリ開発時は全ての端末で動作確認が行われている。


しかし、自分みたいな個人だと、どうしても全ての端末での稼動確認が出来ない。
今現在は嫁の含めて5台ほどしか無い。

こればかりはしょうがないと思い、もってる機種全てで動作確認を行うのだが、やはりレビューには「起動しない」「強制終了する」なんて投稿がある。

そこで、前回の記事にも書いたのだが、とうとうタブレット「Kindle」を購入したわけです。

そこで、Kindleにさっそく自分のアプリをインストールし、動作確認を行ったところ非常に残念な結果になってしまいました。

■ブラウザのパフォーマンスについて
現在メインで使っているのは「Garaxy S2 LTE」
OSはたしか2.3だったかな?
スペックもいいほうだと思う。

PCでもスマホでも同じなのだが、ブラウザのJavaScriptのパフォーマンスは、その端末のスペックではなく、そのブラウザが搭載しているJavaScriptエンジンのスペックが非常に大きく影響する。
(もちろんPCのスペックも影響するが・・・)

WebViewのJavaScriptエンジンはどうなるかはちょっとわからないが、
Garaxy内でWebView経由でゲームWebページを開いてみると、まー滑らかではないがそこそこenchant.jsは問題なく動いている感じ。

ちょっと前の嫁のスマホ(メディウスだったかな?)で実行すると、ちょっとカクカクが多い。
これじゃストレスだが、動かないわけではない。

それでいざKindleで試してみたら。
糞みたいにenchant.jsがカクカクカクカクしている。
もー見れたもんじゃない。
ちな15fpsくらいで、キャラが10個ほど右往左往する。

Garaxyの1000分の1くらいしかスペックないんじゃないか?ってくらい。

■まとめ

今回の結果から、enchant.jsでのゲーム開発についてはすこしリスクが大きいかなと。

簡単にゲームはつくれるのだが、端末によってゲームできない。
やはり、大勢のユーザの中にはこんな感じでゲームできない人がいたと思う。

一番ヒットしたゲームで総ダウンロード数7万Overいったが、アクティブユーザは1万弱。
アンインストールしているユーザは沢山いる。

あまり、動きが少ないゲームならenchant.jsで大丈夫だろうが、そもそも起動できないとかならちょっと使うことは今後難しいかな。

先月から、この問題を同解決しようか考えた結果、別のゲームエンジンを使うことにした。
また、ブラウザのパフォーマンスが、端末間で大きな差があるためScriptエンジン系はちょっと。

ということで今後は「AndEngine」を使っていくことにした。
ゲームアプリのロジック的な考え方はenchant.jsで身に付けたためAndEngineについても割とすんなり理解できそう。


ためしにいろいろ作ってみているのだが、すげーヌルヌル動くw
さすがネイティブ側だけあるわw

Android アプリ「カブトムシ大戦」リリース

先日、2ヶ月間コツコツ作っていたゲームアプリ「カブトムシ大戦」をリリースしました。


icon.png

ゲーム「カブトムシ大戦」


カブトムシのゲームを作ったのはこれで2回目。

1回目に作ったゲームとゲーム内容は大分変わってしまったが、基本的な「虫捕り」「対戦」機能は搭載している。


さらに今回は、課金部分をVersion3で組み込んでみた。
そのうち、アプリ内課金のVersion3の導入方法を記事にしたいと思う。


課金せずに無料でも楽しく遊べるようにしているので、ぜひ興味があったらダウンロードしてみてください!
おすすめアプリ
カテゴリ
最新記事
リンク
アクセスカウンター
アクセス解析
imobile
i-mobile
i-mobile
i-mobile
i-mobile
i-mobile
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Amazon
Androidお勧め参考書
EC studio
商品
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。