gpt4 book ai didi

c++ - SDL tilemap 渲染很慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:44 26 4
gpt4 key购买 nike

我使用 SDL 编写了一个显示相当大的瓷砖 map (大约 240*240 瓷砖)的模拟。由于我对 SDL 库还很陌生,所以我真的无法判断渲染超过 50,000 个图 block 时相当慢的性能是否真的正常。每个图 block 始终可见,大约 4*4 像素大。目前它通过 2d 数组迭代每一帧并渲染每个单独的图 block ,这给了我大约 40fps,太慢了,无法真正将任何游戏逻辑放在系统后面。

我试图找到一些替代系统,比如只更新更新的图 block ,但人们总是评论说这是一种糟糕的做法,渲染器应该在每一帧都被清理等等。

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 排序的生物群系 Sprite 放入“biome_sprites.png”图像中。所有的地精基本上都在第一排,而所有的水瓦都在第二排。这样我就不必手动将 Sprite 分配给生物群落,并且该方法可以通过将图 block 大小(基本上是宽度)乘以生物群落来自行完成。

这是 biome ID table from my SDD/GDDactual spritesheet .

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

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

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

我真的希望我能理解地解释它,想问什么就问什么,我就是在向你们寻求帮助,所以我至少能做的就是合作 :D

最佳答案

向 SDL2 开发人员咨询 SDL_RenderCopy() 的多项版本(类似于现有的 SDL_RenderDrawLines()/SDL_RenderDrawPoints()/SDL_RenderDrawRects() 函数)和/或 batched SDL_Renderer 后端。

现在,您正在尝试 至少 240*240 = 57000 次绘制调用,使 GPU 无所适从;在给定的 16 毫秒内,您通常只能指望 1000-4000 次绘制调用。

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

关于c++ - SDL tilemap 渲染很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54688632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com