我正在研究Ogre3D代码和WildMagic代码,我发现两者对它们的核心类的处理方式有点不同。由于我正在创建自己的核心,我想知道哪一个会是更好的实践,并有可能是更好的资源。
在WildMagic中,有一个从表类继承的矩阵类(不是多态类)。表类可以有N行和N科尔,并获取列和行的getter和setter。这样,矩阵类就有了只对矩阵有意义的功能,而且它很方便地继承了表。在这种情况下,向量也可以从Table继承(尽管WildMagic不这样做)。WildMagic还有一个Transform对象,它存储节点的本地和派生转换。因此,节点将有两个转换对象,其中包含必要的转换(包括位置、旋转、缩放)。
另一方面,在Ogre3D中,矩阵类不派生任何内容,Ogre3D的节点有存储本地和派生位置的变量:Vector localPos; Vector derPos; Matrix localRot; Matrix derRot; etc.
现在请记住,这些是每帧使用/更新/修改数千次的核心对象,如果您意识到在整个游戏中依赖于这些核心类,就很难改变它们。
所以现在的问题是:
wrapper,而在另一种情况下,转换是直接公开的。我想这个问题可以改写为:Does a wrapper have a cost (considering it is an object that needs to be created and destroyed)?发布于 2011-06-05 22:05:39
非常好的,复杂的问题,有很多很多的答案。我会尽我所能解决这些问题,但至少在我看来,总体上的答案是,你的需求比一个人所能做的更多。
1)继承总是有代价的,尽管它非常微小。这个问题真的没有一个简单的答案,所以我可能会读到:http://www.hackcraft.net/cpp/templateInheritance/
( 2)任何必须创造或销毁的东西都要付出代价。一般来说,包装东西会让很多人在一个项目中“更安全”,但否则我觉得它不有用,也不值得。就像继承一样,包装东西的成本也很小。
3)如果每一次计算都很重要,那么如果你没有必要的话,就不要把事情包装起来。至少对于简单的数学课,只需使用模板来方便使用,而不是继承。
总的来说,对于矩阵和向量的基本数据结构,如果程序位于PC或控制台上,无论是哪一种方法,您都不会杀死它。一个缓慢的内存管理器和内存分配将杀死你的游戏远比继承你的向量和矩阵类。
发布于 2011-06-05 21:58:38
如果您没有进行虚拟函数调用,那么从纯性能的角度看,这并不重要。我个人会反对继承,而不是任何其他的解决方案。小型包装器对象将由编译器优化。然而,我不会鼓励你把OGRE3D看作是一个优秀设计的巅峰--他们充斥着单身人士。
发布于 2011-06-05 22:07:24
对于(1),你是否肯定没有多态性?在继承方面,虚拟函数调用是最大的效率问题。如果没有虚拟函数,两者之间几乎没有差别,而且绝对没有可以推广的差别。也许在一种情况下,对象在内存中的布局会与另一种情况不同,也许您会有不同的大小,其中一种是浪费更多的缓冲区,诸如此类。
对于(2),这一切取决于代码被优化的可能性。通常,如果相关的函数都很容易内联,那么在轻量级包装的情况下将不会有很多实际的函数调用。但同样,内存布局等问题也有可能带来后果。这在抽象上很难预测。
对于(3),我没有做出选择,所以我不知道你指的是什么:-P
https://stackoverflow.com/questions/6246106
复制相似问题