【问题标题】:Low performance with tiles-based game with OpenGL and GLKit使用 OpenGL 和 GLKit 的基于图块的游戏性能低下
【发布时间】:2012-04-10 20:09:28
【问题描述】:

我正在使用带有 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);

}

【问题讨论】:

  • 为什么不将瓦片渲染为纹理,然后只绘制第 1 个四边形。随意更新纹理中的图块。
  • 谢谢@Robinson,好主意,你能更具体地说明一下如何做吗?如果你把它放在一个答案中,我会接受。
  • 这一切都取决于安东尼奥你可以使用什么。我对GLKit一无所知,所以我不会把它作为答案。基本形式是创建一个 FBO(帧缓冲区对象),为其附加纹理,使用 FBO 渲染场景,然后使用附加的纹理作为纹理来绘制单个纹理四边形。每当您需要再次绘制屏幕时,都可以使用这个带纹理的四边形。每当您需要更新图块时,您绑定 FBO 并再次渲染它们。谷歌为 FBO。它们的设置可能有点繁琐,但它们确实工作得很好。

标签: iphone objective-c ios opengl-es glkit


【解决方案1】:

我修复了它,减少了图块使用的图像的大小,并在视图中放置了特定的帧率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多