簡體   English   中英

Arch Linux上的SDL2:窗口呈現它背后的屏幕上的內容

[英]SDL2 on Arch Linux: window renders what's on the screen behind it

我剛剛開始使用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})

我用過的Unix命令用g ++編譯它:

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

在Arch上運行代碼時的樣子:

代碼在Arch Linux上運行

我應該注意,它只復制屏幕上的內容一次,並且不更新窗口內容。 因此,當我移動窗口時,窗口中呈現的內容保持不變。

在Mac上:

在此輸入圖像描述

找到了幾篇也暗示這個問題的文章,但這些文章的解決方案對我不起作用。 具體來說,我在談論這些文章。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM