C++ 如果src和dest在SDL_BlitSurface中相同,会发生什么情况?
我正在执行SDL_BlitSurface(s_pScreen,0,s_pScreen,0)代码>以使显示屏变黑,如下所示 它可以工作,但有时似乎崩溃了。 我收到了错误信息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
“异常特权指令。
(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_表面*