Использование SDL_PollEvent против SDL_PumpEvents - PullRequest
0 голосов
/ 04 июня 2019

Я уже некоторое время пользуюсь SDL, но теперь мне кажется, что я поступаю неправильно при работе с событиями клавиатуры.

Обычно мой основной цикл выглядит примерно так:

int main() {
    SDL_Init(SDL_INIT_VIDEO);
    /* Some video system initializations */

    /* Main loop */
    for(;;) {
        SDL_PumpEvents();
        const unsigned char *key = SDL_GetKeyboardState(nullptr);

        /* Do something with the keys pressed */
    }
}

... и это хорошо сработало для меня. Но я недавно просмотрел несколько примеров кода, и технически все они используют другой шаблон:

int main() {
    SDL_Init(SDL_INIT_VIDEO);
    /* Some video system initializations */

    /* Main loop */
    for(;;) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            /* switch/case to know keys pressed */
        }
    }
}

Итак, просмотрев документацию по SDL, я обнаружил, что SDL_PollEvent вызывает SDL_PumpEvents. Ссылка SDL_PollEvent

И что SDL_PumpEvents собирает состояние всех устройств ввода для генерации объектов событий. Ссылка SDL_PumpEvents

Итак, в первом примере я не сбрасываю очередь событий, так почему же она работает без сбоев? Является ли второй шаблон правильным способом получения состояния ввода?

1 Ответ

1 голос
/ 04 июня 2019

Хотя PumpEvents изменяет общее состояние клавиатуры и мыши, его точность может быть недостаточной.Учтите, что вы нажали, переместили и отпустили все мышки в одном кадре - с глобальным состоянием вы получите последнюю позицию и состояние «отпущено», но не позицию первого щелчка или даже сам щелчок.То же самое для клавиатуры - вы получаете «последнее» состояние, но не историю и порядок, в котором были нажаты / отпущены клавиши.Есть также много «особых» событий, таких как события окна, джойстики (SDL имеет дополнительный фоновый высокочастотный поток для опроса джойстика и помещения событий в очередь) и даже события горячего подключения для аудиоустройств и джойстиков - вы не сможете получить это безпроверка очереди событий.

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

...