SDL2 пустое прозрачное окно в Linux - PullRequest
2 голосов
/ 07 марта 2019

Вот пример кода SDL2, который я пытался запустить на своем компьютере с Linux под управлением Ubuntu 18.04 с KDE Plasma Desktop Environment (у меня установлено несколько рабочих столов на случай, если это уместно):

#include<iostream>
#include<SDL2/SDL.h>

int main(int argc, char** argv)
{
    if(SDL_Init(SDL_INIT_VIDEO) != 0){
        std::cerr << "SDL_Init() Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    SDL_Window* win = SDL_CreateWindow(
        "Hello world",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        640,480,
        0
    );

    if(win == nullptr){
        std::cerr << "SDL_CreateWindow() Error: " << SDL_GetError() << std::endl;
        return 1;  
    }

    //Create and init the renderer
    SDL_Renderer* ren = SDL_CreateRenderer(win, -1, 0);
    if(ren == nullptr){
        std::cerr << "SDL_CreateRenderer() Error: " << SDL_GetError() << std::endl;
        SDL_DestroyWindow(win);
        return 1;
    }

    //Render something
    SDL_RenderSetLogicalSize(ren,640,480);

    //Set colour of renderer
    SDL_SetRenderDrawColor(ren,255,0,0,255);

    //Clear the screen to the set colour
    SDL_RenderClear(ren);

    //Show all the has been done behind the scenes
    SDL_RenderPresent(ren);

    //Delay so that we can see what is on the screen
    SDL_Delay(5000);

    //Clean Up
    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();

    return 0;
}

Красныйокно, которое должно появиться, появляется только один раз, когда я запускаю программу в первый раз.Все последующие исполнения создают пустое прозрачное окно с тем, что находится на заднем плане.Фоновое изображение перетаскивается вместе с окном.

Я пробовал флаг SDL_WINDOW_SHOWN в SDL_CreateWindow(), а также флаг SDL_RENDER_ACCELERATED для SDL_CreateRenderer().

Единственный способ снова создать красный экран - перезагрузить систему.

Я даже скомпилировал и запустил это с IDE (CodeLite), и я все еще получил те же результаты.

Этот конкретный вопрос по SO показывает похожие проблемы.Но ОП не использует Linux, и проблема не совсем та же.

В других публикациях на этом сайте упоминается обработка событий, но я не дошел до этого.Если это вообще необходимо, я был бы признателен за некоторые ресурсы, так как документация мало что объясняет.

Обновление : эта программа работает нормально надругой компьютер под управлением Lubuntu 18.10.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Замените SDL_Delay() (который блокирует всю обработку событий, например, уведомление X11 / Wayland и вашего оконного менеджера о том, что ваш процесс еще жив) циклом, который как-то вызывает SDL_PumpEvents(), либо напрямую (например,ниже) или косвенно через SDL_PollEvent() / SDL_WaitEvent():

const Uint32 startMs = SDL_GetTicks();
while( SDL_GetTicks() - startMs < 5000 )
{
    SDL_PumpEvents();

    //Render something
    SDL_RenderSetLogicalSize(ren,640,480);

    //Set colour of renderer
    SDL_SetRenderDrawColor(ren,255,0,0,255);

    //Clear the screen to the set colour
    SDL_RenderClear(ren);

    //Show all the has been done behind the scenes
    SDL_RenderPresent(ren);
}

Все вместе:

#include <iostream>
#include <SDL2/SDL.h>

int main( int argc, char** argv )
{
    if( SDL_Init( SDL_INIT_VIDEO ) != 0 )
    {
        std::cerr << "SDL_Init() Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    SDL_Window* win = SDL_CreateWindow
        (
        "Hello world",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        640, 480,
        0
        );

    if( win == nullptr )
    {
        std::cerr << "SDL_CreateWindow() Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    //Create and init the renderer
    SDL_Renderer* ren = SDL_CreateRenderer( win, -1, 0 );
    if( ren == nullptr )
    {
        std::cerr << "SDL_CreateRenderer() Error: " << SDL_GetError() << std::endl;
        SDL_DestroyWindow( win );
        return 1;
    }

    const Uint32 startMs = SDL_GetTicks();
    while( SDL_GetTicks() - startMs < 5000 )
    {
        SDL_PumpEvents();

        //Render something
        SDL_RenderSetLogicalSize( ren, 640, 480 );

        //Set colour of renderer
        SDL_SetRenderDrawColor( ren, 255, 0, 0, 255 );

        //Clear the screen to the set colour
        SDL_RenderClear( ren );

        //Show all the has been done behind the scenes
        SDL_RenderPresent( ren );
    }

    //Clean Up
    SDL_DestroyRenderer( ren );
    SDL_DestroyWindow( win );
    SDL_Quit();

    return 0;
}
0 голосов
/ 07 марта 2019

Та же программа прекрасно работает, когда я переключаюсь в среду LXDE. Он также работает на другом компьютере Linux с Lubuntu 18.10.

...