我有一个使用 SDL2 的简单 C 程序:
#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。这种行为的原因可能是什么?
UPD: 添加事件循环对这种情况没有帮助。
正如@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);
}
}
}
}