我有问题。我试图创建代码来更新我的游戏,但我陷入了一个“困境”。我不想使用虚拟的,唯一的原因是每个我谈论的人(在论坛,聊天,朋友)都说虚拟代码真的很慢,所以我做了一个研究,发现它的搜索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所以,这是我的问题。在每一帧上静态地投射一个对象比在每一帧上调用一个虚拟功能还要快吗?
不要害怕使用虚拟方法。这只是过早的优化。 – Matt 2011-12-24 07:34:53
我将尝试基于渲染场景的事件,因为它更符合我的设计。你是对的,我会担心建立结构,然后担心表现。游戏不会是一个巨大的MMO或任何东西,所以我应该担心这些有点事情。谢谢大家!! – Gasim 2011-12-24 07:50:12