在 SDL 中绘制大量矩形到屏幕的正确和最有效的方法

问题描述

我对使用任何库在屏幕上绘制任何类型的图形非常陌生,而 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,&currentRect);

    }

}

其中 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 (将#修改为@)