2

ウィンドウモードでSDLを使用しています。

1024 x 640 などの大きなスプライトがある場合、画像全体を一度に blit するよりも、画像全体をいくつかの小さなタイル (たとえば 32 x 32 px) に blit した方が速いですか?

ウィンドウモード@ 30 FPS(少なくとも)で画面(1024 * 640)の背景をブリットする必要があります。ダブルバッファリングとハードウェアサーフェイスはウィンドウ化すると使えないと思います… とりあえずスプライト全体を一気にブリットしてみましたが、単純なバックグラウンドブリットにしてはかなりCPU消費が激しいようです。

4

1 に答える 1

0

まず、画像が「PNG」などの小さなファイル形式であることを確認してください。次に、画像をブリットするときは、背景画像に透明色を追加していないことを確認してください。これは無意味であり、多くの CPU サイクルを占有します。これは、画像読み込みのラッパーとしてずっと前に書いたコードの例です

SDL_Surface* altSDL::load_image(std::string filename)  
{
    SDL_Surface* loadedImage = NULL;

    SDL_Surface* optimizedImage = NULL;

    loadedImage = IMG_Load( filename.c_str() );

    if( loadedImage != NULL )
    {
        optimizedImage = SDL_DisplayFormat( loadedImage );        
        SDL_FreeSurface( loadedImage );
    }
    else
    {
        Failure* fail;
        fail = Failure::getInstance();
        fail->failLog(filename);
    }

    if( optimizedImage != NULL )
    {
        Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0xFF, 0, 0xFF );
        SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
    }

    return optimizedImage;
}

このコードでは、すべての画像をこれに渡して非常にシームレスに最適化することができますが、背景/大きな画像の場合、コードのこの最後のブロックが次の行に沿って何かに変更されていることを確認する必要がありますこのようなもの:

//Added some Sudo code

    if( loadedImage != NULL && !isBigImage)
            {
                optimizedImage = SDL_DisplayFormat( loadedImage );        
                SDL_FreeSurface( loadedImage );
            }
            else if(!isBigImage)
            {
                Failure* fail;
                fail = Failure::getInstance();
                fail->failLog(filename);
            }

isBigImage は、追加した sudo コードであり、渡されたパラメーターです。これにより、すべての画像が最適化され、小さくなり(pngファイルであることを確認する必要があります)、透明度が小さな画像ファイルにのみ追加されるようになり、背景がfpsを解決しません

于 2015-07-29T20:47:20.987 に答える