0

タイルベースのゲームを作成するためにGLKitでopenGLを使用しています。ゲームでは、約1024個のタイルが画面に配置されます。問題は、drawInRectが呼び出されるたびにタイルをレンダリングしているため、パフォーマンスが大幅に低下していることです。

これが私がレンダリングする方法です(tilesArrayは静的で、ballsArrayは画面上を移動しています):

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(1, 1, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT);    
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);


    for (int i = 0; i < [self.tilesArray count]; i++){            
        RPSprite *tempTile = [self.tilesArray objectAtIndex:i];
        [tempTile render];
    }


    for (RPSprite *ball in self.ballsArray){
        [ball render];
    }
}

私が言ったように、tilesArrayは画面内で静的ですが、ballsArrayは(更新のたびに)画面内を非常に速く移動しています。ボールだけを置くと非常に速くなり、タイルを追加すると非常に遅くなります(シミュレーターでのみ試してみました)

これが私がレンダリングする方法です:

- (GLKMatrix4) modelMatrix {

    GLKMatrix4 modelMatrix = GLKMatrix4Identity;  
    modelMatrix = GLKMatrix4Translate(modelMatrix, self.position.x,320 - self.position.y - self.textureInfo.height, 0);
    return modelMatrix;

}

- (void)render { 

    self.effect.texture2d0.name = self.textureInfo.name;
    self.effect.texture2d0.enabled = YES;
    self.effect.transform.modelviewMatrix = self.modelMatrix;

    [self.effect prepareToDraw];

    long offset = (long)&_quad;

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);

    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, geometryVertex)));
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(TexturedVertex), (void *) (offset + offsetof(TexturedVertex, textureVertex)));

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

}
4

1 に答える 1

0

タイルで使用される画像のサイズを縮小し、ビューに特定のフレームレートを配置するように修正しました。

于 2012-04-16T09:46:47.647 に答える