SDL tilemap渲染速度很慢

问题描述 投票:2回答:1

我正在使用SDL编写一个显示相当大的tilemap(大约240 * 240个tile)的模拟。由于我是SDL库的新手,我无法确定在渲染超过50,000个图块时性能是否相当慢是否正常。每个瓷砖始终可见,大约4 * 4px。目前,它通过一个2d数组迭代每一帧并渲染每个单独的图块,这给了我大约40fps,实际上将任何游戏逻辑放在系统后面太慢了。

我试图找到一些替代系统,比如只更新更新的磁贴,但人们总是评论这是一种不好的做法,并且渲染器应该每帧清理等等。

Here a picture of the map

所以我基本上想问一下,是否有更高性能的系统,而不是每帧渲染每一块瓷砖。

编辑:所以继承人使用简单的渲染方法

void World::DirtyBiomeDraw(Graphics *graphics) {


    if(_biomeTexture == NULL) {
        _biomeTexture = graphics->loadImage("assets/biome_sprites.png");
        printf("Biome texture loaded.\n");
    }

    for(int i = 0; i < globals::WORLD_WIDTH; i++) {
        for(int l = 0; l < globals::WORLD_HEIGHT; l++) {
            SDL_Rect srect;

            srect.h = globals::SPRITE_SIZE;
            srect.w = globals::SPRITE_SIZE;

            if(sites[l][i].biome > 0) {
                srect.y = 0;
                srect.x = (globals::SPRITE_SIZE * sites[l][i].biome) - globals::SPRITE_SIZE;
            }
            else {
                srect.y = globals::SPRITE_SIZE;
                srect.x = globals::SPRITE_SIZE * fabs(sites[l][i].biome);
            }
            SDL_Rect drect = {i * globals::SPRITE_SIZE * globals::SPRITE_SCALE, l * globals::SPRITE_SIZE * globals::SPRITE_SCALE, 
                globals::SPRITE_SIZE * globals::SPRITE_SCALE, globals::SPRITE_SIZE * globals::SPRITE_SCALE};



            graphics->blitOnRenderer(_biomeTexture, &srect, &drect);

        }
    }
}

所以在这种情况下,每个瓷砖都称为“网站”,这是因为它们还存储了湿度,温度等信息。

每个站点在生成过程中都分配了一个生物群系,每个生物群落基本上都是一个ID,每个陆地生物群系的ID都大于0,每个水ID都是0或更低。

这允许我将按ID排序的每个生物群系精灵放入“biome_sprites.png”图像中。所有的陆地精灵基本上都在第一排,而所有的水瓦都在第二排。这样我就不必手动将精灵分配给生物群系,并且该方法可以通过将瓦片大小(基本上是宽度)与生物群系相乘来实现。

这是qazxsw poi和qazxsw poi。

图形类中的blitOnRenderer方法基本上只运行SDL_RenderCopy将纹理blitting到渲染器上。

biome ID table from my SDD/GDD

在游戏循环中,每个帧都会调用RenderClear和RenderPresent。

我真的希望我解释它可以理解,问你想要什么,我要求你们帮忙,所以我能做的最少是合作:D

c++ sdl game-engine sdl-2 game-development
1个回答
1
投票

将SDL2开发用于actual spritesheet的多项版本(类似于现有的void Graphics::blitOnRenderer(SDL_Texture *texture, SDL_Rect *sourceRectangle, SDL_Rect *destinationRectangle) { SDL_RenderCopy(this->_renderer, texture, sourceRectangle, destinationRectangle); } / SDL_RenderCopy() / SDL_RenderDrawLines()函数)和/或SDL_RenderDrawPoints() SDL_Renderer后端。

现在你正试图在GPU的喉咙上猛击至少240 * 240 = 57000次抽签。在任何给定的16毫秒内,通常只能依靠1000-4000个绘图调用。

或者切换到OpenGL并自己进行批处理。

© www.soinside.com 2019 - 2024. All rights reserved.