SDL_Init到底能做什么?

时间:2018-12-01 13:41:25

标签: sdl sdl-2

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

1 个答案:

答案 0 :(得分:2)

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

int
SDL_Init(Uint32 flags)
{
    return SDL_InitSubSystem(flags);
}

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

Uint32
SDL_GetTicks(void)
{
// [...]
    if (!ticks_started) {
        SDL_TicksInit();
    }
// [...]
}

类似地,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;
        }
    }
// [...]
}

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