c++ - 如果 SDL_BlitSurface 中的 src 和 dest 相同会发生什么?

标签 c++ sdl

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

它有效,但有时它似乎崩溃了。 我收到错误信息 ”异常特权指令。 (0xC0000096) 发生在位置 (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);

最佳答案

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); 实际上,如果您已经将任何内容 blit 到屏幕或者屏幕颜色不同,SDL_BlitSurface( s_pScreen, 0, s_pScreen, 0); 不会将屏幕清除为黑色。我能看到它在那里工作的唯一原因是你在将整个屏幕设置为黑色后立即将其 blit 到它自己。

关于c++ - 如果 SDL_BlitSurface 中的 src 和 dest 相同会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9322429/

相关文章:

c++ - 需要精确的线程休眠。最大 1ms 误差

c++ - 使用 regex.h 进行全词匹配

c++ - 为什么要在方法参数列表中添加 void

c - SDL2 [优化] : is SDL_Surface->texture->copy faster than drawing on renderer?

c++ - 对象销毁时内存泄漏

c++ - 从函数 : by value VS by pointer 返回大对象

C++Builder:<memory> header 中的警告

android - 在 Android : can't compile because of missing "GLES_CM" 上使用 SDL

c++ - 循环中的 SDL_GL_SwapBuffers() = 卡住?

C++ 奇怪的函数指针行为