5

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) であり、ゲーム ロジックの余地はありません。また、かなり高速なコンピューターで実行しています。

私は間違った戦略を使用していると確信していますが、何が正しい戦略なのかはわかりません。大きなテクスチャを作成し、あまり頻繁に更新しない方がよいかもしれませんが、あるテクスチャを別のテクスチャにコピーする方法に関するドキュメントは見つかりませんでした。

では、タイルマップのパフォーマンスを向上させるにはどうすればよいでしょうか?

4

4 に答える 4

2

このページでは、SDL_RENDERER_PRESENTVSYNC フラグは、リフレッシュ レートに同期していることを意味すると述べていますこれを試して

    renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
于 2013-09-03T13:22:21.333 に答える
0

SDL_SetRenderTargetを使用して、最初に大きなテクスチャをレンダリングできます。そのテクスチャは、フレームごとに 1 回だけ描画されます。

つまり、次のようなものです。

Uint32 fmt;
SDL_QueryTexture(tx, &fmt, NULL, NULL, NULL);
SDL_Texture* tm = SDL_CreateTexture(ren, fmt, SDL_TEXTUREACCESS_TARGET, 800, 600);
SDL_SetRenderTarget(ren, tm);
// Your draw loop here
SDL_SetRenderTarget(ren, NULL);
// Real draw loop only needs to RenderCopy tm
于 2013-10-09T09:28:12.203 に答える