游戏引擎的分层设计

1649 篇文章 11 订阅
1623 篇文章 22 订阅

在计算机领域,我们使用得最广的方法,就是抽象、封装。每个系统,都是像洋葱一样,一层接一层,从内到外;每一个组件,都是建立在比其更为底层的基础之上。
依据这个方法来设计游戏引擎,是非常合适的;尤其是一些关键性的组件,我们可以直接替换掉它们,使引擎能够适应新的硬件,新的平台——这些当然很容易理解,但是在实践之中,要始终做到这一点,就非常困难。

最常见的错误就是,各个模块划分不清,也就是说,哪些部分该完成哪些工作并不十分明确。这看似小问题,但其实是软件开发中最头痛的一个问题。可以看一看设计模式,有很多的模式就是专门为了解决这个问题而存在。我们需要进一步提炼程序中的“原子”操作,再将这些“原子”操作放到合适的地方。

避免类爆炸问题。简单的按照功能划分出类,很容易出现类爆炸问题,再加上我们习惯了最简单的扩展、修改类行为的方法——继承,使得引擎中的组件数目不断增多。这样就增加了系统的复杂度。如果我们需要替换一个子系统,我们就不得不替换子系统中大量的类,或者是一整颗庞大的继承树。解决这个问题的方法,就是从大处开始设计,或者,不断的重构,合并公共的操作,提炼继承子类、改为组合的方式。。。。。。从大处开始设计,就是先让一个类做很多工作,然后再根据需要,修改其粒度,把应该独立的部分抽象出来;而不是一开始就考虑好所有的可能性,讲系统分解成太细的碎块。后面一种方式,通过重构的方式,也许实践起来更方便一些,可以随时测试一段代码的正确性(测试后行),可以先写测试用例,然后再完成这些功能(测试先行)。反正不管是怎么实现,都是需要不断的重构。好的设计来自不断的重构,而不是来自设计本身。

如果引擎的某些部分需要跨平台,最可能的就是在MMO游戏中,网络部分、内存管理部分、甚至是物理部分等等。最好使用接口的方式进行编写,接口的设计一定要科学,比如,有时候 void OpenFile( const my_string &fn );就没有void OpenFile( const char *fn );要好因为前者使用了my_string类,而这个类,也会是你跨平台工作的一个部分;不过也要分清楚使用情况,有时候我们需要用int,unsigned,而另外一些时候,用i32, u32之类的定义会更好。

下面是一个例子,c4引擎的模块图。可以清晰的看到它分层的设计原则,并且每个类之间的依赖关系、交互方式都定义得非常清晰:

art pipeline

这已经是一个非常好的设计了,值得我们认真参考一下。

最后总结一下分层设计的好处:易于扩展、替换组件,而不需要修改整个系统;容易跨平台,实现重用(实际上就是上一点);接口和实现分开,优化工作不需要修改其他部分的代码(特别是多线程优化)等等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值