0

C で 2D SDL ゲームを作成しています。ゲームのネイティブ解像度は 160 × 120 です。これは、特定の (整数) 倍率 (x1、x2、...) で拡大された画面に表示される直前です。素敵なエイリアスとピクセル化されたインディーのような外観を与えます. そこには驚くべきことは何もありません。ただし、ゲームのパフォーマンスにかなりの (目に見える) 影響があります。スケール ファクターが高いほど、(明らかに) 影響が大きくなります。

スケーリングと表示を処理するコードは次のとおりです。

#define GET_PIXEL(surface, x, y) *(Uint32 *)((Uint32 *)surface->pixels + (y * surface->w) + x)

void draw(void) {
    if (SDL_MUSTLOCK(screen.native))
        SDL_LockSurface(screen.native);
    for (int i = 0; i < 120; ++i)
        for (int j = 0; j < 160; ++j) {
            SDL_Rect rect = { j * screen.scale, i * screen.scale, screen.scale, screen.scale };
            SDL_FillRect(screen.scaled, &rect, GET_PIXEL(screen.native, j, i));
        }
    if (SDL_MUSTLOCK(screen.native))
        SDL_UnlockSurface(screen.native);
    SDL_Flip(screen.scaled);
}

このdraw()関数はフレームごとに呼び出されます。screen.nativeは 160 × 120 のゲーム面で、screen.scaledスケーリング後の最終的な面です。SDL_HWSURFACEどちらも、フラグを使用して作成された 32 ビット サーフェスです。

パフォーマンスを向上させるためにこれを行うより良い方法はありますか?

4

2 に答える 2

0

解決策を見つけました。最新の不安定なバージョンのSDL2.0(完全なハードウェアアクセラレーションをサポート)をコンパイルしSDL_Texture、解像度に関係なく、sのみを使用して一定の高FPSを実現しました。

于 2012-12-07T14:15:35.820 に答える
0

load簡単な解決策の 1 つは、関数ではなく ですべてをdrawアップスケールし、アップスケールされたバージョンを保存して再利用することです。パフォーマンスを向上させるためにメモリを交換することになります。

于 2012-12-06T14:59:44.553 に答える