使渲染方法虚拟化?

时间:2009-11-18 05:03:00

标签: c++

我在构建简单的2D游戏引擎时更深入地开始使用C ++。在我的引擎中,我有(或想要)一个“抽象”GameEntity类,它带有方法drawupdate,也许position(x,y) 。我会在发生的时候添加更多东西。

要从GameEntity继承的类可以在屏幕上绘制(ParticleSystemMovingSpriteStaticSpriteGuiMenu等等。 )

我的问题是,要实现这一点,我已声明GameEntity draw()update()方法虚拟:

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

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

我知道虚拟功能很昂贵,或者至少比普通方法更昂贵。你觉得我做的很糟糕吗?还是太糟糕了?如果你这样做,我真的很感激有更好的方法来做到这一点。

谢谢!

4 个答案:

答案 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的特殊情况。