OpenGLESの学習中にiPhoneSDKのGLSpriteの例を少し変更しましたが、かなり遅いことがわかりました。シミュレーターでも(最悪の場合)、テクスチャーのある三角形が400個しかないので、何か間違ったことをしているに違いありません。
const GLfloat spriteVertices[] = {
0.0f, 0.0f,
100.0f, 0.0f,
0.0f, 100.0f,
100.0f, 100.0f
};
const GLshort spriteTexcoords[] = {
0,0,
1,0,
0,1,
1,1
};
- (void)setupView {
glViewport(0, 0, backingWidth, backingHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0.0f, backingWidth, backingHeight,0.0f, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.3f, 0.0f, 0.0f, 1.0f);
glVertexPointer(2, GL_FLOAT, 0, spriteVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_SHORT, 0, spriteTexcoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// sprite data is preloaded. 512x512 rgba8888
glGenTextures(1, &spriteTexture);
glBindTexture(GL_TEXTURE_2D, spriteTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
free(spriteData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
}
- (void)drawView {
..
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(tx-100, ty-100,10);
for (int i=0; i<200; i++) {
glTranslatef(1, 1, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
..
}
drawViewは、画面がタッチされるか、画面上の指が動かされ、tx、tyがそのタッチが発生したx、y座標に設定されるたびに呼び出されます。
また、翻訳が事前に生成され、DrawArrayが1つしかないが、同じパフォーマンス(〜4 FPS)が得られたときに、GLBufferを使用してみました。
===編集===
一方、これを変更して、はるかに小さいクワッド(サイズ:34x20)が使用され、オーバーラップがはるかに少なくなるようにしました。画面全体に最大400個のクワッド->800個の三角形が広がっています。テクスチャサイズは512x512アトラスとRGBA_8888で、テクスチャ座標はフロートです。このコードは、APIの効率の点で非常に醜いです。2つのMatrixModeの変更と、2つのロードと2つの変換、そして三角ストリップ(クワッド)のdrawarrayがあります。現在、これにより最大45FPSが生成されます。