今回は大量の画像を表示する際のテクニックについて紹介します。
ゲーム作成ではマップチップの表示や敵、弾など大量の画像が必要になるときがあります。そこで問題なのがパフォーマンスへの影響です。基本的にゲームなどのアプリではメモリの9割は画像が占めていると言われています。そこで大量の画像が必要な場合にはパフォーマンスを意識したコーディングをしなければいけません、cocos2d-xではSpriteBatchNodeというクラスを用いることで大量の画像の貼り付けを1回の描写関数呼び出しにすることができます。
例えば同じ画像を100枚表示するときには通常ならthis->addchild(image)が100回必要です。しかし、SpriteBatchNodeを利用するとこのようになります。
//画面サイズの取得 Size size = Director::getInstance()->getVisibleSize(); //画像一括貼り付け用 auto batchNode = SpriteBatchNode::create("player.png"); //スプライトを100個作成 for(int n=0;n<100;n++){ //batchNodeからテクスチャを取得 auto image = Sprite::createWithTexture(batchNode->getTexture()); //ランダムな位置に設定 image->setPosition(Vec2(arc4random()%static_cast<int>(size.width),arc4random()%static_cast<int>(size.height))); //SpriteBatchNodeに貼り付ける batchNode->addChild(image); } //一括貼り付け this->addChild(batchNode);
ポイントはSpriteBatchNodeからテクスチャを取得してSpriteを生成しているところと、SpriteBatchNodeに全て貼り付けてから一括で貼り付けるところです。cocos2d-xでゲーム作成をするなら絶対覚えておいて損はないです。
余談ですがまだまだパフォーマンスを向上したいならキャッシュとテクスチャパックを利用した方法もできます。テクスチャパックとはこういった画像のことです。
1枚の画像の中に複数の画像を敷き詰めたもので多いのは.plistという形式のものです。なぜこのようにするかというと画像の読み込み時の使用メモリは2のべき乗サイズになります。例えば127*127の画像なら128*128のメモリを使用し129*129の画像なら256*256のメモリを使用します、なので2のべき乗サイズに画像を敷き詰めておくことが最適化につながります。さらに1枚の画像となっていることで一度読み込んでしまえばメモリに展開されるので個別に複数回読み込むよりも処理速度が速くなります。