|
我知道这个问题很弱智,也很没意义。
我说说我的感觉吧,也许很肤浅,我自己也只用过一款引擎做过游戏,也还没有熟悉很多引擎。但我觉得大体上也许差别不大。
最近我自己也在写,进了一家新公司,连个框架还没有。于是自己写了2个星期,把程序主框架写好了,整个引擎,采用plugin的思想,各个模块都是独立的,可以单独拿出来编译连接,也可以从别的地方copy来一些代码,只要把接口抽象出来,做成引擎认识的dll,就可以被引擎调用了,各个模块之间自然没有一点的耦合性。整个引擎由一个内核主框架+其他非常多的服务类组成。
服务类,有,IO,OS,physics,AI,Graphics,GUI,Script.NetWork..组成。由于IO,OS,Script规模比较小,所以就是一般的类,只用做一层的接口封装,就可以直接被引擎调用了,但其他几个模块自身就非常的复杂,都可以单独作为一个引擎来看代,所以他们几个都有自身的内核系统,和服务类,所以多了一层。
在引擎里,我是不允许有耦合性的,即使是服务类,他们和内核的关系,也只是单项的非常弱的耦合而已,就是说引擎认识这些服务类,但这些服务类不认识引擎。如果一个模块用到其他模块的功能,那就不能算是引擎的东西了,就是具体逻辑了。我这么处理的目的,就是希望引擎和逻辑分离,功能和功能分离,主框架,和子系统的内核才是最重要的,这样的好处太多了,我就不说了。
如果某个服务类需要另一个服务类的功能做支持的话,我不会通过引擎来调用另一个服务类去帮助,而是另外实现一套。比如,我做了脚本系统,但别人写3D图形引擎的时候,也需要脚本的功能,这个我就不会给他提供引擎脚本的功能,需要他另外自己做个图形的脚本系统,虽然这样会增叫一点工作量,但是如果我让引擎的脚本做的话,以后这个图形引擎就会依赖这个引擎了,不能独立出来了。
我甚至连头文件依赖都去掉了,各个模块都可以有自己的头文件,主要是数据定义,变量定义的头文件,这样以后就不会出现增加一个变量类型,或者只是修改一下宏定义,而编译一大片的事情了,最多只是重编这一个模块。而且也增加了局部模块的可移植性
程序从流程上看,是一个主线程,它专门处理主框架里的事情比如FrameMove,FrameRender,外加一些辅助线程。因为我觉得主框架用多线程很难保证逻辑和渲染的一致性,所以只是把服务提出来,可以用其他线程实现,比如加载资源,设置定时触发器,AI(只所以把AI作成服务,是因为我觉得决定性的AI肯定是服务器做了,不是很重要的AI,比如角色宠物的AI,可以单独用线程来做,如果你的机器是多核,或比较强的,那么这个宠物AI可能就高点,就像显卡一样,如果显卡强渲染效果好点一样,这些都是锦上添花的事情,不是决定性的事情)
再先解释一下什么是服务。我设计了两类单件,一类是服务类,一类是游戏的逻辑实体类。
可惜我不会用插图来表示,说的不好理解请凑活吧。
服务类是引擎的组成部分,而逻辑实体类是游戏的组成部分,比如场景就是一个逻辑实体类,角色系统就是一个逻辑实体,主界面也是,他们都是游戏的一部分而不是引擎的,因为他们都是由客户端程序自己的代码和其他很多服务共同组成的。两者都是做成dll,导入并动态创建。引擎主框架的执行也是分层的,不管是服务,还是逻辑实体都可以动态的添加和删除。
这样的话,大家就都可以独立的开发,逻辑程序也就看不到引擎的代码了,引擎程序也不需要逻辑的代码,只需要有相应的dll就可以跑起来。
。。。。。。
现在还有很多难题,要说服其他程序完全按我的意图来,可是会增加一些工作量,也会推翻以前的一些东西,而且我还是新来的只有半个月多点。更郁闷的是这个月底就要做一个东西出来给别人看了。真是人在江湖身不由己。。。。 |
|