2011-11-15 8 views
2

私はウィンドウモードでSDLを使用しています。SDL:blitting time optimization

大きなスプライト、たとえば1024 x 640を指定すると、全体の画像を一度にblitするよりも、画像全体を小さなタイル、たとえば32 x 32 pxにblitする方が高速ですか?

私は30フィート(少なくとも)のウィンドウモードで画面上の背景(1024 * 640)をblitする必要があります。私は、ダブルバッファリングとハードウェアサーフェイスは、ウィンドウを開いたときには使用できないと考えています...今のところ、スプライト全体を一度にblitしますが、CPU消費量は単純なバックグラウンドブリッジでは非常に高いようです。

+1

Do not doあなたのサーフェスを表示フォーマットに変換することを忘れないでください(http://www.libsdl.org/docs/html/sdldisplayformat.html)。そうしないと、SDLはすべてのblit *のために舞台裏での変換を行います。 – genpfault

+0

しました。しかし、blitはまだCPU貪欲です... –

+0

@ArnaudGこれはかなり古いですが、どのようにCPU消費量を計算しますか?あなたはどんなフレームレートを得ていますか? – emartel

答えて

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 iが追加sudoのコードであり、パラメータが渡されますに;場合によっては、これはすべての画像を最適化し、小さくし(pngファイルであることを確認する必要があります)、透過性が小さい画像ファイルにのみ追加されるようにします。