Что именно делает SDL_Init? - PullRequest
       9

Что именно делает SDL_Init?

0 голосов
/ 01 декабря 2018

Итак, я начал использовать SDL около года назад, и я просто подумал, что SDL_Init инициализировал подсистемы SDL (как написано здесь: https://wiki.libsdl.org/SDL_Init), и что мне пришлось вызывать его раньше всего.Но сегодня я понял, что в довольно большом проекте я просто забыл назвать его, и у меня никогда не было проблем: все работает отлично.Так что мне просто интересно, что он делает, так как, по-видимому, он мне не нужен, чтобы использовать библиотеку?

1 Ответ

0 голосов
/ 01 декабря 2018

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;
        }
    }
// [...]
}

Проблема в том, что вы можете когда-нибудьвозникнет ошибка из-за того, что что-то не инициализировано, и вы не сможете легко найти причину.Вкратце, инициализируйте подсистемы, которые вы используете.Это ничего не стоит и потенциально может спасти вас от многих неприятностей.

...