Низкая производительность в тайловой игре с OpenGL и GLKit

Я использую openGL с GLKit для создания игры на основе тайлов. В игре на экране размещается около 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];
    }
}

Как я уже сказал,tileArray статичен на экране, но 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);

}

person Antonio MG    schedule 10.04.2012    source источник
comment
Почему бы не визуализировать тайлы в текстуру, а затем просто нарисовать 1 квадрат. Обновляйте тайлы в текстуре на досуге.   -  person Robinson    schedule 11.04.2012
comment
Взгляните на CCTMXTiledMap от Cocos2D или экспериментальный Расширение Cocos2D: HKTMXTiledMap для идей!   -  person MechEthan    schedule 11.04.2012
comment
Спасибо, @Robinson, хорошая идея, не могли бы вы поподробнее рассказать, как это сделать? Если вы поместите это в ответ, я приму.   -  person Antonio MG    schedule 11.04.2012
comment
Ну, все зависит от того, что доступно тебе, Антонио. Я ничего не знаю о GLKit, поэтому не буду ставить это в качестве ответа. Базовой формой было бы создание FBO (Объект кадрового буфера), прикрепление к нему текстуры, визуализация сцены с помощью FBO, а затем использование прикрепленной текстуры в качестве текстуры для рисования одного текстурированного четырехугольника. Всякий раз, когда вам нужно снова нарисовать экран, вы можете использовать этот текстурированный четырехугольник. Всякий раз, когда вам нужно обновить тайлы, вы привязываете FBO и снова визуализируете их. Google для FBO. Они могут быть немного неудобны в настройке, но они работают хорошо.   -  person Robinson    schedule 11.04.2012


Ответы (1)


Я исправил это, уменьшив размер изображений, используемых тайлами, и установив определенную частоту кадров в представлении.

person Antonio MG    schedule 16.04.2012