如果src和dest在SDL_BlitSurface中相同会发生什么?

时间:2012-02-17 03:22:47

标签: c++ sdl

我正在执行SDL_BlitSurface(s_pScreen, 0, s_pScreen, 0);以使显示屏显示为黑色,如下所示。

它有效,但有时它似乎崩溃了。 我收到错误消息 "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);

2 个答案:

答案 0 :(得分:1)

SDL可以处理重叠的blits,在这种情况下是两个表面。您可以在“SDL_blit.c”中看到这一点,并根据您查看文件的方式,查看其他人报告的第308行或第298行。该行检查源和目标是否相同并处理它。

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

如果我不得不猜测它不是源的错误和目的地是相同的,而是屏幕本身的错误。

编辑:还有其他方法可以使屏幕变黑。实际上,如果您已经在屏幕上显示任何内容或者屏幕颜色不同,SDL_FillRect(s_pScreen, NULL, 0);将不会将屏幕清除为黑色,那么您实际上是在SDL_BlitSurface(s_pScreen, 0, s_pScreen, 0);开头执行此操作。我可以看到它在那里工作的唯一原因是因为你在将整个屏幕设置为黑色后立即对它进行blitting。

答案 1 :(得分:0)

如果您仍在使用SDL-1.2.13,那么它可能类似于我们遇到的错误。我们通过在blit之后添加它来修复它:

asm("cld");

或者如果你在Windows上:

__asm{cld};

A debian bug report about it