Rya*_*hel 6 c# design-patterns
这是一个简单的问题,但它是我永远不会确定的问题.这主要是在游戏开发的背景下.假设你有一个实体,比如船只或角色.应该(我知道这是一个意见问题)这个对象包含一个Draw方法吗?(也许实现一个IDrawable接口)
在查看某些游戏项目中的源代码时,我发现这在很多方面都有所体现.有时,有一个单独的类可以接受一个实体基础对象并根据其属性(纹理,位置等)绘制它.其他时候,实体被赋予自己的绘制方法,并且它们能够自我渲染.
我希望这个问题不是太主观.有时我听到人们说绘画这样的东西应该与物体完全分开,他们不应该知道如何画画或者有能力.有些更实用,并且觉得这种设计对象具有这种能力是很好的.
我自己也不太确定.我没有发现任何类似的问题,因为它可能有点主观,或者任何一种方法都没问题,但我想听听SO有什么说法,因为这些设计决定每天困扰着我的发展.这些小的决定,例如对象A是否应该具有执行功能B的能力,或者是否违反某些设计原则.
我确信有些人会说,如果有必要的话,我可以稍后去做我的直觉和重构,但这就是我一直在做的事情,现在我想听听决定某些对象何时应该保持某些能力的实际理论.
我想我正在寻找的是一些启发式方法,用于确定给定对象应具有多少权限.
您应该采用任何使您的实现最简单的方法。即使事实证明您做出了错误的选择,您也可以亲身体验为什么一种方法比另一种方法更好,并且可以在未来应用这些知识。这是宝贵的知识,可以帮助您以后做出决定。我发现我了解某件事的优点的最好方法之一就是把它做错几次(不要故意提醒你),这样你就可以很好地理解一种方法的缺陷。
我处理它的方式是这样的:一个实体拥有绘制它所需的所有信息。例如,组成它的精灵,它们位于相对于实体中心的位置。实体本身做的很少,如果有的话。它实际上只是一个存储其他系统运行的信息的地方。
世界渲染代码处理绘制世界以及其中的所有实体。它查看给定的实体并在正确的位置绘制它的每个精灵,应用任何必要的相机转换或效果或你有什么。
这就是我的大部分游戏的运作方式。该实体对物理学一无所知,或任何事情。它只是一个数据的集合,其他系统在这些数据上运行。它不了解物理,但它确实有一些 Box2D 结构挂在它上面,Box2D 在物理更新阶段对其进行操作。与 AI 或输入以及其他所有内容相同。
每种方法都有其优点和缺点。
让物体自己画的优点:
双方都比较舒服。编写引擎的人只需要调用一个函数,而使用它、编写这些 IDrawable 类的人对他们需要的一切都有低级别的访问权限。如果您想创建一个系统,其中每个对象都必须定义它的外观,它将使用哪些着色器和纹理,以及如何应用任何特殊效果。您要么拥有一个非常复杂的系统,要么拥有一个非常有限的系统。
让渲染器管理和绘制对象的优势
所有现代 3D 游戏引擎都是这样做的,这是有充分理由的。如果渲染器可以完全控制绑定哪些纹理、使用哪些模型以及哪些着色器处于活动状态,则它可以进行优化。假设您使用相同的着色器渲染了许多项目。渲染器可以设置一次着色器,并在一批中渲染它们!如果每个对象都绘制自己,则无法执行此操作。
结论
对于小型项目,可以让每个对象自己绘制。事实上,它更舒服。如果你真的想要性能并且想要从你的显卡中挤出所有的东西,你需要一个可以严格控制渲染内容和方式的渲染器,以便它可以优化。