我正在执行 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/