Iphone 使用OpenGL和GLKit的基于平铺的游戏性能低下

Iphone 使用OpenGL和GLKit的基于平铺的游戏性能低下,iphone,objective-c,ios,opengl-es,glkit,Iphone,Objective C,Ios,Opengl Es,Glkit,我使用openGL和GLKit制作了一个基于瓷砖的游戏。在游戏中,屏幕上放置了大约1024个瓷砖,问题是每次调用drawInRect时我都在渲染瓷砖,而且我的性能损失很大 这就是我渲染的方式(tilesArray是静态的,ballsArray在屏幕上移动): 我修复了减少瓷砖使用的图像大小,并在视图中放置特定帧率的问题。为什么不将瓷砖渲染为纹理,然后只绘制1个四边形呢。在你闲暇的时候更新纹理中的瓷砖。看看或尝试一些想法!谢谢@Robinson,好主意,你能更具体地说明怎么做吗?如果你把它写在一个

我使用openGL和GLKit制作了一个基于瓷砖的游戏。在游戏中,屏幕上放置了大约1024个瓷砖,问题是每次调用drawInRect时我都在渲染瓷砖,而且我的性能损失很大

这就是我渲染的方式(tilesArray是静态的,ballsArray在屏幕上移动):


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

为什么不将瓷砖渲染为纹理,然后只绘制1个四边形呢。在你闲暇的时候更新纹理中的瓷砖。看看或尝试一些想法!谢谢@Robinson,好主意,你能更具体地说明怎么做吗?如果你把它写在一个答案里,我会接受的。好吧,这取决于你能得到什么。我对GLKit一无所知,所以我不会把它作为一个答案。基本形式是创建FBO(帧缓冲区对象),向其附加纹理,使用FBO渲染场景,然后使用附加纹理作为纹理绘制单个纹理四边形。无论何时需要再次绘制屏幕,都可以使用此纹理四边形。每当需要更新平铺时,都会绑定FBO并再次渲染它们。谷歌的FBO。它们的安装可能有点麻烦,但它们确实工作得很好。
- (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];
    }
}
- (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);

}