Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果src和dest在SDL_BlitSurface中相同,会发生什么情况?_C++_Sdl - Fatal编程技术网

C++ 如果src和dest在SDL_BlitSurface中相同,会发生什么情况?

C++ 如果src和dest在SDL_BlitSurface中相同,会发生什么情况?,c++,sdl,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

我正在执行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);
Lock-Lock(&s\u-layer\u-cs);
//清除后缓冲区
SDL_FillRect(s_pScreen,NULL,0);
//将每一层放到后缓冲区
对于(int i=0;i
SDL可以处理重叠的光点,在这种情况下,可以处理两个表面。您可以在“SDL_blit.c”中看到这一点,并根据您查看文件的方式,查看其他人报告的第308行或第298行。该行检查源和目标是否相同,并对其进行处理

if ( surface == surface->map->dst ) {
                surface->map->sw_data->blit = SDL_BlitCopyOverlap;
如果我不得不猜测这不是源和目标相同的错误,而是屏幕本身的错误


编辑:还有其他方法可以使屏幕变黑。实际上,您在开始时使用
SDL\u FillRect(s\u pScreen,NULL,0)执行此操作
事实上,如果您已经在屏幕上显示了任何内容,或者屏幕颜色不同,
SDL_BlitSurface(s_pScreen,0,s_pScreen,0)不会将屏幕清除为黑色。我能看到它在那里工作的唯一原因是,在您将整个屏幕设置为黑色后,您正在将其自身设置为光点。

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

if ( surface == surface->map->dst ) {
                surface->map->sw_data->blit = SDL_BlitCopyOverlap;
如果我不得不猜测这不是源和目标相同的错误,而是屏幕本身的错误


编辑:还有其他方法可以使屏幕变黑。实际上,您在开始时使用
SDL\u FillRect(s\u pScreen,NULL,0)执行此操作
事实上,如果您已经在屏幕上显示了任何内容,或者屏幕颜色不同,
SDL_BlitSurface(s_pScreen,0,s_pScreen,0)不会将屏幕清除为黑色。我能看到它在那里工作的唯一原因是,在您将整个屏幕设置为黑色后,您正在将其自身进行blitting。

如果您仍在使用SDL-1.2.13,那么它可能与我们遇到的错误类似。我们在blit之后添加了以下内容:

asm("cld");
或者,如果您在Windows上:

__asm{cld};

如果您仍在使用SDL-1.2.13,那么它可能与我们遇到的错误类似。我们在blit之后添加了以下内容:

asm("cld");
或者,如果您在Windows上:

__asm{cld};

s_pSurface的声明是什么?s_pSurface的声明是什么?是的,屏幕是SDL_表面*是的,屏幕是SDL_表面*