Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SDL2在调整窗口大小时崩溃 我用我的C++游戏使用SDL2,我试着实现在全屏上进出的能力(老实说,我只是最大化了窗口)。问题是,每次我调用SDL\u MaximizeWindow或SDL\u RestoreWindow时,它都会立即因segfault崩溃,转储堆栈并退出。请注意,当我用鼠标手动调整窗口大小时,它也会这样做_C++_Crash_Sdl 2_Window Resize - Fatal编程技术网

SDL2在调整窗口大小时崩溃 我用我的C++游戏使用SDL2,我试着实现在全屏上进出的能力(老实说,我只是最大化了窗口)。问题是,每次我调用SDL\u MaximizeWindow或SDL\u RestoreWindow时,它都会立即因segfault崩溃,转储堆栈并退出。请注意,当我用鼠标手动调整窗口大小时,它也会这样做

SDL2在调整窗口大小时崩溃 我用我的C++游戏使用SDL2,我试着实现在全屏上进出的能力(老实说,我只是最大化了窗口)。问题是,每次我调用SDL\u MaximizeWindow或SDL\u RestoreWindow时,它都会立即因segfault崩溃,转储堆栈并退出。请注意,当我用鼠标手动调整窗口大小时,它也会这样做,c++,crash,sdl-2,window-resize,C++,Crash,Sdl 2,Window Resize,以下是一些有用的数据: 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,

以下是一些有用的数据:

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);
}
每次手动调整大小和调用
切换全屏时,游戏都会崩溃。我在Windows上通过mingw-w64和Msys2使用g++进行编译,下面是堆栈转储

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

好的,经过大量的研究,我发现了一个GitHub问题,在一月份的某个时候,有人在他们的游戏中遇到了同样的问题,这个问题()将我引向了这个线程(),它告诉我使用OpenGL渲染器而不是D3D来提示SDL2,这对我来说确实有效

因此,基本上,问题是当使用带有标志
SDL\u TEXTUREACCESS\u STREAMING
SDL\u纹理时,调整窗口大小会破坏纹理,不会再次创建它,因为D3D在使用它(或其他)时不会检查空指针。显然,它是唯一存在此问题的渲染器,因此在程序中使用以下命令可以解决此问题:

SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");

开发人员说它应该在下一个SDL2版本(即2.0.5版)中修复,但由于某些原因,我无法用它编译我的游戏。这是一个全新的问题,现在这个问题已经解决了。

如果
&sdlWindow,&sdlRenderer
是回调函数,我建议删除
&
。它们实际上是SDL_窗口和SDL_渲染器指针:在a中编辑。好了,我添加了它。有些事情告诉我,如果不是在我这边,它已经被修复了。使用发行版提供的SDL2软件包在我的Debian测试机上手动调整大小,它会在你的系统上崩溃吗?内置调试&发布符号化堆栈跟踪。您是自己构建SDL2还是使用libsdl.org中的MinGW二进制文件?
SDL_RenderCopy(sdlRenderer, s, NULL, NULL);
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");