提问人:lem0nify 提问时间:10/29/2023 最后编辑:genpfaultlem0nify 更新时间:11/2/2023 访问量:43
首次启动后,SDL 窗口中没有背景
No background in SDL window after first launch
问:
我有一个简单的 C 程序,使用 SDL2:
#include <stdio.h>
#include <SDL2/SDL.h>
int main(int argc, char** argv) {
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
return 1;
}
SDL_Window* window = SDL_CreateWindow(
"Hello, SDL2!",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
200, 400,
SDL_WINDOW_SHOWN
);
if (window == NULL) {
const char* error_message = SDL_GetError();
printf("error creating window: %s\n", error_message);
SDL_Quit();
return 1;
}
SDL_Surface* surface = SDL_GetWindowSurface(window);
if (surface == NULL) {
const char* error_message = SDL_GetError();
printf("surface is NULL. error: %s\n", error_message);
SDL_DestroyWindow(window);
SDL_Quit();
return 1;
}
if (SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 0, 255, 0)) != 0) {
const char* error_message = SDL_GetError();
printf("FillRect failed. error: %s\n", error_message);
SDL_DestroyWindow(window);
SDL_Quit();
return 1;
}
if (SDL_UpdateWindowSurface(window) != 0) {
const char* error_message = SDL_GetError();
printf("UpdateWindowSurface failed. error: %s\n", error_message);
SDL_DestroyWindow(window);
SDL_Quit();
return 1;
}
SDL_Delay(2000);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
在第一次启动时,我看到了一个绿色背景的窗口,但之后每个启动窗口都是完全透明的,没有报告任何错误。这就是我所看到的:
它实际上不是透明的,它只是将窗口后面的像素作为背景。如果我稍微移动一下,就会发生这种情况:
我还尝试用其他编程语言(Zig)重写相同的代码,并且行为是相同的:在第一次启动时,我再次看到一个绿色窗口,但在每次下一次启动时,它都以相同的方式出现错误。
我的系统是 Archlinux,桌面是 X11 上的 KDE/Plasma。这种行为的原因可能是什么?
更新:添加事件循环对这种情况没有帮助。
答:
0赞
lem0nify
11/2/2023
#1
正如@HolyBlackCat评论中提到的,如果没有事件循环,可能存在图形错误,事件循环不仅必须存在,而且还必须包括更新窗口表面。
SDL_Event evt;
while (1) {
if (SDL_PollEvent(&evt) != 0) {
if (e.type == SDL_QUIT) {
break;
} else if (e.type == SDL_WINDOWEVENT) {
if (e.window.event == SDL_WINDOWEVENT_EXPOSED) {
SDL_UpdateWindowSurface(window);
}
}
}
}
评论
SDL_PollEvent()
SDL_WaitEvent()
SDL_WINDOWEVENT_EXPOSED