2009-11-18 119 views
0

我在创建一个简单的2D游戏引擎的同时,更深入地从C++开始。在我的引擎我有(或希望有)的“抽象” GameEntity类,它携带的方法drawupdate,也许position(X,Y)。在我看来,我会添加更多的东西。使渲染方法虚拟?

类从GameEntity继承将是任何可能在屏幕上绘制(ParticleSystemMovingSpriteStaticSpriteGuiMenu,等...)

我的问题是,要实现这一点,我已经宣布GameEntitydraw()update()方法虚:

virtual draw()=0; 
virtual update()=0; 

所以ParticleSystem都有它自己的平局和MovingSprite也有它自己的draw()(和update())。

我知道虚函数是昂贵的,或者至少比普通方法更昂贵。你认为我所做的事很糟糕吗?或者太糟糕了?如果你这样做,我会非常感激一个更好的方式来做到这一点。

谢谢!

+0

你有没有注意到你的代码变慢了?我对此表示怀疑。良好的设计>微型优化。 – GManNickG 2009-11-18 05:08:45

+0

感谢所有的答案,我想我一点也不会这么做! – Goles 2009-11-18 11:29:15

回答

3

不,这不坏;开销不是显着(你可以咨询this answer to another question)。

例如,这是基于OpenGL的开源场景图OpenSceneGraph采取的一般方法。 OSG具有a Node class,从中派生出场景图中使用的所有节点类型,并使用大量的虚拟功能。

+0

感谢您的回答,我碰巧也为我的游戏使用了SceneGraph,但它更简单一些,我现在只允许在场景中使用子节点列表(不需要支持子节点的树结构但)。 – Goles 2009-11-18 11:28:44

1

如果你真的需要在运行时处理多个案件(我认为你这样做,在这种情况下),最好是使用虚拟功能。编译器可能会优化它,或者甚至比if-else声明更好,因为虚拟函数类似于if-else的特例。

2

我上现在的工作系统使用虚拟平局()和update()在3D层树;我们的性能瓶颈不在虚拟调度中。我认为你的设计可以从一开始;如果你认为这真的很糟糕,你可以稍后再分析。它是什么,一个负载和一个跳跃?

2

调用一个虚函数的成本通常比两次指针间接寻址更多的是正常的函数调用,所以这是一个非常小的开销,应该几乎从不重要。

另外,包含函数的对象的大小大于没有任何虚函数的对象(它们包含指向对象虚函数表的指针)的大小。但是,如果你不打算有太多的小物件,这也应该不重要。

详情请参阅C++ FAQ lite

并回答你的问题:我认为它应该可以正常工作。