2011-06-02 71 views
5

我工作的律”的游戏引擎,C++,并决定做这一切OOPily(大量使用类) 它的目的是(理论上)单个本地类实例交叉平台,所以我有一个'引擎'类,它的一个实例由'OS Module'创建,它是Windows的WinMain(我首先开发的平台)。C++ - 为整个程序持续时间

我有三个主要问题:

  1. 是它认为不良做法,以创建一个类,只是要在整个应用程序实例化一次?也许是因为使用类而不是一堆函数会导致某种性能下降或额外开销?

  2. 我一直计划让WinMain创建Engine的实例作为局部变量。 Engine类会相当大,包含渲染,脚本解析,文件系统等的类。基本上,除了操作系统特定的代码外,整个游戏引擎将以某种形式包含在Engine类中(可能作为一个实例)在WinMain函数中创建了一个非常大的Engine类的本地实例是一个坏主意?创建一个本地实例是一个坏主意,当程序启动时会创建类,并在程序结束时结束?也许会更好?

  3. 我的计划(i/wa)将引擎分成'模块',每个模块由一个类表示。引擎类将包含几乎所有其他模块的一个实例,如上所述,渲染,文件系统交互等。从某些角度来看,使用类作为大型模块的容器是一个坏主意(性能,设计,可读性? )

感谢所有帮助:)

+6

这不是有史以来最伟大的问题,但与莎士比亚的一些东西相比,为什么downvote? – 2011-06-02 21:56:39

回答

4

因为它们通常涉及与低级API(不是跨平台)的高效交互,所以游戏引擎不是跨平台性的主要候选对象。

类的大小取决于它包含的成员变量,而不是它实现的函数的数量。

堆栈空间通常很小(http://msdn.microsoft.com/en-us/library/ms686774%28v=vs.85%29.aspx),而堆理论上与可用RAM一样大。所以,如果你有一些非常大的东西,把它存储在堆上(用新的)。

“启动画面”:在程序开始时不要完成所有工作。用户在运行程序时讨厌它,屏幕上没有任何东西显示,因为你的程序正忙着初始化某些东西...... 查找懒惰实例化,基本上不做任何可以等待并且总是在屏幕上显示的东西。

至于具体的答案: 1.不,假定没有虚拟功能,应该没有性能开销。 2.请参阅上面的“启动画面”和“有限的堆栈空间”。 3.模块化通常很好,只要确保每个班级都代表一个“事物”。但是,不要让你开始忘记他们的名字和目的:)

+0

“类的大小取决于它包含的成员变量,而不是它实现的函数的数量。” - 哦,当然。我其实已经忘记了:P谢谢,这个答案很有帮助。 – 2011-06-02 22:21:19

1
  1. 没有,做什么让你的设计更清洁,更易于维护的建议。
  2. 没有,直接用的FreeStore应尽量避免(即不使用new,除非你绝对必须的)
  3. 见#1
+0

关于1),CEGUI大量使用单例,并且是一种流行的轻量级GUI。 – 2011-06-02 21:55:45

1
  1. 没有它不被视为不好的风格。其实我知道,去没有一个没有应用程序框架,和著名的Singleton模式基本上是围绕同一主题(但不同的,你要知道)

  2. 我无法想象,你的类是实际上那么大。如果是这样,把它放在堆上。然而,无论如何,这个类的实际内容会堆在堆上(我假设你会使用现有的容器类,那么有100个会使用100个动态分配;这适用于STL容器)

  3. 无论你把它们放在数据段中,作为栈中的汽车还是类的成员,它们会有什么不同?我认为这个课程充分体现了模块化,并且可以让你更轻松地完成任务(比如单元测试,或者将引擎重新用于纯网络版等)。)

2

是它认为实习差 创建一个类,只会 是整个 应用程序实例化一次这么多的班?也许是因为有 某种性能命中或增加 使用类 而不是一堆功能产生的开销?

根本不是。这基本上是因为你的Application类可以做类似继承和封装的事情。没有性能影响或额外开销。

我已经打算要的WinMain 创建引擎实例作为 局部变量。引擎类将 是相当大的,包含类 进行渲染,脚本解析,文件 系统的东西,等等。基本上, 整个游戏引擎,除了OS 特定的代码,将包含在 Engine类的一些形式 (可能作为另一个 类的一个实例。)创建一个本地实例 我的超大引擎类 WinMain函数是一个坏主意? 创建一个本地实例不好主意 当这个类将被创建时 程序启动,并且当 程序结束时结束?也许新的会更好吗? 更好?

不是 - 这是非常适合的方式。为什么打扰堆分配?你想要自动销毁语义。除非你的班级规模非常大,数百KB或更多,在这种情况下,基于RAII的堆分配更智能,因为堆栈内存非常有限。也就是说,sizeof()报告的物理每个实例静态大小,不包括动态分配。

我的计划(I/WA)■划分发动机 成“模块”,其每一个是由类表示 。发动机 类将包含 几乎所有其它模块,就像一个实例,如 上面提到的,渲染,文件 系统交互等的使用 类为巨大的模块 从某些角度来看 一个坏主意容器(性能,设计,可读性?)

这到底是换封装,将程序分成明确定义和分离模块,然后实例每一个你所需要的,是什么对象为导向的设计正是这个想法落后于面向对象的编程。一个类封装的概念的大小通常被认为是不相关的,只要它是一个单一的概念。明确的模块化设计非常棒。

我建议对所有依赖于平台的运行时继承使用运行时继承,并且最好在运行时动态加载它们(使用OS类执行动态加载)。这实施了一个可靠的编译时抽象并允许更高效的编译。