cocos2d-x v3 > 画像を動的に生成

cocos2d-x で高速に動作する Conway’s Game Of Life (ライフゲーム)を作ろうと思い、画像を動的に生成する方法を調べてみた。

動的に画像を生成するには DrawNode::drawDot() を使うと簡単だ。
が、drawDot() は大きさを持ったドットを三角形の組み合わせに分解し、その頂点座標と塗りつぶし色を OpenGL に送るので、Game Of Life 用としては無駄が多く、パフォーマンス的に問題だ。

よって、矩形スプライトを作成し、そのテクスチャパターンを動的に生成する方がよい。

宣言ファイル:

 std::vector<Color3B> m_buffer;  //  テクスチャデータを格納する動的配列
 cocos2d::Texture2D *m_texture;
 cocos2d::Sprite *m_sprite;

実装ファイル:

const int WIDTH = 800;
const int HEIGHT = 1000;
m_buffer.resize(WIDTH*HEIGHT);
for(int i = 0; i != m_buffer.size(); ++i) {
    m_buffer[i].r = 赤色値;
    m_buffer[i].g = 緑色値;
    m_buffer[i].b = 青色値;
}
Size contentSize;
contentSize.width  = WIDTH;
contentSize.height = HEIGHT;
m_texture = new Texture2D();
m_texture->initWithData((const void *)&m_buffer[0], WIDTH*HEIGHT*sizeof(Color3B),
			Texture2D::PixelFormat::RGB888, WIDTH, HEIGHT, contentSize);
m_sprite = Sprite::createWithTexture(m_Texture);
m_sprite->setPosition(位置);
addChild(m_sprite);

Nexus 7 (2013) 800×1000 グリッドサイズの場合、DrawNode::drawDot() を使った場合は数FPSだったのが、上記の方法により約30FPSを実現するのに成功した。