问题描述
我对使用任何库在屏幕上绘制任何类型的图形非常陌生,而 SDL 确实是我第一次尝试这样做。我正在努力学习正确、最有效的方法来在屏幕上绘制大量矩形而不会减慢速度。
目前,在我的程序中,我有几个如下所示的结构:
typedef struct rectangle
{
unsigned short Width;
unsigned short Height;
unsigned short X;
unsigned short Y;
} rectangle;
typedef struct sprite
{
rectangle* rectangles;
unsigned short numOfRect;
} sprite;
所以,基本上 sprite 结构包含一个矩形数组,每个矩形都有一个宽度、高度以及相对于 sprite 原点的 X 和 Y 坐标。
出于奇怪的原因,形成这些 sprite 的数据实际上并不是图像,而是一个大文本文件,其中填充了应该构成每个 sprite 的每个矩形的尺寸。已知从该文件加载的每个精灵都具有相同的大小,因此我不需要将精灵本身的尺寸存储在任何地方,因为该尺寸是硬编码的。我将这些数据加载到这些精灵结构的数组中完全正常,但是当我尝试将许多这些精灵一次绘制到屏幕上时,我的问题就出现了。
我当前的绘图功能如下所示:
void drawSprite(sprite Sprite,unsigned short X,unsigned short Y,SDL_Renderer* renderer)
{
SDL_SetRenderDrawColor(renderer,255,255);
SDL_Rect currentRect;
for (unsigned short i = 0; i < Sprite.numOfRect; i++)
{
currentRect.x = X + Sprite.rectangles[i].X;
currentRect.y = Y + Sprite.rectangles[i].Y;
currentRect.w = Sprite.rectangles[i].Width;
currentRect.h = Sprite.rectangles[i].Height;
SDL_RenderFillRect(renderer,¤tRect);
}
}
其中 X 和 Y 是应该绘制精灵的屏幕坐标。该函数遍历传递给它的精灵中的每个矩形,并使用 SDL_RenderFillRect 将其绘制到屏幕上。
问题是,假设我有这些 sprite 结构之一,并且 sprite 由 20 个单独的矩形组成。然后说我想在屏幕上绘制一个 50x50 的这个精灵的盒子。所以我的主要功能看起来像这样:
...
while (true)
{
SDL_SetRenderDrawColor(renderer,255);
SDL_RenderClear(renderer);
for (unsigned short i = 0; i < 50; i++)
for (unsigned short j = 0; j < 50; j++)
drawSprite(Sprite,i * WIDTH,j * HEIGHT,renderer);
SDL_RenderPresent(renderer);
}
其中 WIDTH 和 HEIGHT 只是每个精灵的任意宽度和高度,同样这些数字在编译时就已经知道了,并且对于每个精灵都是相同的。
你可以想象,这是非常低效的,并导致程序滞后,因为 drawSprite 本身每帧被调用 2500 次,这意味着 SDL_RenderFillRect() 每帧被调用 2500 * 20 = 50000 次!
我很好奇这样做的正确方法是什么?精灵根本不会移动或改变,所以我觉得没有必要在每一帧都重绘它们,但我读过应该在每一帧调用 SDL_RenderClear() 这意味着我每次都必须重绘精灵。我如何更有效地做到这一点?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)