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 ビット サーフェスです。
パフォーマンスを向上させるためにこれを行うより良い方法はありますか?