Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何避免;联轴节;面向对象_C++_Oop - Fatal编程技术网

C++ 我如何避免;联轴节;面向对象

C++ 我如何避免;联轴节;面向对象,c++,oop,C++,Oop,好吧,我不确定耦合是否真的描述了我的问题。问题是,我正在基于食人魔创建自己的3d游戏引擎。我也在使用一个物理库PhysX,但是因为我需要在我的主引擎代码和PhysX之间创建一个抽象层,所以万一我们可以使用另一个物理引擎,我决定创建一个包装器Quantum 所以食人魔有一个实体类来控制屏幕上的实体 PhysX还有一个PxActor类,其中包含有关PhysX作品中参与者位置的信息 quantum包装器将有一个QEntity类,它将充当引擎和PhysX之间的一个层 最后,引擎将有一个实体类,该类将至

好吧,我不确定耦合是否真的描述了我的问题。问题是,我正在基于食人魔创建自己的3d游戏引擎。我也在使用一个物理库PhysX,但是因为我需要在我的主引擎代码和PhysX之间创建一个抽象层,所以万一我们可以使用另一个物理引擎,我决定创建一个包装器Quantum

  • 所以食人魔有一个实体类来控制屏幕上的实体

  • PhysX还有一个PxActor类,其中包含有关PhysX作品中参与者位置的信息

  • quantum包装器将有一个QEntity类,它将充当引擎和PhysX之间的一个层

  • 最后,引擎将有一个实体类,该类将至少有两个成员:食人魔实体对象和量子实体。每次
    update()
    它都会询问QEntity发生了什么,并更新食人魔实体的位置


发现问题了吗?一个实体4类?请记住,我们需要访问所有四个实体至少60次/s!那么数据分区呢?不是很乐观。此外,可能还有更多的类,一个用于AI,一个用于脚本引擎…

使用多个类的对象在多个上下文中表示同一事物本身并不是一件坏事。事实上,如果您在所有这些上下文中都使用了相同的对象,那么情况可能会更糟——例如,通过创造性地使用多重继承

您的
QEntity
类已经为您实现了解耦-只要您按照其接口编程,并且不让特定于
PhysX
的类从
QEntity
*的接口“突出”,您就很好了

看起来您的项目在“桥”类中引入了耦合,这正是它所属的位置。只要您将其保持在那里,您的设计就不会有耦合问题

至于60 FPS,在设计阶段不要太担心。只要不存在依赖于虚拟函数的冗长责任链,您的编译器就应该能够很好地为您优化它


*例如,
QEntity
不应该接受特定于
PhysX
的参数或返回对象,除非是在创建“包装器”的构造函数中。我感觉到了你的痛苦。每次我尝试构建一个游戏并最小化耦合时,我都会得到一个巨大的函数链,这些函数只调用具有大量参数的其他函数。谢谢,所以最后还不错。只是一个问题:数据分区是否可以使用这种模式?我的意思是,食人魔实体和PxActor在内存中可能相距很远,因此L3缓存将毫无用处。@Vinz243这取决于实现。如果这两个API要求您通过指针访问Ogre entity和PxActor(而不是让您将它们用作值),那么数据可能最终会出现在内存的不同区域。如果它们允许您将它们的对象嵌入到您的对象中,那么这两个相关对象将在内存中彼此相邻。如果不是在实际系统上,至少在一个原型上的代码已经非常接近完成之前,对L3缓存效果进行推理通常还为时过早,而在分析和消除代码中的“低效”之前,肯定还为时过早。如果你不介意的话,最后一个问题是:由于存在多个实体,我应该使用名称空间还是将量子实体命名为QEntity?@Vinz243这完全取决于你:想想什么能让你更好地阅读,然后继续。就个人而言,我会在
QEntity
上使用名称空间和前缀,因为identifier
Entity
太通用了,几乎没有描述性值。我甚至会考虑<代码> QuantumEntity <代码>作为一种选择,使名称更具描述性。