我有一个问题。我正在尝试创建代码来更新我的游戏,但我陷入了“困境”。我不想使用虚拟,唯一的原因是我与之交谈的每个人(在论坛、聊天、 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/