Преимущество функций обратного вызова? (графика) - PullRequest
0 голосов
/ 12 апреля 2020

Я относительно новичок в написании приложений на основе ввода. Я использую OpenGL и GLFW для написания игр на данный момент, и в основе этого лежит пользовательский ввод. Из того, что я понимаю, OpenGL как программа C означает, что я не могу использовать классы для инкапсуляции существующих, предопределенных функций обратного вызова.

Одним из способов решения этой проблемы является использование самоопределенного обратного вызова в качестве глобальной функции или в качестве метода stati c в классе. Ссылка предоставляет довольно много интересных способов сделать это. Некоторые из них лучше, чем то, что я делаю сейчас, но мой вопрос остается - стоит ли таких усилий?

void glfwKeyCallBack(some parameters)  // GLFW-defined
{ // does something}

void SelfDefinedFun(some parameters)  // my definition of it
{ // does something}

int main()
{
  while(gamelooptrue) // inside game loop here
  {
    1. SelfDefinedFun(some parameters) // call function here instead of using glfwKeyCallBack
    2. action 2
    3. action 3
    ...
  }

}

Функции обратного вызова автоматически называются в момент соответствующего действия происходит. Это означает, что независимо от того, насколько медленной является моя игра l oop, при каждом нажатии клавиши вызывается glfwkeyCallBack. Я смутно вижу некоторые преимущества такого метода по сравнению с повторным вызовом SelfDefinedFun в игре l oop.

Однако ... игра l oop требует, чтобы рисунок сцены происходил в каждом кадре. Учитывая текущие стандарты, это обычно 60 раз в секунду, но я думаю, что нам понадобится как минимум 15 кадров в секунду, чтобы иметь не рывковую визуализацию движения на экране. Учитывая это, я могу забыть об обратном вызове и просто проверять нажатие клавиш в каждом кадре. Преимущество здесь в том, что я могу легко инкапсулировать функцию, и это позволяет мне выполнять более сложные операции на основе событий.

Итак, почему обратные вызовы даже необходимы, если мы рисуем игру так много раз в секунду? Одна из причин, по которой я думаю, что обратные вызовы могут быть лучше, заключается в том, что вы не проверяете действия пользователя, если у вас не остается больше времени на рисование. Поскольку мое приложение простое, это незначительное время. Но будет ли это иначе в полномасштабных 3D-играх, таких как Skyrim, Bioshock et c.?

...