SDL_Init 到底做了什么?

Job*_*qua 3 sdl sdl-2

所以,我大约一年前开始使用 SDL,我只是认为 SDL_Init 初始化了 SDL 的子系统(如此处所写: https: //wiki.libsdl.org/SDL_Init),并且我必须在执行其他操作之前调用它。但今天,我意识到在一个相当大的项目中,我只是忘记调用它,而且我从来没有遇到任何问题:一切都很完美。所以我只是想知道它的作用,因为我显然不需要它来使用该库?

Nel*_*eal 6

SDL_Init确实初始化了 SDL 的子系统。事实上,它只是转发到SDL_InitSubSystem您在源代码中看到的:

int
SDL_Init(Uint32 flags)
{
    return SDL_InitSubSystem(flags);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您不调用SDL_Init或 ,SDL_InitSubSystem但在使用子系统时没有遇到任何问题,那么您可能很幸运。通过查看SDL源代码,您可能会发现很多函数在使用资源之前会检查资源是否已初始化,如果可能则进行初始化。例如,如果需要,SDL_GetTicks可以调用:SDL_TicksInit

Uint32
SDL_GetTicks(void)
{
// [...]
    if (!ticks_started) {
        SDL_TicksInit();
    }
// [...]
}
Run Code Online (Sandbox Code Playgroud)

同样,如果需要,SDL_CreateWindow可以调用:SDL_VideoInit

SDL_Window *
SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
{
// [...]
    if (!_this) {
        /* Initialize the video system if needed */
        if (SDL_VideoInit(NULL) < 0) {
            return NULL;
        }
    }
// [...]
}
Run Code Online (Sandbox Code Playgroud)

问题是,有一天你可能会因为某些东西没有初始化而遇到错误,并且你将无法轻松找到原因。简而言之,初始化您使用的子系统。它不会花费您任何费用,并且可能会为您节省很多麻烦。