我在构建简单的2D游戏引擎时更深入地开始使用C ++。在我的引擎中,我有(或想要)一个“抽象”GameEntity
类,它带有方法draw
,update
,也许position
(x,y) 。我会在发生的时候添加更多东西。
要从GameEntity
继承的类可以在屏幕上绘制(ParticleSystem
,MovingSprite
,StaticSprite
,GuiMenu
等等。 )
我的问题是,要实现这一点,我已声明GameEntity
draw()
和update()
方法虚拟:
virtual draw()=0;
virtual update()=0;
所以ParticleSystem
有自己的平局,MovingSprite
也有自己的draw()
(和update()
)。
我知道虚拟功能很昂贵,或者至少比普通方法更昂贵。你觉得我做的很糟糕吗?还是太糟糕了?如果你这样做,我真的很感激有更好的方法来做到这一点。
谢谢!
答案 0 :(得分:3)
不,这不错;开销并非 显着(您可以咨询this answer to another question)。
例如,这是OpenSceneGraph采用的一般方法,这是一种基于OpenGL的开源场景图。 OSG有a Node
class,从中派生出场景图中使用的所有节点类型,它使用了大量的虚函数。
答案 1 :(得分:2)
我现在使用的系统现在在3d图层树中使用虚拟draw()和update();我们的性能瓶颈不在虚拟调度中。我认为你的设计很好;如果您认为它真的很糟糕,您可以稍后进行分析。这是什么,一个负载和一个跳跃?
答案 2 :(得分:2)
调用虚函数通常需要两个指针间接,而不是正常的函数调用,所以这是一个非常小的开销,应该几乎无关紧要。
此外,包含函数的对象的大小比没有任何虚函数的对象大一个指针(它们包含指向对象虚函数表的指针)。但是,如果你不打算让真正过量的小物件也无所谓。
有关详情,请参阅C++ FAQ lite。
并回答你的问题:我认为它应该可以正常工作。
答案 3 :(得分:1)
如果你真的需要在运行时处理多个案例(在这种情况下我认为你这样做),最好使用虚函数。编译器可以优化它,甚至比if-else
语句更好,因为虚函数就像if-else
的特殊情况。