2012-02-17 7 views
0

下記のように表示を黒くするためにSDL_BlitSurface(s_pScreen, 0, s_pScreen, 0);を実行しています。srcとdestがSDL_BlitSurfaceで同じ場合はどうなりますか?

動作しますが、クラッシュしたように見えることがあります。 は、私は、エラーメッセージ "The exception Privileged Instruction. (0xC0000096) occured in the application at location (0x00700070)"

プログラム取得:

Lock lock(&s_layer_cs); 
    // clear the back buffer 
    SDL_FillRect(s_pScreen, NULL, 0); 
    // Blit each layer to the back buffer 
    for (int i = 0; i < s_layers; ++i) 
    { 
     if (!s_layer_disabled[i]) 
     { 
      if (0U == IlluminationCmd) 
      { 
      //Make the display black 
      SDL_BlitSurface(s_pScreen, 0, s_pScreen, 0); 
      } 
      else 
      { 
      SDL_BlitSurface(s_pSurface[i], 0, s_pScreen, 0); 
      } 
     } 
    } 
    // Flip buffers 
    SDL_Flip(s_pScreen); 
+0

's_pSurface'の宣言は何? –

答えて

1

をSDLは、重複ブリットこの場合の2つの面を処理することができます。これは "SDL_blit.c"で見ることができ、ファイルの見方によっては、他の人によって報告された行308または行298を見てください。ラインは、ソースとデスティネーションが同じであることをチェックし、それを処理します。

if (surface == surface->map->dst) { 
       surface->map->sw_data->blit = SDL_BlitCopyOverlap; 

私が推測しなければならないのは、送信元と送信先が同じだが画面自体にエラーがないことです。

EDIT:画面を黒くする他の方法があります。あなたは実際に最初にSDL_FillRect(s_pScreen, NULL, 0);でそれを行います。実際に画面にblittedされたものがある場合、または画面が異なる色の場合、SDL_BlitSurface(s_pScreen, 0, s_pScreen, 0);は画面を黒くクリアしません。私がそれを見ることができる唯一の理由は、画面全体を黒にした直後に自分自身にブリッジするためです。

+0

はい、画面はSDL_Surface * – user1032187

0

SDL-1.2.13をまだ使用している場合は、私たちが持っていたバグと似ているかもしれません。私達はちょうどブリット後にこれを追加することによって、それを修正:

asm("cld"); 

それともWindows上にある場合:

__asm{cld}; 

A debian bug report about it

関連する問題