SDL TILEMAP渲染速度很慢



im使用sdl编写一个显示相当大的tilemap(约240*240瓦)的模拟。由于我是SDL库的新手,因此我无法真正判断出渲染超过50,000瓦的性能是否非常慢是正常的。每个瓷砖始终可见,大约是4*4px大。当前,它通过2D阵列迭代每个帧并渲染每个瓷砖,这给我带来了约40fps,太慢了,无法实际将任何游戏逻辑在系统后面放置。

我试图找到一些替代系统,例如仅更新更新的瓷砖,但是人们总是评论这是一种不好的做法,并且应该清洁每个帧,依此类推。

在这里,地图的图片

所以我基本上想询问性能系统是否比每个框架呈现每个框架都要多。

编辑:因此,简单的渲染方法IM使用

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"图像中。所有的陆地精灵基本上都在第一行中,而所有的水砖都在第二行中。这样,我就不必手动将精灵分配给生物群体,该方法可以通过将瓷砖大小(基本上是宽度)乘以生物群落来做到。

从我的SDD/GDD和实际Spritesheet中获得了Biome ID表。

来自图形类别的闪电器方法基本上只是运行sdl_rendercopy将纹理刺激到渲染器上。

void Graphics::blitOnRenderer(SDL_Texture *texture, SDL_Rect 
*sourceRectangle, SDL_Rect *destinationRectangle) {
    SDL_RenderCopy(this->_renderer, texture, sourceRectangle, destinationRectangle);
}

在游戏循环中,每个帧都会调用一个呈清晰度和渲染图。

我真的希望我能解释一下,问你想要的任何东西,我问你们帮助的人,所以我至少可以做的就是合作:d

poke sdl2 devs SDL_RenderCopy()的多项目版本(类似于现有的 SDL_RenderDrawLines()/ SDL_RenderDrawPoints()/ SDL_RenderDrawRects() functions)和/或/或批处理sdl_renderer backends。

现在,您正在尝试SLAM 至少 240*240 = 57000在GPU的喉咙上抽出呼叫。您通常只能在任何给定的16毫秒中计入1000-4000个呼叫。

或者切换到OpenGl&amp;做批处理。

相关内容

  • 没有找到相关文章

最新更新