我正在学习在LazyFoo's tutorial之后创建我的第一个窗口,所有内容都编译并运行,但是当调用SDL_UpdateWindowSurface()时表面没有更新,如下图所示:
正如你所看到的,出现它的最后一件事是我的背景。我已经在我的另一台笔记本电脑上测试了这个程序,一切正常,我使用相同的系统,都更新了。
我的代码:
#include <SDL2/SDL.h>
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int main(){
SDL_Window* window = NULL;
SDL_Surface* screenSurface = NULL;
if(SDL_Init(SDL_INIT_VIDEO) < 0){
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
}else{
window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if(window == NULL){
printf("Window could not be created SDL_Error: %s\n", SDL_GetError() );
}
else{
screenSurface = SDL_GetWindowSurface(window);
if(screenSurface == NULL){
printf("Surface could not be loaded SDL_Error: %s\n", SDL_GetError());
}else{
SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 255, 255, 255));
SDL_UpdateWindowSurface(window);
SDL_Delay(3000);
}
}
}
}
奇怪的是:如果我在SDL_UpdateWindowSurface()之前添加SDL_Delay(1000),1秒后我可以看到表面充满白色,但这似乎不是正确的解决方案,因为程序在我的笔记本电脑上完美运行。
编辑1:
只是意识到一件事,我正在开发这个程序的桌面环境,正在使用awesomewm作为窗口管理器。我的笔记本电脑使用gnome作为DE。我刚刚在我的桌面上安装了gnome并且voilá,该程序按预期工作。现在我只是好奇为什么会这样。在Gnome上运行的相同程序的屏幕截图:
编辑2:
正如keltar所说,SDL在窗口管理器加载之前更新了表面。解决方案是处理窗口事件EXPOSED,即窗口管理器加载窗口时。
SDL_Event event;
while(SDL_WaitEvent(&event))){
switch(event.type){
case SDL_WINDOWEVENT:
switch(event.window.event){
case SDL_WINDOWEVENT_EXPOSED:
SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 255, 255, 255));
SDL_UpdateWindowSurface(window);
SDL_Delay(3000);
SDL_Quit();
break;
}
}
}