2016-06-29 36 views
4

我剛剛開始使用SDL2,閱讀了幾篇文章,並能夠編譯我在Arch Linux上成功編寫的測試程序。似乎正在發生的唯一問題是,正在創建的窗口不會呈現圖像。我試着在Mac上運行相同的代碼,這確實導致了預期結果。我使用CLION,它不是malefactor,因爲用g ++通過CLI進行編譯的結果相同。Arch Linux上的SDL2:窗口呈現它背後的屏幕

我的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文件(克利翁使用):

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 

它看起來什麼拱上運行的代碼時,如:

Code run on Arch Linux

我應該注意,僅複製什麼屏幕上的一次,並且不更新窗口內容。所以當我移動窗口時,窗口中呈現的內容保持不變。

在Mac:

enter image description here

已經找到了幾篇文章也暗示了這個問題,但這些條款的解決方案並不爲我工作。具體來說,我在談論這些文章。

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; 
//} 
+0

1.不要自由的窗口表面,和2. - 在大多數情況下(通常與合成窗口管理器有關),你不能期望圖像通過簡單的等待出現。添加一個循環,刷新事件隊列,然後繪製圖像,然後重複。 – keltar

+0

...我再次忘記了「關閉」功能。請不要這樣做。 http://stackoverflow.com/questions/31482117/sdl-event-handling-not-working – keltar

+0

感謝提示,我會考慮他們,當我更流利的框架。現在,我只是按照本教程,因爲你可能已經扣除:http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php 改變你的建議並沒有改變一個事實,即沒有任何事實被呈現我所要求的。我現在要做的主要事情是修正在Arch Linux上運行此代碼並在OS X上運行它之間似乎存在的差異。 –

回答

1

我已經運行在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 

我遇到在CentOS 5同樣的問題時,「SDL_RENDERER_PRESENTVSYNC」標誌是在渲染器或只要你不要複製任何紋理給渲染器。

另一種想法,當你這樣做時會發生什麼?

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

感謝您的回答!當我將圖像渲染函數放入一個循環中時,圍繞它的第二次迭代確實會顯示圖像。由於我計劃製作一款應該持續渲染的遊戲,因此我沒有發現使用Arch作爲我的開發平臺(這是我的首選操作系統)的問題。仍然奇怪的是,第一次渲染結果將導致窗口後面的內容被複制。這不僅僅是在渲染圖像時這樣做。嘗試用矩形對背景進行着色也是一樣的。 –

+0

如果您打算製作遊戲,當然不應該使用SDL_UpdateWindowSurface(),它是'軟件'渲染的,但是[2D加速渲染函數](https://wiki.libsdl.org/CategoryRender)或OpenGL。 –