我刚刚开始使用SDL2,阅读了其中的几篇文章,并且能够成功编译我在Arch Linux上编写的测试程序。似乎正在发生的唯一问题是,正在创建的窗口无法呈现图像。我试过在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上运行代码时的外观:

c&#43;&#43; - Arch Linux上的SDL2 : window renders what&#39;s on the screen behind it-LMLPHP

我应该注意,它只会复制一次屏幕上的内容,并且不会更新窗口内容。因此,当我四处移动窗口时,窗口中呈现的内容保持不变。

在Mac上:

c&#43;&#43; - Arch Linux上的SDL2 : window renders what&#39;s on the screen behind it-LMLPHP

已经找到了几篇文章也暗示了这个问题,但是这些文章的解决方案对我不起作用。具体来说,我在谈论这些文章。

SDL - window doesn't show anything

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's comment之后编辑(仍然不执行应做的工作):
#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 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

当渲染器中的“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);
}

关于c++ - Arch Linux上的SDL2 : window renders what's on the screen behind it,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38109558/

10-16 12:04