我正在使用SDL编写一个显示相当大的tilemap(大约240 * 240个tile)的模拟。由于我是SDL库的新手,我无法确定在渲染超过50,000个图块时性能是否相当慢是否正常。每个瓷砖始终可见,大约4 * 4px。目前,它通过一个2d数组迭代每一帧并渲染每个单独的图块,这给了我大约40fps,实际上将任何游戏逻辑放在系统后面太慢了。
我试图找到一些替代系统,比如只更新更新的磁贴,但人们总是评论这是一种不好的做法,并且渲染器应该每帧清理等等。
所以我基本上想问一下,是否有更高性能的系统,而不是每帧渲染每一块瓷砖。
编辑:所以继承人使用简单的渲染方法
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
将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并自己进行批处理。