0

现在我有一个带有几个类的 DirectX 引擎 - 应用程序、图形、声音,它们每个都有大约 1k 行,它们每个都互相引用。我最初试图限制类和东西的使用,比如传递 D3D 设备,而是做了它对所有类都全局使用,但我在其他所有人的引擎中看到所有内容都分为许多类,并且它们有类似 Engine->GetRenderer->Render(MyD3DContext); 之类的东西。这不是非常低效吗?为什么不直接将 MyD3DContext 设为全局并直接在 Render 函数中使用它。我不明白的最后一件事是 = 你应该如何让类彼此独立工作?听起来很奇怪。

4

4 回答 4

2

首先,您为什么认为这非常低效?除了更容易编码和维护之外,这也非常快。OOP 不是瓶颈,它对于具有多个开发人员和多个关注点的大型项目(例如现实世界的游戏)来说是一个福音。

让我举个例子,因为你提到了“游戏”:

游戏是一个模拟 模拟包含实体(Objects) 物体可以做事,并具有属性。因此,对象就像是属性和动作的封装。这就是“面向对象编程”中的“对象”的原因。您可以认为它们是(对象)在您的模拟器中的虚构工厂中创建的。对象的蓝图是“类”,称为encapsulation.

这些对象中的每一个都绑定到您的世界,可能通过某种高度数学化的半条命 2(源)级物理引擎。您不想为每个班级编写“物理”代码。相反,您将从类(或接口)“IPhysics”继承。然后,每当您将重力从 10.0 更改为 15.0 时,该值就会在整个“世界”场景中传播。这是inheritance.

你游戏中的每个对象,比如《半条命 2》,Gordon Freeman 可以同时充当“玩家”和“可以编写脚本”,如果你明白我的意思的话。这就是多态性。一个对象以不同的类型起作用。

所以你看,在 OOP 中建模和呈现虚构游戏非常容易(而且非常高效)。

于 2012-11-01T21:19:33.867 回答
1

这并不是非常低效。而且您肯定需要对 OOP 进行某种介绍。甚至可能是网上的东西

于 2012-11-01T21:09:58.983 回答
0

是的。

随着项目变得越来越大,拥有一个全局的任何东西都会导致大量的问题。遍历几个指针也不是特别低效。担心正确领域的效率,您通过运行测试证明的领域效率低下,并始终尝试保持代码清晰和分离。

如果您担心效率低下,为什么不拼凑一个具有完全这种结构和时间的测试应用程序,完成所有这些取消引用需要多长时间。你会发现,例如,建立可见的多边形列表是微不足道的。

您将看到拥有良好封装的非全局对象的好处的唯一方法将是随着您的项目的增长和您改变周围的事物。

于 2012-11-01T21:13:27.137 回答
0

OO 设计有几个大租户:特别是代码重用/模块化和范围/隔离。如今,全局变量通常不受欢迎,因为它们不能很好地扩展到大型开发工作并且总是最终导致问题,因此 OO 试图将任何给定调用的范围限制在执行该功能所需的最低限度。

至于模块化/重用,子模块越大,通常它变得越具体,因此,如果它被分解成更多的模块化块,它就不太可能适合所有目的。因此,您花费更少的时间重写相同的代码以进行稍微调整的目的,这也减少了您在为新的代码实现代码时可能破坏的相邻目的。尽管在运行时可能会或可能不会有一些轻微的成本,但这使得它的实施更有效率。可能不会。请记住,运行 Render() 并不需要更多二进制文件,无论它是在根模块中定义的,还是在组合对象的深处组合多个层。它仍然只是一个函数指针。

这些只是一般概念,所以请随心所欲。

希望有帮助。

于 2012-11-01T21:16:28.907 回答