Cocos2d-x iOS アプリ

Cocos2d-x アニメーションをバッファリングして、高速で安定した処理を行う方法

投稿日:2016年8月20日 更新日:

memory_00

この記事では、Cocos2d-xにおけるアニメーションのバッファリングについて説明します。

 

【前回まで】

・第1回 : アニメーションを利用した回復エフェクトの表示方法

・第2回 : 加算合成を利用して、背景が黒い画像をアニメーションで使えるようにする方法

・第3回 : エフェクトアニメーションの終了と同時にエフェクトを消す方法

 

 

キーの登録とキーによるアニメーションの取り出し

結論から言うと、キーの登録・キーによるアニメーションの取り出しを行うことで、高速、安定したアニメーション表示が可能となります。

Cocos2d-xではキーの登録という形で、予め作成したアニメーションを登録しておいて、後からキーで取り出してアニメーションを再生するという事ができます。

 

・キーの登録


/*

animationTouroku : 予め生成しておいたアニメーション

"keyName" : 任意の文字列

*/

AnimationCache::getInstance()->addAnimation(animationTouroku, "keyName");

 

・キーによるアニメーションの取り出し

/*

animationToridashi : 取り出したアニメーション

"keyName" : 任意の文字列

*/
Animation* animationToridashi = AnimationCache::getInstance()->getAnimation("keyName");
 

 

 

AnimationCacheはシングルトンクラスなので、プログラムのどこからでも呼び出すことができます。

ですので、Cocos2d-xのサンプルクラス中のHelloWorldScene::init()のように、アプリ起動時にアニメーションを生成・登録しておいて、アニメーションを再生したい場面でアニメーションをキーで取り出すといったやり方が可能です。

このように記述しておくことで、キーでアニメーションを取り出す際には、すでにアニメーションは「addAnimation」によりメモリ上に存在しており高速にアニメーションを表示可能というわけです。

アニメーションの生成には、アニメーションの元となる画像を読み込む必要があるため、ディスクI/Oが発生する(後述)のですが、ファイルの読み込みを予め済ませておき(バッファリング)、アニメーション表示時にディスクI/Oを発生させないことで高速、および遅延のない安定したアニメーション表示を実現します。※バッファリングはオンメモリにしておく、などとも言います。

 

 

ファイルの読み込みを予め済ませておく(バッファリング)

アニメーションを生成する際には、下記のプログラムのようにアニメの元となる画像を読み込みます。通常、そのようなファイル名を指定するようなプログラムではディスクI/Oが発生します。

 


SpriteFrame* sprite0 = SpriteFrameCache::getInstance()->getSpriteFrameByName("スプライトフレーム画像名");

 

一般的に、ディスクI/Oはメモリアクセスに比べて1,000,000倍程度遅いと言われています。(激遅! メモリアクセスがnsに比べて、ディスクI/Oはmsオーダー程度)

つまり、アニメーションをしたい瞬間にいちいちアニメーションを生成していてはディスクI/Oを大量に発生させることになり、アプリの処理状況によってはアニメーション処理が激重になって表示が遅れる可能性があるということです。

そのような状況を回避するため、ディスクI/Oを発生させるような処理はアプリ起動時や画面遷移時に予め行っておき、アプリ実行中にディスクI/Oによる負荷を避けることが重要です。

 

 

作法としてのバッファリングを意識したプログラムの実装

os_00

さて、ここまでバッファリングについて説明してきましたが、昨今のOSは進化していて、プログラムの先読みによるバッファリングなどの研究も進んでいるようです。

もしからしたら、ファイルを読み込むという1行のプログラムを実行する前に、既にOSによるプログラム先読みにより画像ファイルはメモリ上に存在しているかも知れません。

 

program_00

しかしながら、OSがどこまでバッファリングを意識しているかは、オープンソースでも無い限り通常は知り得ることのないことであり、その振る舞いをOSの分だけ調査することは現実的ではありません。

それならば、OSに依存したプログラムをギャンブル的に書く前に、作法としてディスクI/Oを意識したプログラムを行うほうが、より高速・安定したアプリに仕上がるのでは無いでしょうか。

 

 

結論

・アニメーションは予め生成しておいてキーを登録しておき、キーで取り出して使う!

・アニメーションに限らず、ディスクI/Oはなるべく最初に行っておく!

 

 

以上です。

ここまでご覧頂き、ありがとうございました。

 

PrainGoogleAdSense

PrainGoogleAdSense

-Cocos2d-x, iOS, アプリ
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

cocos2dx

Cocos2d-x カスタムイベントを利用してソースコードの可読性をあげる

こんにちは、akiです。 この記事ではカスタムイベントの使い方について説明します。   カスタムイベントとは、ユーザが自由に処理を記述できるイベントのことです。イベントを発行するディスパッチ …

Cocos2d-x iOS アプリ名(アプリのアイコン名)のローカライズ方法

こんにちは。akiです。 この記事ではCocos2d-xでのアプリ名(アプリのアイコン名)のローカライズについて説明します。デバイスの環境に応じて一つのアプリのタイトル名を、日本語と英語でそれぞれ表示 …

ゲーム制作 Cocos2d-x関連 第16回 「パズル要素を実装する」

ちょっと待って、パズル要素はどこなの???   ・・・ですよね・・・「パズル&ストライク」ですもんね・・・   それではパズル要素の仕様を決めていきましょう。   仕様の …

エフェクトサムネ

ゲーム制作 Cocos2d-x関連 第12回 「ボールヒットエフェクトの表示」

派手なヒットエフェクトが欲しい!   この回では、派手では無いですが、ボールがドロップにヒットしたタイミングでヒットエフェクトを表示していきたいと思います。 一口にエフェクトと言っても色々な …

cocos2dx

Cocos2d-x Http通信の完了に同期して処理を実行する

  こんにちは、akiです。 この記事ではHttp通信処理の完了に同期して任意の処理を実行するやり方を説明します。 やり方は簡単でHttp通信のコールバックの中にカスタムイベントを発行する処 …