SDL2 падает при изменении размера окна

Я использую SDL2 с моей игрой на C ++ и пытаюсь реализовать возможность входить и выходить из полноэкранного режима на лету (честно говоря, я просто максимизирую окно). Дело в том, что каждый раз, когда я звоню SDL_MaximizeWindow или же SDL_RestoreWindow, он мгновенно падает с segfault, сбрасывает стек и завершает работу. Обратите внимание, что это также происходит, когда я вручную изменяю размер окна с помощью мыши.

Вот некоторые полезные данные:

void init()
{
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
SDL_CreateWindowAndRenderer(320 * 2, 240 * 2, SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE, &sdlWindow, &sdlRenderer);
SDL_RenderSetLogicalSize(sdlRenderer, 320, 240);
MAIN_SCREEN = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, 320, 240);
}
void toggleFullscreen()
{
if(SDL_GetWindowFlags(sdlWindow) & SDL_WINDOW_MAXIMIZED)
SDL_RestoreWindow(sdlWindow);
else
SDL_MaximizeWindow(sdlWindow);
}

Игра вылетает при каждом изменении размера руководства и при каждом вызове toggleFullscreen, Я компилирую с g ++ через mingw-w64 и Msys2 под Windows, и вот дамп стека.

Exception: STATUS_ACCESS_VIOLATION at rip=0006C79976B
rax=0000000000000000 rbx=0000000000000000 rcx=0000000000000000
rdx=0000000002F1BE20 rsi=000000000004DD80 rdi=0000000000046078
r8 =00000000FFFFC66C r9 =00000000FFFFC800 r10=0000000000000001
r11=0000000000000000 r12=00000000FFFFC800 r13=0000000000040010
r14=0000000000000001 r15=000000018021CE41
rbp=0000000000046240 rsp=00000000FFFFC580
program=nKaruga.exe, pid 96868, thread main
cs=0033 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame        Function    Args
00000046240  0006C79976B (0006C79B8D4, 0000004DE80, 00000000000, 00000000000)
00000000224  0006C799C6E (00000000002, 00001FF5488, 00000000000, 0018021CE41)
000FFFFC7E0  0006C79A64B (00016362004, 00002F85480, 00000000500, 00000000001)
000FFFFC870  0006C7937D3 (00100414C74, 00600000000, 0000000FFFF, 280802601C0)
000FFFFC870  00100418FBA (00000000000, 00600000000, 00100000000, 00000000000)
000FFFFC900  00100416AD4 (00000040010, 000FFFFCC20, 0018004607A, 000004638EF)
00000040030  0010041DA1A (000FFFFCCC0, 000004638F1, 000FFFFCB48, 00100000068)
000FFFFCCC0  00100425013 (00000000020, FF0700010302FF00, 001800479BE, 00000000000)
000FFFFCCC0  00180047A2F (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  00180045753 (00000000000, 00000000000, 00000000000, 00000000000)
000FFFFFFF0  00180045804 (00000000000, 00000000000, 00000000000, 00000000000)
End of stack trace

Дайте мне знать, если я делаю что-то не так, заранее спасибо!

РЕДАКТИРОВАТЬ: вот код, который вылетает.

#include <SDL.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
SDL_Window *sdlWindow;
SDL_Renderer *sdlRenderer;
SDL_Texture *s;
SDL_Event event;
bool cont = true;

SDL_Init(SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(320 * 2, 240 * 2, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE, &sdlWindow, &sdlRenderer);
SDL_RenderSetLogicalSize(sdlRenderer, 320, 240);
s = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, 320, 240);

while(cont)
{
SDL_PollEvent(&event);
if(event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE)
cont = false;

SDL_RenderCopy(sdlRenderer, s, NULL, NULL);
SDL_RenderPresent(sdlRenderer);
}

SDL_DestroyTexture(s);
SDL_DestroyRenderer(sdlRenderer);
SDL_DestroyWindow(sdlWindow);

return 0;
}

РЕДАКТИРОВАТЬ 2: GDB говорит мне это о сбое (gcc -Og -g3):

#0  0x000000006c79976b in SDL_LogCritical () from /c/Users/###/nKaruga-git/bin/win/SDL2.dll
#1  0x000000006c799c6e in SDL_LogCritical () from /c/Users/###/nKaruga-git/bin/win/SDL2.dll
#2  0x000000006c79a64b in SDL_LogCritical () from /c/Users/###/nKaruga-git/bin/win/SDL2.dll
#3  0x000000006c7937d3 in SDL_LogCritical () from /c/Users/###/nKaruga-git/bin/win/SDL2.dll
#4  0x0000000100401194 in SDL_main (argc=argc@entry=1, argv=argv@entry=0x40010) at test.c:23
#5  0x00000001004019fa in main_utf8 (argv=0x40010, argc=<optimized out>) at ../src/main/windows/SDL_windows_main.c:126
#6  WinMain (hInst=hInst@entry=0x100400000, hPrev=hPrev@entry=0x0, szCmdLine=szCmdLine@entry=0x3c38ef "", sw=<optimized out>) at ../src/main/windows/SDL_windows_main.c:189
#7  0x0000000100401ce3 in main () at /msys_scripts/msys2-runtime/src/msys2-runtime/winsup/cygwin/lib/libcmain.c:37

Строка 23 test.c — это:

SDL_RenderCopy(sdlRenderer, s, NULL, NULL);

-2

Решение

Хорошо, после довольно большого исследования, я обнаружил проблему GitHub о том, что у кого-то есть такая же проблема в их игре, когда-то в январе, и проблема (https://github.com/Attnam/ivan/pull/135) указал мне всю дорогу до этой темы (https://forums.libsdl.org/viewtopic.php?t=11913), который затем говорит мне, чтобы я намекнул SDL2 на использование рендерера OpenGL вместо D3D, что сработало для меня.

Таким образом, в основном проблема заключается в том, что при использовании SDL_Texture с флагом SDL_TEXTUREACCESS_STREAMINGизменение размера окна уничтожает текстуру и не создает ее снова, потому что D3D не проверяет наличие нулевого указателя при работе с ним (или чем-то еще). По всей видимости, это единственный рендерер с этой проблемой, поэтому исправьте это с помощью следующей программы:

SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");

Разработчики говорят, что это должно быть исправлено в следующем выпуске SDL2 (это будет 2.0.5), но по какой-то причине я не могу скомпилировать свою игру с ним. Это совершенно новая проблема, но пока эта проблема исправлена.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]