Arch Linux上的SDL2:窗口呈现屏幕背后的内容

我刚刚开始使用SDL2,阅读了几篇文章,并能够编译我在Arch Linux上编写的testing程序,并取得了成功。 似乎正在发生的唯一问题是正在创build的窗口不会呈现图像。 我试着在Mac上运行相同的代码,这确实导致了预期的结果。 我使用的是CLion,它不是罪犯,因为用g ++通过CLI编译的结果是一样的。

我的Arch Linux安装:

OS: Arch Linux x86_64 Kernel Release: 4.6.2-1-ARCH 

这是我正在编译的代码:

 #include <iomanip> #include <SDL2/SDL.h> using namespace std; const int WIDTH = 640; const int HEIGHT = 480; bool init(); bool loadMedia(); int close(); SDL_Window* window = NULL; SDL_Surface* surface = NULL; SDL_Surface* image = NULL; int main(int argc, char** argv) { if(init()) if(loadMedia()) printf("Media loaded"); SDL_BlitSurface(image, NULL, surface, NULL); SDL_UpdateWindowSurface(window); SDL_Delay(5000); return close(); } bool init() { if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { printf("Error initializing SDL: %s", SDL_GetError()); return false; } else { window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN); if(window == NULL) { printf("Error creating window: %s", SDL_GetError()); return false; } else surface = SDL_GetWindowSurface(window); } return true; } bool loadMedia() { image = SDL_LoadBMP("/home/me/ClionProjects/SDLTest/test.bmp"); if(image == NULL) { printf("Error loading in image: %s", SDL_GetError()); return false; } return true; } int close() { SDL_FreeSurface(surface); SDL_FreeSurface(image); SDL_DestroyWindow(window); SDL_Quit(); return 0; } 

我的CMakeLists.txt文件(由CLion使用):

 cmake_minimum_required(VERSION 3.5) project(SDLTest) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -w -lSDL2") set(SOURCE_FILES main.cpp) add_executable(SDLTest ${SOURCE_FILES}) 

和我用g ++编译的Unix命令:

 g++ main.cpp -w -lSDL2 -o prog 

在Arch上运行代码时看起来像什么:

代码在Arch Linux上运行

我应该注意到,它只复制一次屏幕上的内容,而不更新窗口内容。 所以当我移动窗口的时候,窗口里的东西是一样的。

在Mac上:

在这里输入图像描述

发现了一些文章也暗示了这个问题,但这些文章的解决scheme不适合我。 具体来说,我正在谈论这些文章。

SDL – 窗口不显示任何内容

https://bbs.archlinux.org/viewtopic.php?id=188412

https://gamedev.stackexchange.com/questions/117792/why-does-sdl-render-the-background-from-the-operating-system-to-the-window

希望我提供了足够的信息,而且有人在那里遇到同样的问题,并且能够解决这个问题。 提前致谢!


在keltar的评论后编辑(仍然没有做它应该的):

 #include <iomanip> #include <SDL2/SDL.h> using namespace std; const int WIDTH = 640; const int HEIGHT = 480; bool init(); bool loadMedia(); //int close(); SDL_Window* window = NULL; SDL_Surface* surface = NULL; SDL_Surface* image = NULL; int main(int argc, char** argv) { if(init()) if(loadMedia()) printf("Media loaded"); SDL_BlitSurface(image, NULL, surface, NULL); SDL_UpdateWindowSurface(window); SDL_Delay(5000); SDL_Quit(); return 0; } bool init() { if(SDL_Init(SDL_INIT_EVERYTHING) < 0) { printf("Error initializing SDL: %s", SDL_GetError()); return false; } else { window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN); if(window == NULL) { printf("Error creating window: %s", SDL_GetError()); return false; } else surface = SDL_GetWindowSurface(window); } return true; } bool loadMedia() { image = SDL_LoadBMP("/home/me/ClionProjects/SDLTest/test.bmp"); if(image == NULL) { printf("Error loading in image: %s", SDL_GetError()); return false; } return true; } //int close() { // SDL_FreeSurface(surface); // SDL_FreeSurface(image); // SDL_DestroyWindow(window); // SDL_Quit(); // return 0; //} 

我已经在Ubuntu 14.04上运行你的代码没有任何问题。 为了检查它在Linux上的“渲染驱动程序”问题,是否可以从命令行运行我的小GPL 游戏 ,并复制粘贴显示在控制台中的信息?

你应该看到这样的东西:

 Video drivers (2): 'x11' 'dummy', active = 'x11' Screen: 1920 x 1080, game: 1024 x 576 Rendering drivers (2): 'opengl' 'software', active = 'opengl' Render flags = 0x000a | ACCELERATED | TARGETTEXTURE Window flags = 0x001a | OPENGL | BORDERLESS 0 joystick(s) detected 

当渲染器中的“SDL_RENDERER_PRESENTVSYNC”标志为ON时,或者只要不将任何纹理复制到渲染器,我在CentOS 5上遇到同样的问题。

另一个想法,当你这样做会发生什么?

 for(int i = 0; i < 10; i++) { SDL_BlitSurface(image, NULL, surface, NULL); SDL_UpdateWindowSurface(window); SDL_Delay(500); }