SDL2 tilemap - 太慢了

And*_*ner 5 c sdl sdl-2

我正在使用SDL2编写一个在每一帧都显示一个tilemap的游戏,但性能太慢了.我写了一个小程序来隔离问题.考虑"temp.bmp"是16x16图像.

#include <stdio.h>

#include "SDL2/SDL.h"
#include "SDL2/SDL_timer.h"
#include "SDL2/SDL_image.h"

int main()
{
    SDL_Window* win;
    SDL_Renderer* ren;
    int x, y;

    SDL_Init(SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer(800, 600, 0, &win, &ren);
    SDL_Surface* sf = IMG_Load("temp.bmp");
    SDL_Texture* tx = SDL_CreateTextureFromSurface(ren, sf);

    for(;;) {
        Uint32 t = SDL_GetTicks();
        for(x=0; x<800; x+=16) {
            for(y=0; y<600; y+=16) {
                SDL_Rect src = { 0, 0, 16, 16 };
                SDL_Rect dst = { x, y, 16, 16 };
                SDL_RenderCopy(ren, tx, &src, &dst);
            }
        }
        SDL_RenderPresent(ren);
        printf("%ld ms\n", SDL_GetTicks() - t);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行程序,我发现渲染帧需要大约16ms.这正好是60 FPS(1000/60),这为游戏逻辑留下了空间.另外,我在一台非常快的计算机上运行它.

我很确定我使用的是错误的策略,但我不确定什么是正确的策略.也许创建一个大的纹理并且不那么频繁地更新它可能是要走的路,但我找不到任何关于如何将一个纹理复制到另一个纹理的文档.

那么,我该如何改善tilemap的性能呢?

dza*_*ada 2

页面上提到 SDL_RENDERER_PRESENTVSYNC 标志意味着您已同步到刷新率。尝试这个

    renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
Run Code Online (Sandbox Code Playgroud)