2016-06-29 9 views
4

Ich habe gerade mit SDL2 begonnen, las ein paar Artikel darüber und war in der Lage, das Testprogramm zu kompilieren, das ich auf Arch Linux mit Erfolg geschrieben habe. Das einzige Problem, das scheinbar auftritt, ist, dass das Fenster, das erstellt wird, das Bild nicht rendert. Ich habe versucht, den gleichen Code auf dem Mac auszuführen, was zu dem erwarteten führt. Ich verwende CLion, was nicht der Übeltäter ist, weil das Kompilieren mit g ++ über CLI dasselbe ergibt.SDL2 auf Arch Linux: Fenster rendert, was auf dem Bildschirm dahinter ist

Mein Arch Linux installieren:

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

Hier ist der Code ist ich kompilieren:

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

Meine CMakeLists.txt Datei (verwendet von 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}) 

Und der Unix-Befehl, den ich verwendet habe, um es mit g ++ zu kompilieren:

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

Wie es aussieht, wenn Sie den Code auf Arch läuft:

Code run on Arch Linux

sollte ich beachten Sie, dass es nur Kopien, was einmal auf dem Bildschirm ist, und nicht den Fensterinhalt aktualisieren. Wenn ich das Fenster verschiebe, bleibt das, was im Fenster gerendert wird, gleich.

Auf Mac:

enter image description here

haben herausgefunden, ein paar Artikel auch bei diesem Thema anspielend, aber die Lösungen für diese Artikel für mich nicht funktionieren. Insbesondere rede ich über diese Artikel.

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

Hoffnung, dass ich genügend Informationen zur Verfügung gestellt haben, und dass es jemanden gibt, die das gleiche Problem und konnte es lösen erlebt hat. Danke im Voraus!


bearbeiten nach keltar's comment (noch nicht tut, was es soll):

#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. nicht frei Fensterfläche, und 2. - in den meisten Fällen (in der Regel mit Compositing Window Manager beteiligt) können Sie nicht erwarten, dass Bild durch einfaches Warten erscheint. Fügen Sie eine Schleife hinzu, die die Ereigniswarteschlange löscht, anschließend Ihr Bild zeichnet und dann wiederholt. – keltar

+0

... und ich habe die 'close'-Funktion wieder vergessen. Bitte tu das nicht. http://StackOverflow.com/Questions/31482117/SDL-Event-Handling-Not-Working – keltar

+0

Danke für die Tipps, ich werde über sie nachdenken, wenn ich fließender mit dem Framework bin. Im Moment folge ich nur diesem Tutorial, wie du vielleicht schon gesagt hast: http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php Das Ändern deiner Vorschläge hat nichts daran geändert, dass es tatsächlich nichts gibt von dem, was ich dafür verlangte, gerendert zu werden. Die Hauptsache, die ich jetzt versuche, ist, die Diskrepanz zwischen der Ausführung dieses Codes auf Arch Linux und der Ausführung unter OS X zu beheben. –

Antwort

1

ich Ihren Code auf Ubuntu 14.04 ohne Probleme ausgeführt haben. Um zu überprüfen, ob es sich um einen 'Rendertreiber' unter Linux handelt, könnten Sie meine kleine GPL game über die Befehlszeile ausführen und die in der Konsole angezeigten Informationen kopieren und einfügen?

Sie sollten etwas sehen:

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 

traf ich die gleiche Art von Problem auf 5 CentOS, wenn die ‚SDL_RENDERER_PRESENTVSYNC‘ Flag ON in den Renderer ist oder solange Sie keine Textur kopieren Sie zu einem Renderer.

Eine andere Idee, was passiert, wenn Sie das tun?

+0

Danke für die Antwort! Wenn ich die Bildwiedergabefunktion in eine Schleife setze, zeigt die zweite Iteration das Bild tatsächlich an. Da ich vorhabe, ein Spiel zu entwickeln, das kontinuierlich rendern sollte, sehe ich kein Problem darin, Arch als meine Entwicklungsplattform zu verwenden (was mein bevorzugtes Betriebssystem ist). Immer noch seltsam, dass der erste Aufruf zum Rendern den Inhalt auf dem Bildschirm hinter dem zu kopierenden Fenster ergibt. Und das macht man nicht nur beim Rendern eines Bildes. Der Versuch, den Hintergrund rot mit einem Rechteck zu färben, macht dasselbe. –

+0

Wenn Sie vorhaben, ein Spiel zu erstellen, sollten Sie natürlich SDL_UpdateWindowSurface() nicht verwenden, da es "Software" darstellt, aber [2D Accelerated Rendering-Funktionen] (https://wiki.libsdl.org/CategoryRender) oder OpenGL. –