第3篇:框架设计要提供机制

什么叫提供机制

《Unix编程艺术》里有一句框架设计的名言“提供机制,而不提供策略”。

要弄清楚这句话,首先要了解什么是机制,什么是策略?接下来我拿游戏开发来说明。
游戏客户端引擎unity、cocos、Laya、ue4等提供了机制。如:组织游戏逻辑,提供场景 +节点 +组件模式。基于这样的机制来开发业务逻辑。至于怎么开发,如何组织项目,这属于开发人员的事情。
事件订阅与发布。提供事件订阅机制,要接入哪个事件,你就监听。
渲染效果定制。提供Shader开发机制,材质作为配置文件与数据传送,Shader作为算法,开发人员只要自己开发Shader,结合材质的机制,就能实现游戏渲染效果定制。

资源管理。提供普通的资源管理加载与卸载的机制,不做过多的功能。AssetsBundle 提供资源更新的机制,不做过多的功能。这就回答了很多程序员心中的疑问:为什么不做一个MMORPG里面的四叉树的场景管理,为什么不做一个服务器通讯的完成模块啊,为什么不完整的做好热更新?因为这些大多属于策略类的东西,和具体项目有关系。所以一般框架设计,与具体的项目需求有关的,都不提供实现,或推到上一层。

所以我们基于游戏引擎做的框架,大部分是基于策略做的一些完成公司特定项目的功能和框架,和游戏引擎的设计不属于同一维度,比如UI框架,背包系统等,均属于策略类的范围。

如何判断是框架还是策略?
明白了什么是机制,设计者如何判断属于机制还是策略,这个就变得很重要。
一般怎么判断呢?大部分的设计师会有”感觉”。
这个感觉,来自于平常的学习与积累,阅读别人的框架,组织管理项目开发经验。
那么平常如何练习这样一种”感觉”呢?当你设计决策有困惑的时候,你可以按照下面的方法试试。

01 我做这个框架的愿景是什么?

马云说做企业要有愿景,如果你没有愿景就会迷茫,写程序做框架设计亦是如此。SpringClound 就是提供微服务的框架;Skynet就是提供Actor模式的服务调度框架,;Netty基于NIO的高性能的网络框架;protobuf 跨平台跨语言的序列化与反序列化工具库。

在github上,你去看,好的框架在设计的时候就有它的愿景。

xLua的愿景:
XLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc。

做游戏引擎是为开发各种类型的游戏提供基础服务。做一个Moba类的游戏框架,基于游戏引擎,结合项目需求,制定一个快速开发Moba类游戏的框架与技术工具。明确了这个立场以后,凡是符合这个立场的,你就可以加入,不符合的你就不做。做设计的时候,想好愿景,很多问题就豁然开朗了。

02 做框架设计,要经常思考如何做减法
明白了框架愿景以后,判断要怎么设计,要不要做?
我们可以尝试做减法,而不是一味的做加法!
这个功能我推给使用我的上层做可不可以?上层做这个功能用我提供的机制,是否能简单做到?如果能,那就到此为止,让上层处理。
话说多了容易错,框架功能做多了容易被人说不灵活。所以做减法是必要的。
Lua编程语言就很懂得做减法:它不提供任何其他的API,它完成的功能就是嵌入式的轻量级脚本,所以游戏框架经常用Lua做脚本。

03
做产品的三层结构
经过一些总结分析,我们发现做一个游戏出来大致分为三层。从下往上:
客户端:
第1层基础框架层:提供基础功能服务,比如客户端游戏引擎,protobuf、Socket等基础库。

第2层产品框架层:提供完成游戏研发、发布、调试等基础服务性框架,比如MMORPG游戏框架、地图编辑与寻路导航、AOI、 粒子特效、UI框架、版本管理与资源热更新等。

第3层业务逻辑代码:完成特定项目业务逻辑的实现。

在开发代码的时候,要清楚地知道自己是哪一层。

服务端

第1层基础框架:提供基础功能服务并组合起来,网络,协议,数据库,业务逻辑开发机制。

第2层产品框架:棋牌,MMO, Moba, 基于基础框架,搭建分布式服务器集群,维护工具,更新停服检修等。

第3层服务器业务逻辑的实现。

现在行业都很发达,第1层基本上都有成熟开源的框架为我们做好了。第2层是目前我们架构师主流的架构任务。第3层可以放一些基础的程序岗位来实现。

清楚了这些结构以后,你会发现提升自己的路径也就出来了。

做业务逻辑的同时,搜集开发特定产品的需求,思考如何做特定产品框架能满足这些需求,特定产品框架的基础支持,可以熟悉常用开源的第三方方案。

熟悉常用的第三方特定功能的库,就能把产品变成需求,把需求变成架构,使用基础服务来支撑架构。

评论

 

关注公众号

可用手机学习

获取最新课程