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;做批处理。