У меня есть вопрос.Я пытаюсь создать код для обновления своей игры, но я попал в "дилемму".Я не хочу использовать виртуальный, и единственная причина для этого - ВСЕ, с кем я разговаривал (на форумах, в чатах, в друзьях), говорят, что виртуалы делают код очень медленным, поэтому я провел исследование и выяснил, что поиск выполняется изvtable может снизить производительность почти вдвое.Итак, я использую его для задач, которые не нужно обновлять каждый кадр.Все работало нормально, пока я не попал в функции обновления / рендеринга.Тогда я начал думать, чтобы найти обходной путь.Есть идея, но сначала я хотел бы спросить людей, которые имеют знания об этом, прежде чем ее реализовать.
Мой игровой движок очень ориентирован на события.Я могу отправлять любые данные, используя события между подсистемами (графика, пользовательский интерфейс, сценарии).Итак, я думаю об отправке события "renderScene" каждый кадр.Это звучит здорово для меня, но есть проблема.Структура обработчиков событий не так уж велика, и я действительно не хочу улучшать это прямо сейчас, потому что это действительно достойная работа, и моя цель - закончить мою игру вместо того, чтобы починить движок и никогда не заканчивать ее (случилось ся, так что не хочу возвращаться к этому снова).
Мой обработчик событий имеет функцию, которая регистрирует события для функций (я вызываю обработчики).Но проблема с этой функцией заключается в том, что мне нужно делать привязки функций и прочее для регистрации функций-членов.Итак, я нашел обходной путь - я создаю статическую функцию и вызываю функцию-член из нее.Вот как выглядит статическая функция:
void GraphicsSubsystem::renderScene(Subsystem * subsystem, Event * event) {
GraphicsSubsystem * graphics = static_cast<GraphicsSubsystem *>(subsystem);
graphics->renderScene();
}
void ScriptingSubsystem::runLine(Subsystem * subsystem, Event * event) {
ScriptingSubsystem * scripting = static_cast<ScriptingSubsystem *>(subsystem);
Event1<String> * e = static_cast<Event1<String> *>(event);
scripting->runLine(e->getArg());
}
Аргументами всегда являются класс абстрактной подсистемы и класс базового события.Функция runLine У меня нет проблем приведения, потому что я не запускаю строку кода в каждом кадре.Однако функция renderScene делает меня немного неудобным.
tl; dr Итак, вот мой вопрос.Статическое приведение объекта в каждом кадре быстрее, чем вызов виртуальной функции в каждом кадре?