Когда я компилирую и запускаю простое приложение на языке C, использующее библиотеку SDL (версия 2), окно открывается дважды; сначала я вижу окно, которое очень быстро открывается и закрывается, а затем окно поднимается и остается (на две секунды). Есть идеи, что может быть причиной этого?
Вот тестовая программа:
#include <SDL2/SDL.h>
#include <stdio.h>
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
int main(int argc, char* args[]) {
SDL_Window* window = NULL;
SDL_Surface* screenSurface = NULL;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "could not initialize sdl2: %s\n", SDL_GetError());
return 1;
}
window = SDL_CreateWindow(
"hello_sdl2",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN
);
if (window == NULL) {
fprintf(stderr, "could not create window: %s\n", SDL_GetError());
return 1;
}
screenSurface = SDL_GetWindowSurface(window);
SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF));
SDL_UpdateWindowSurface(window);
SDL_Delay(2000);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
Я компилирую программу с помощью
gcc -o hello_sdl2 hello_sdl2.c -lSDL2
и версия такая
$ gcc --version
gcc (Debian 12.2.0-14) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ sdl2-config --version
2.26.5
Редактировать 27 августа 2024 г.:
$ cat /etc/debian_version
12.6
$ wmctrl -m
Name: Blackbox
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: N/A
Какая среда рабочего стола? Может быть, это что-то специфическое для DE? И какая ОС? (Какая версия Debian?)
попробуйте добавить -lSDL2main
при компиляции следующим образом: gcc -o hello_sdl2 hello_sdl2.c -lSDL2 -lSDL2main
@HamzaAlAjlouni Это полезно только в Windows, а у OP нет проблем с связыванием.
@TedLyngmo Да, использование SDL_WINDOW_HIDDEN и SDL_ShowWindow действительно решило проблему, спасибо!
@AugustKarlstrom Отлично! Пожалуйста! Так как я не знаю точно, куда вы поставили SDL_ShowWindow(window);
для решения вопроса, смело пишите ответ на свой вопрос. Это может помочь кому-то еще в будущем.
@HolyBlackCat Теперь я добавил в вопрос информацию о версии ОС и оконном менеджере.
Как отметил Тед Люнгмо в комментариях, решение состоит в том, чтобы использовать флаг SDL_WINDOW_HIDDEN в вызове SDL_CreateWindow, а затем вызвать SDL_ShowWindow после вызова SDL_GetWindowSurface:
...
window = SDL_CreateWindow("hello_sdl2",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_HIDDEN);
...
screenSurface = SDL_GetWindowSurface(window);
SDL_ShowWindow(window);
...
Примечание. Если SDL_ShowWindow вызывается до SDL_GetWindowSurface, проблема «мерцания» остается.
Вы должны сообщить об этом разработчикам SDL как об ошибке.
Я не могу воспроизвести это на своей стороне, но для этого может быть много причин. Возникнет ли у вас та же проблема, если вы замените
SDL_WINDOW_SHOWN
наSDL_WINDOW_HIDDEN
, а затем вызоветеSDL_ShowWindow(window);
послеSDL_FillRect
илиSDL_UpdateWindowSurface
?