Arch Linux 上的 SDL2:window 渲染其背后屏幕上的内容
SDL2 on Arch Linux: window renders what's on the screen behind it
我刚开始使用 SDL2,阅读了几篇有关它的文章,并且能够成功编译我在 Arch Linux 上编写的测试程序。似乎正在发生的唯一问题是正在创建的 window 不渲染图像。我在 Mac 上尝试了 运行 相同的代码,这确实产生了预期的结果。我正在使用 CLion,这不是恶意因素,因为通过 CLI 使用 g++ 编译结果相同。
我的 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 上的代码时的样子:
我应该注意它只复制一次屏幕上的内容,不会更新 window 内容。因此,当我四处移动 window 时,window 中呈现的内容保持不变。
在 Mac:
我发现有几篇文章也暗示了这个问题,但这些文章的解决方案对我不起作用。具体来说,我说的是这些文章。
SDL - window doesn't show anything
https://bbs.archlinux.org/viewtopic.php?id=188412
希望我提供了足够的信息,并且有人遇到过同样的问题并且能够解决它。提前致谢!
在 之后编辑(仍然没有做它应该做的):
#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 上的 'rendering driver' 问题,你可以从命令行 运行 我的小 GPL game 并复制粘贴控制台中显示的信息吗?
你应该看到这样的东西:
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
我在 CentOS 5 上遇到了同样的问题,当 'SDL_RENDERER_PRESENTVSYNC' 标志在渲染器中打开时,或者只要您不将任何纹理复制到渲染器。
另一个想法,当你这样做时会发生什么?
for(int i = 0; i < 10; i++) {
SDL_BlitSurface(image, NULL, surface, NULL);
SDL_UpdateWindowSurface(window);
SDL_Delay(500);
}
我刚开始使用 SDL2,阅读了几篇有关它的文章,并且能够成功编译我在 Arch Linux 上编写的测试程序。似乎正在发生的唯一问题是正在创建的 window 不渲染图像。我在 Mac 上尝试了 运行 相同的代码,这确实产生了预期的结果。我正在使用 CLion,这不是恶意因素,因为通过 CLI 使用 g++ 编译结果相同。
我的 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 上的代码时的样子:
我应该注意它只复制一次屏幕上的内容,不会更新 window 内容。因此,当我四处移动 window 时,window 中呈现的内容保持不变。
在 Mac:
我发现有几篇文章也暗示了这个问题,但这些文章的解决方案对我不起作用。具体来说,我说的是这些文章。
SDL - window doesn't show anything
https://bbs.archlinux.org/viewtopic.php?id=188412
希望我提供了足够的信息,并且有人遇到过同样的问题并且能够解决它。提前致谢!
在
#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 上的 'rendering driver' 问题,你可以从命令行 运行 我的小 GPL game 并复制粘贴控制台中显示的信息吗?
你应该看到这样的东西:
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
我在 CentOS 5 上遇到了同样的问题,当 'SDL_RENDERER_PRESENTVSYNC' 标志在渲染器中打开时,或者只要您不将任何纹理复制到渲染器。
另一个想法,当你这样做时会发生什么?
for(int i = 0; i < 10; i++) {
SDL_BlitSurface(image, NULL, surface, NULL);
SDL_UpdateWindowSurface(window);
SDL_Delay(500);
}