c++ - 虚拟或类型转换

标签 c++ casting event-handling polymorphism

我有一个问题。我正在尝试创建代码来更新我的游戏,但我陷入了“困境”。我不想使用虚拟,唯一的原因是我与之交谈的每个人(在论坛、聊天、 friend 中)都说虚拟使代码非常慢,所以我做了一项研究,发现它从vtable 可以将性能降低近一半。所以,我将它用于不需要每一帧都更新的任务。一切正常,直到我进入更新/渲染功能。然后我开始考虑寻找解决方法。有一个想法,但首先我想在实现之前询问了解该想法的人。

我的游戏引擎非常受事件驱动。我可以使用子系统(图形、用户界面、脚本)之间的事件发送任何类型的数据。所以,我正在考虑每帧发送一个事件“renderScene”。这对我来说听起来不错,但有一个问题。事件处理程序的结构不是很好,我现在真的不想改进它,因为它做得非常好,我的目标是完成我的游戏而不是修复引擎并且永远不会完成它(碰巧我,所以不想再回到它了)。

我的事件处理程序有一个将事件注册到函数的函数(我调用处理程序)。但是那个函数的问题是,我需要做函数绑定(bind)和其他东西来注册成员函数。所以,我找到了一个解决方法——我创建了一个静态函数并从中调用成员函数。这就是静态函数的样子:

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 那么,这是我的问题。在每一帧上静态转换对象是否比在每一帧上调用虚函数更快?

最佳答案

是的,静态转换是一个相当快的操作。静态转换是静态的,即所有参数在编译时都是已知的,而在运行时指针由常量修改。

但是,您也不应该对虚函数调用过于悲观。虽然它们比普通函数调用慢,但在许多时间尺度上它们仍然非常非常快,尤其是与渲染场景的成本相比。我很难想象一个游戏会因每帧 O(1) 虚函数调用而变慢。首先做一个干净的设计,当你观察一个缓慢的游戏并可以分析它到底在哪里慢时,担心慢。

关于c++ - 虚拟或类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8623292/

相关文章:

c++ - map 中的 map

c++ - OpenGL - 索引缓冲困难

android - 使用 findFragmentByTag 抑制 FindBugs 警告

C#:使用泛型将对象转换为无符号数字类型

c - 在不抑制警告的情况下告诉编译器对齐没问题的可移植方法?

c# - 关联控件 C# 的简便方法

c++ - VS 2010 目录结构

C++试图确定最高和最低数字并获得一个长十进制数

android - ExpandableListAdapter.getChildView() 与 AbsListView.LayoutParams 的交互

jquery - 由于虚拟键盘导致的 window.resize 导致 jquery mobile 出现问题