《天天炫斗》客户端框架设计

一个糟糕的框架设计需要哪些条件呢?

  • 代码缺乏整体设计:看了两小时居然找不到模块是怎么被初始化和调度的
  • 模糊不清的边界:一个功能完全不知道写在哪里好
  • 模块直接完全耦合在一起:随便修改一个小功能都可能导致其他系统出现严重的bug

一个模块的好坏判断的两个直观的感受

  • 新人进入的时候的学习成本
  • 多年开发之后框架的核心思想是否还是被保留下来了

如何做好框架设计呢?

分层设计

分层设计有利于划分模块边界,同时也更容易让参与其中的人对游戏程序有一个整体性的认识。

例如手游会划分为多个模块,如网络模块、渲染模块等,这些和底层相关的,和手机系统系统的模块。还会分成一些业务逻辑模块,如装备系统、任务系统、道具系统等具体与业务相关的。如果把这些系统和模块直接耦合在一起,直接产生调用关系或直接关联的话,就会发生设计层次不清。 所以首先必须将整个游戏进行层次的划分。

《天天炫斗》中会分为三层,第一层是平台层,平台层包括渲染系统、网络系统、游戏方面比较特色的MSDK在各个运营平台介入的SDK的层次。第二层次是框架层,框架层存在的意义是去调度和运行游戏全部的模块,包括平台层和义务逻辑层,会去组织和解耦各个业务逻辑。通过框架层的隔离,使业务逻辑与平台层没有发生直接的依赖。第三层是业务逻辑层,也就是常见的道具系统、装备系统、任务系统等。 可以看到,框架层是很简单很单薄的,它并没有上下两层中那么多的子模块,这里就涉及到一个概念的认识:越简洁明确的框架,越容易达成共识,越容易降低学习成本。

  • 平台层:是对基础服务提供跨平台的封装
  • 框架层:驱动游戏运行,组织和管理逻辑模块
  • 业务逻辑层




一款C客户端的逻辑架构图_一款C客户端的逻辑架构图


分层设计


框架层

框架层会驱动各个业务逻辑模块进行初始化、反初始化、调度等必要操作,同时框架层会提供事件机制以降低模块间的耦合度。

传统来讲有MVC的概念,在《天天炫斗》中会做到把逻辑分成三部分:系统逻辑、UI逻辑、UI引擎。



一款C客户端的逻辑架构图_解耦_02


逻辑分层


系统逻辑就是常说的业务逻辑,UI逻辑是面板上控件的措施和控制,UI引擎是控件本身内部的逻辑,比如list如何刷新等等。

要做到解耦和,首要要做到系统逻辑和UI逻辑的解耦和,这个地方是通过消息机制去实现的,一个消息的派发器。



一款C客户端的逻辑架构图_UI_03


消息派发器


通过两个比较常见的流程去解释这个方面:

  • 系统逻辑中的数据发生改变导致UI的刷新

比如说一个角色信息发生了改变,需要刷新角色面板,这个时候先通过一条消息。通过派发器派发到UI逻辑,然后UI逻辑接收到这条消息进行处理之后会通知UI引擎,如何刷新控件。比如说把角色属性修改一下,让它重新显示文字。



一款C客户端的逻辑架构图_业务逻辑_04


数据变化导致UI刷新


  • 用户的输入导致系统的操作

比如说点击装备按钮,把装备穿到身上。这个时候事件通常是由UI引擎返回来的,比如一个按钮的click事件。事件到了UI逻辑之后,UI逻辑进行自己的处理之后,发现还是需要去系统方面操作,因为需要通知给服务器,通知本身的数据刷新。那这个时候是通过派发器通知给系统逻辑,这样就通过一个消息派发器的方式去解耦和系统逻辑和UI逻辑。



一款C客户端的逻辑架构图_解耦_05


用户的输入导致系统的操作


另外所有系统逻辑、UI逻辑、UI引擎方面的调度。



一款C客户端的逻辑架构图_解耦_06


调度管理


框架不必设计的大而全,框架的主要目的是让大家在工作弱耦合的同时,还能达成对框架的共识。可以简单地按照这套设计思路去持续开发。而不像造成像些老项目,整个代码是混乱的。原来的框架已经完全不可用了。