我正在考虑为我的课程最后一年项目制作一个简单的游戏引擎。我希望它是模块化和可扩展的,这样如果我有时间,我可以添加新的部件。例如,我会创建一个完全独立于其他系统的图形引擎,一旦完成,我可以添加一个物理引擎等。 我还想制作一个工具集来配合这个引擎。对于我想使用C#的工具,但我不确定库。我的问题是,如果我想要一个C#GUI程序,我可以引用一个用C ++编写的库吗?如果我在C#中创建了一些库但想在C ++游戏中使用它们,那么也会出现任何性能问题。
我想尽可能地避免使用C ++,我的经验表明,对于一个项目而言,使用C#或Java等开发时间要高得多。我的图形开发将在OpenGL中,这就是我的全部内容。已被教过。我们只用C ++完成了这个,但我已经看到像SharpGL这样的项目允许使用C#进行开发。这有什么性能问题吗?我不是在寻找一款速度极快的顶级图形游戏。显示我的引擎工作很可能很简单。我的引擎可能不会那么好,因为我只有一年而且我自己工作。
对此有任何建议将不胜感激。我仍然处于计划阶段,所以彻底改变我想做的事情并不会太多。我想先解决我可能遇到的任何重大问题。
由于
答案 0 :(得分:10)
如果你能在一套轻松的目标下完成这项任务,你就可以参加一个伟大的项目。首先,你需要掌握范围:
游戏引擎是一项重大的开发任务。带有工具链的游戏引擎是一项巨大的开发任务。在很多方面,选择一个更小但更具挑战性的任务是更可取的,因为它显示了解决问题的更高层次的思考,这是学术界非常喜欢的 - 如果你是CS而不是[工程领域]那么两倍。由于您使用的是托管语言,因此您可能需要考虑的事项是:
答案 1 :(得分:4)
你应该研究XNA。它的表现相当不错,而且据我所知,它很容易使用。
关于从C#引用C ++代码:这是完全可行的,尽管需要一些努力才能让你做到正确。 C ++ / CLI可以作为中间包装器使用,也可以使用P / Invoke。请记住,C ++是不受管理的,并且您需要进行一些手动垃圾收集,这在像.Net这样的托管环境中可能有点蹩脚。 C ++中的表现 - > C#bridge是好的,但如果你需要每秒对数学库进行100.000次调用,我不确定它会如何执行。我想一个小小的测试会很好..我会看看今天晚些时候是否有时间做这个,虽然我有点怀疑它:))
答案 2 :(得分:3)
创建图形引擎时(我只是真正谈论图形,因为这是我的专业领域),这些是您在项目中早期做出的一些选择:
1)是室内和/或室外发动机吗?
2)您将使用哪种可见性系统?
3)转发或延期渲染器?
4)你将如何拥有动画层次结构?
5)动态或静态照明?
6)你如何处理透明度?
7)您将如何处理2D叠加?
8)您将使用哪种网格格式?滚动自己?
请记住,你需要一个好的固体矢量/矩阵库,最好是一个完整的数学库,它可以帮助从euler到四元数到轴对齐的边界框。
做了很多研究。试着找出你将面临的潜在问题。请记住,更改纹理或着色器等内容会对流水线产生巨大影响。你需要尽可能地减少这些。
请记住,与启动引擎相比,在屏幕上获取旋转凹凸贴图网格很简单。不要让这让你失望。在几个月内编写一个相当简单的游戏渲染引擎应该没问题:)
此外......找到特定于该区域的社区。您将获得DirectXDev之外的许多优秀(尽管不以OpenGL为中心)的信息。 GDAlgorithms提供了一些相关的通用游戏开发算法信息。还有一个特定于OpenGL的邮件列表here。
值得注意的是DirectXDev和GDAlgorithms,至少(我在GL邮件列表上不太了解)是由一些非常有经验的3D引擎和游戏开发者填充的。不要发布很多“初学者”的问题,因为这确实会引起成员之间的蔑视。虽然奇怪的查询或2在任何级别(从初级到高级)都会得到惊人的答案。
祝你好运!我希望我有机会在大学这样做。我可能没有离开并加入游戏行业并享受额外一年的睡眠时间;)hehehe答案 3 :(得分:3)
为什么需要任何 C ++代码?
已经有几个将OpenGL或DirectX暴露给.NET的包装库,例如SlimDX(顾名思义,它比XNA更薄,更轻量级的包装)
如果你对C#感觉更舒服,那就没有理由不能写出你的整个游戏了。
性能通常不会成为问题。在大多数情况下,C#代码的性能与C ++相当。有时它更快,有时它更慢。但是很少有C#不够快的情况。 (但是,本机代码和.NET代码之间的接口会有很大的性能成本 - 所以这样做太经常会损害性能 - 因此,如果你使用本机代码,那么诀窍是拥有足够大的本机操作,所以往返于.NET的跳转
。除此之外,请提出建议:Don't bother writing an "engine"。 你会浪费你的时间来制作一大块单片代码,这些代码最终无法正常工作,因为它从来没有根据实际游戏的要求进行测试,只是你想到的你未来的游戏需要。
如果您想尝试游戏开发,请制作游戏。然后,通过各种方式,重构它并清理它并尝试提取代码的可重用部分。但如果代码尚未在游戏中使用,您将来也无法使用它来构建游戏。
商业游戏中使用的引擎就是这样,从以前的游戏中提取的代码,已经过测试的代码,以及工作的。 相比之下,业余爱好者引擎几乎总是花费2年多的开发人员时间,而没有提供任何可用的东西。
“游戏引擎”的整个概念存在缺陷。在软件开发的每个其他领域,您都不知道一个模糊定义的组件基本上做“我需要制作产品所需的一切”的想法。你特别怀疑它是一个独立的实体,它可以与它应该支持的实际产品分开。
只有在游戏开发中,大体上仍然存在于80年代的方法论中,这是一种常见的方法。即使它实际上没有用。
如果这是一个学校项目,我敢肯定无论谁应该评分,如果你将常见的良好软件实践应用到现场,它将会很感激。仅仅因为许多游戏开发的新手不这样做(并且更喜欢坚持某种关于“引擎”的神话),所以没有理由不应该做得更好。
答案 4 :(得分:1)
确保您的范围可行。
十几岁的时候,我经历了构建我自己的引擎阶段,几年后,我意识到如果我刚刚使用了pygame和pyopengl而没有浪费精力,我会做得更多。
查看gamedev.net上的论坛。
答案 5 :(得分:0)
听起来我对你的项目有一个非常好的计划。 (我在你对@Meeh的评论中得到了关于XNA的观点)
你可以通过P / Invoke直接与C ++进行互操作,或者我也可以想出一些SOA的方法来做到这一点,但老实说,因为这听起来很奇怪我倾向于将COM作为你的API选择杠杆......为什么?因为那时你打开你的API到很多常见的客户语言,不仅仅是C#和VB.NET,你也会得到Delphi,VBA,Powerbuilder等。
性能应该不是问题,因为API入口点只是工作和传输数据结构的一部分,真正的工作是在本机代码库中完成的,所以不要过多担心性能。 ATL将成为您的朋友,创建COM类,为您的图书馆提供入口。
答案 6 :(得分:0)
虽然它确实可以在C ++和C#之间架起桥梁(如果界面很复杂,通过托管C ++是一个很好的方法,P / Invoke非常简单),对于工具< - >引擎通信I可能建议改为基于网络的界面。这是高级别界面的理想选择,例如您可能需要级别编辑器/模型查看器等。实际的对象建模器不是一个好的目标。你设想了什么工具?
如果以这种方式执行此操作,您将能够连接到引擎的远程实例,或多个实例,甚至是在不同硬件平台上运行的实例。如果您还不了解插座,它还会教您一些插座。