开发框架Theway架构篇(转载)
开发框架Theway架构篇(转载)
说在前⾯的话:市场,⼤部分都是品质低劣,⽣命周期短暂,绝⼤部分原因是因为开发成本低,对开发⼈员的要求也低。⼤部分团队只需要快速出成品,只要有东西快速赚钱就可以了。16年的私⼈房模式,再次引爆了市场。我也该兑现我的承诺,跟⼤家分享下怎么架构和实现这套框架来满⾜需求的。
经过⼏个⽉的努⼒,终于说服⽼板,以及各种上级,实施这套解决⽅案。现在框架OK了,也利⽤这套框架架构开发了多款游戏,虽然过程很艰⾟,但是还是很值得。秉承保密原则,本⼈并不会将框架代码放出,只做技术交流。
根据之前在⽇⽴及IBM的项⽬经验,⼤部分成熟产品都会有⼀套完整的解决⽅案。不断的积累,终⼤道⾄简。这也是这个框架命名Theway 的来源,希望coding的路上越⾛越轻松!
⼀、原型
符合项⽬框架,快速换⽪,快速融合。多渠道多包体。⾃由拆装。
⼀次开发核⼼玩法,快速⾃由迭代各种市场版本。
⼆、架构设定
* 解耦,复⽤性,拓展性
* 多⾃由度、可分拆多项⽬开发,符合敏捷需求
* 品质保证体系
* ⾼效开发
* ⽀撑公司⼤部分业务
三、模块设计概要
减少客户端对Cocos2d-x引擎的依赖程度和降低耦合度,将引擎必要的初始化、逻辑更新、渲染、资源管理等交给底层处理,是客户端逻辑开发不需要过于依赖引擎层,同时,为了避免客户端代码中频繁、直接的调⽤平台相关诸多功能,我们将平台相关的功能封装在引擎封装模块内。这部分我们可以叫做BaseCore部分。
电信免费提速
1、引擎封装模块 (EngineSystem)
* Cocos2d-xAPI的封装整合,绑定到Lua。关掉3D模块,另外不再使⽤扩展库。
* 达到可以随意切换Cocos版本,现阶段选择⽐较稳定的版本
* ⾃定义控件等绑定到Lua
* 跨平台特性处理
* ⽀付相关模块特殊处理
* 脚本加密解密处理
* 必要的时候,可以将脚本层换成js绑定,然后将逻辑代码修改成Lua的,就可以⽀持H5了
2、 UI系统(GUISystem)
* UI的⼀些基类,例如弹出框可以将如下属性封装成⼀个Dialog对象,派新类⾃然拥有这些属性了。可设置⼤⼩并且带有关闭按钮的⼀个基本视图,另外⼦类不再需要去设置dismiss了。
* 还有类似于Toast的创建,以及⼀些基本控件完全可以架构⼀个⼯⼚对象,从⽽省略很多的基本控件的构造代码。当然也可以在Lua中通过配置⽂件来配置基本UI。
* 健全的纹理管理规则及清理规则,纹理缓存在场景切换后不会移除。可以考虑逐帧加载,将纹理分级,公共资源可以不remove,先删除可能不再使⽤的帧动画资源等。
* 特别设计有限状态机管理纹理内存,动态控制空间。以及利⽤状态机的事件特性来控制动态跳转。
3、 ⽹络模块(NetSystem)
* Socket采⽤TCP/IP协议,封装伯克利套接字接⼝,设计接受和发送队列,通过互斥信号锁来处理队列共享问题。因为join函数调⽤的地⽅会阻塞主线程,我们可以考虑⽤detach⽅式,完全是交给系统处理,另外可以考虑第三个线程来开辟世界聊天或活动的这种⽐较频繁的协议(视情况),并且将协议解析及Lua的table序列化放在C++层。暴露基本接⼝给Lua脚本层,在脚本层处理⽹络⼼跳、断⽹重连相关的逻辑。顺便我们要⽀持IPv6的处理,这⾥只需要将地址解析、Socket初始化函数做兼容。接受⼦线程跟UI线程同步使⽤Cocos2d-x提供的事件来处理,然后C++将这个数据POP到Lua层,Lua这边根据协议头回调函数,或者是通过事件的⽅式派发到具体的业务。
* 对于⼀些通⽤的协议,Lua层设计成抢占⽅式,或者是添加⼀个tag来标记⽬前这条协议是处于模块。
* 设计模式上考虑使⽤⽣产-消费模式,尽量让协议的读写跟业务内容解耦。协议层的封拆包全部⽤python脚本⽣成的lua⽂件⾃动化处理,发送跟接受都是接受⼀个table,省去客户端的部分⼯作。
* Http,我们可以封装,上传下载,以及我们⽇志上传相关的模块等。如果使⽤3.11以下版本,需要替换libcurl,针对苹果IPv6问题。
* 结合⽇志模块,将协议交互写在⼀个⽂件⽅便查看
架构图如下:
远景车友会
4、数据管理模块(DBSystem)
类似于ORM的设计架构,调⽤者不需要关注实现细节,来处理⼀些数据
⾳效相关,如⾳量关闭,⾳量⼤⼩等类似数据的处理
⼀些可以缓存在本地的数据,如⼀些公告之类的⽂本信息
5、更新模块(UpdateSystem)
* 资源热更新,⽤于部分Bug修改等。
* 模块下载,⼤厅可以选择部分模块进⾏热更,下载完后,即可重新启动虚拟机,或reset Package。达到真正热更意义。
资源热更新:
系统临时文件夹在哪里通常我们会在游戏中会出现⼀些⼩Bug或者需要更换部分图⽚素材,或者部分配置⽂件。来适应运营策略的部分⼩版本更新。
模块化更新:
⼤厅合集中,下载相应的模块,然后再点击就可以玩相应的模块了。技术设计上,可以将资源热更下来,即刻reset Lua的Package。或者将下载的模块添加到搜索路径。
版本管理:
1、trunk维护⼀个BaseCore版本,有改动,其它所有包体都要考虑更新版本。作为⼀个⼤版本处理。后期项⽬多了,有改动可必须拉分⽀进⾏修改,然后同步到trunk。
2、业务模块在BaseCore没有改动的情况下,完全可以不⽤更新程序包,直接热更新即可。作为⼀个⼩版本。⼩版本可以在⼀个新迭代后拉⼀个脚本Tag版本。
3、SVN管理。需要严格控制版本的关系。并且做好记录。
6、⾳频模块(SoundSystem)
北京新增1中风险地区* 统⼀⾳频解决⽅案,整个游戏中只有⼀套API
* 可以区分平台⾃动匹配资源名称,如android⾃动将后缀改成.ogg。iOS改成mp3等
* 提供⾳频⽂件预加载
架构图:
7、⽇志系统( LoggerSystem)
* 分级别的⽇志处理,类似log4j分Tag处理,更好的区分⽇志⽂件。
* 分⽂件处理,如果⽹络协议⽇志,⾏为⽇志等。
* 配合⾃动化测试,添加相应的⾏为⽇志为Bug修改提供帮助。
* 客户端可以设计将⽇志⽂件上传到⽇志后台。根据⽤户ID命名。
架构图:
8、事件系统( EventSystem)
考虑到框架总体的拓展性,我们完全使⽤事件驱动模型(Event-driven)来设计和开发,将客户端中事件的触发时机和具体处理逻辑彻底分隔开。游戏的各个模块,仅需要注册、监听和实现其关⼼的消息事件,⽽⽆须关⼼事件何时被触发,降低了总体耦合度。游戏中所有UI⾯板的隐藏/显⽰、事件响应、⾳效的播放/停⽌、游戏流程的切换、游戏⾓⾊状态迁移等,完全通过事件驱动⽅式开发;同时这种基于事件的处理⽅式,为项⽬使⽤动态脚本拓展提供了⽀持:脚本层省去对逻辑代码的⼤量直接调⽤,通过消息事件完成脚本层和逻辑层的交互调度,⼤⼤简化了开发的复杂度。
* 解决多线程消息通知,类似于notification⽅式。
* 处理模块间耦合,配合状态机,来处理UI或者说是模块的⾏为。
* 处理全局系统数据等。如玩家数据
9、配置系统( VariableSystem)
* 开发及运营包体配置
* 游戏中⼀些配置,⽀持差异化包设置
* 这些配置包括部分的动态配置,如⼤厅的布局位置等
10、⾃动化测试系统( AutoTesterSystem)
* 提供简单的测试脚本⽀持。如重复进⾏某⼀个操作,所以每⼀个核⼼业务都需要预留测试接⼝,然后结合我们的⾏为⽇志,充分利⽤休息的时间,让其⾃动测试。
* Oriented⽇志。主要⽤来追踪⽤户操作⾏为,⽅便测试路径重现,只⽤在测试阶段。
* 脚本Crash后台,脚本测试⽐较难以Debug,将xpcall捕捉到的⽇志提交后台,⽬前情况是有⼀个简单的JavaWeb⽇志追踪页⾯。所以只是作为内测⽤。
* ⾃动化测试的时候,可以借助xcode等⼯具来查看内存情况。
四、性能优化
1、纹理资源的优化、场景资源的优化
开发过程中,从严控制纹理,按照相应的Block合并⼤图,适当情况下,可以降低清晰度。另外场景管理包含资源的管理,例如某个动画在特定的场景中出现,我们可以直接将着部分资源在缓存中移除。
公共资源可以常驻在缓存中
如果对包体要求更严格,可以适当考虑将图⽚压缩成pvr格式(⼀种显卡可以直接识别的格式,⽬前市⾯上的⼑塔传奇采⽤的这种⽅案),但是这种情况是没有alpha通道的,也就是说透明度设置有问题,只能是作为⼀种备⽤⽅案。
2、将⼀些耗时的操作放在C++层,如读取配置⽂件,异步加载⾳频⽂件等等。
3、⽹络层采⽤多线程⽅式,以降低对主线程的影响。
二婚结婚证
五、质量及规格标准化
1、客户端架构标准
⽅案切实可⾏,并且性能是第⼀位的,或者说是开发效率上⼀个台阶。
2、代码开发标准
分两部分,第⼀部分是底层代码,健壮、⾼效,并且是讨论过、并切实可⾏。第⼆部分脚本代码需要从代码风格上进⾏管理上的强制要求。
3、代码Review标准
按照约定好的代码开发标准,切实实⾏,原则上实⾏捉对协作开发。
六、课题⽅案管理
适⽤范围:
1、架构及性能上的优化。
2、偏平台化的技术研究。
3、对性能提⾼、开发效率提⾼有明显帮助的技术点。
4、可开发⼯具及流程控制,甚⾄重构达到效率提升的。
七、安全相关
1、代码安全
客户端代码除了底层代码⽤C++以外,其它基本使⽤Lua脚本来开,所以脚本需要加密。以防⽌⼆次打包及⾮法⾏为。⽬前可以使⽤
Cocos2d-x提供的xxtea加密策略。
2、⽀付安全
⽀付基本的参数不可暴露。
⼋、⼤厅架构
是⼀个最⼩资源包,只有⼀个登录到⼤厅的UI展⽰。可以不包括逻辑业务部分,然后再去热更新部想要玩的部分,⼀些公⽤部分完全可以设计放在这个版本内部。⼤体包括如下内容:
1、BaseCore部分
2、账号体系
3、热更功能
4、⼤厅UI
5、可以⾃由配置相关的模块来达到想要的包体
6、⽀付模块的基础部分
最理想化是可以如下操作,出某版本,后期想给这个版本加某个游戏,可以通过热更新的⽅式去更新。
模块化游戏⼤厅⽅案:
通过事件⽅式来注册游戏,通过配置来定好游戏中包含哪些模块,进⾏事件注册,然后再⼤厅打开模块后发送相应的事件去打开模块。
九、技术实现
9.1 技术选型及⼯程结构
综合选择Cocos2d-x3.11.1版本,更新了ipv6及openssl等相关内容。BaseCore版本我们⽤C++完成基本功能(暂时命名为theway),然后具体业务项⽬将theway引⽤作为依赖,并且业务开发使⽤Lua脚本开发。这样将底层跟业务解耦。另外为整合多个游戏带来最基本的技术上的⽀持。九九重阳节的诗句
9.2 ⾃研引擎可⾏性
可以做成依赖项⽬,作为其他项⽬的底层,随着项⽬不断优化和集成可以衍⽣成⼀个拥有我们⾃⼰知识产权的引擎项⽬。这样底层修改或升级,只需要做兼容即可,⼤不必让业务开发受限。同时可以整合各项⽬的开发资源,提⾼开发效率,产品质量。
9.3 ⼯具链开发
作为商业开发,开发⼯具的完善也是⼀项必不可少的环节,⽬的是为了提⾼产品开发的效率。例如我们利⽤⼯具提⾼开发效率的⼀个实际例⼦。⽤Python⽣成协议Bean来直接序列化消息内容,通过委托模式,业务模块只需要关注发送,返回协议回调函数收到⼀个Table,⼗分的⽅便好⽤。后⾯可以将⼀些重复⼯作⽤⼯具去做。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。