我正在使用SDL2编写一个游戏,该游戏在每一帧都显示一个图块贴图,但是性能太慢。我写了一个小程序来解决这个问题。考虑“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);
    }
}

运行该程序,我发现渲染一个框架大约需要16毫秒。这恰好是60 FPS(1000/60),没有游戏逻辑的余地。另外,我正在相当快的计算机上运行它。

我很确定自己使用了错误的策略,但是我不确定什么是正确的策略。也许创建一个较大的纹理并进行较少的更新是一种方法,但是我找不到任何有关如何将一个纹理复制到另一个纹理的文档。

那么,如何改善磁贴图的性能呢?

最佳答案

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

    renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);

关于c - SDL2 tilemap-太慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18591758/

10-12 16:12