1

iPad 用ゲームのパーティクル エンジンを実装しました。iPad シミュレーターでは、500 個を超えるパーティクルで非常に良好なフレームレートが得られます (必要以上に)。ただし、iPad 自体では、まったく異なる結果が得られます。パーティクルが 10 個しかない場合 (それよりも数個必要です)、フレームレートが非常に低くなります...

基礎として、パーティクル エミッター クラスを実装するためにこのチュートリアルを使用しました: http://www.71squared.com/en/article/806/iphone-game-programming-tutorial-8-particle-emitter (OpenGL ES 1 を使用) )

私は OpenGL ES 2.0 を使用しているため、独自の render メソッドを作成しました。

- (void) renderParticles:(RenderMode)renderMode ofParticleEmitter:(ParticleEmitter*)particleEmitter xOffset:(int)xoffset yOffset:(int)yoffset
{

PointSprite *vertices = [particleEmitter getVertices];

for (int p = 0; p < particleEmitter.particleCount; p++) {

    CC3GLMatrix *modelView = [CC3GLMatrix matrix];
    // Translate the Modelviewmatrix
    [modelView populateFromTranslation:CC3VectorMake(_cameraX, _cameraY, -5.0)];


    [modelView translateByX:vertices[p].x + xoffset];
    [modelView translateByY:vertices[p].y + yoffset];
    [modelView translateByZ:101.0];  

    [modelView scaleByX:2.0];
    [modelView scaleByY:2.0];

    glUniformMatrix4fv(_modelViewUniformT, 1, 0, modelView.glMatrix);

    glBindTexture(GL_TEXTURE_2D, [particleEmitter getTexture]);

    // Create and Bind a rectangular VBO
    [self calcCharacterVBOwithCols:1 rows:1 currentCol:1 currentRow:1];    

    glVertexAttribPointer(_positionSlotT, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) 0);
    glEnableVertexAttribArray(_positionSlotT);

    // Fragment Shader value
    float opacity = 1.0;
    glUniform1f(_opacity, opacity);

    // Normal render, add Texture coordinates

    // Activate Texturing Pipeline and Bind Texture
    glVertexAttribPointer(_texCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));
    glEnableVertexAttribArray(_texCoordSlot);


    glDrawElements(GL_TRIANGLES, sizeof(IndicesLayer)/sizeof(IndicesLayer[0]), GL_UNSIGNED_BYTE, 0);

    glDisableVertexAttribArray(_texCoordSlot);
    glDisableVertexAttribArray(_positionSlotT);

    [self destroyCharacterVBO];
}
}

粒子に関する重要なポイントを見逃していませんか? デバイスのフレームレートを向上させるにはどうすればよいですか?

4

1 に答える 1

0

問題は、すべて同じテクスチャを使用しているにもかかわらず、すべてのパーティクルにパーティクル テクスチャを何度も割り当てていたようです。

テクスチャをバインドすることで

glBindTexture(GL_TEXTURE_2D, [particleEmitter getTexture]);

すべてのパーティクルをループする前に、シミュレーターに匹敵するはるかに高速なフレーム レートが得られます。

于 2013-01-28T16:10:09.947 に答える