【转载】u3d游戏客户端架构(---)
原文:http://blog.csdn.net/xtxy/article/details/8474506
主要是mvc架构,
M层为数据层,两个用途:1保存数据;2发送数据更新信息;
V层为视图层,两个用途:1接受用户从界面上的操作;2根据M层的数据显示相应的界面;
C层为控制层,两个用途:1处理和界面无关的代码逻辑;2接受和处理网络数据;
继续……
按照自己的经验,游戏中的mvc架构有两种思想,1,以mvc架构为主,整个框架就是一个mvc架构;2,以对象思想为主,对象中使用mvc架构,整个框架使用一个平行结构。先看看使用mvc架构的方式,如下图:
各个模块分为mvc三部分,有些模块可能只有其中一部分,比如只有view,只有model等。不同模块的mvc三部分对于其他模块也是可见的,比如bagview可以访问rolectrl,也许不需要访问,这里只是举例说明,rolectrl对于bagview是可见的。
整个框架的运行流程如下:
A 玩家在界面上操作的情况:
1 玩家的输入在view层处理,比如玩家在包裹面板上使用了一个道具,此道具的作用是给玩家一个buf,操作由bagview处理;
2 bagview将使用道具的操作转换为和界面无关的操作,发送给bagctrl,比如将界面上该道具的位置转换为包裹中的索引位置;
3 bagctrl在收到请求后将操作组装成请求包,通过networkIO发送给服务器;
此时,操作的前半部分就已经结束,操作带来的影响需要服务器处理
4 服务器返回操作结果,比如此时返回了两个协议,通过NetworkIO中对包的协议分析,分别发送给bagctrl处理和rolectrl处理;
5 bagctrl根据包的内容,此处应该是包裹中扣除一个道具,调用bagmodel的方法,扣除指定的道具;
6 bagmodel将数据更新,并发送包裹更新的事件到事件管理器;
7 事件管理器将包裹更新事件广播出来;
8 bagview注册了包裹更新事件的监听,bagview在收到事件后判断是否需要更新界面显示,如果需要,则获取bagmodel的数据,根据数据更新界面;
包裹的处理就已经完成了
9 rolectrl根据包的内容,此处应该是玩家拥有了一个新的buf,调用rolemodel的方法,增加buf;
10 rolemodel将数据更新,并发送玩家信息更新的事件到事件管理器;
11 事件管理器将玩家信息更新事件广播出来;
12 roleview和headview都注册了玩家信息更新事件的监听,
13 roleview根据当前玩家状态决定是否需要更新玩家3d形象,如果需要,则获取rolemodel的数据,做相应更新,比如在头顶加一个特效等;
14 headview根据当前玩家状态决定是否需要更新玩家头像信息,如果需要,则获取rolemodel的数据,做相应更新,比如在面板上加一个buf的图标等;
B 处理网络包的情况,其实就是上面流程中从步骤4开始到最后。
整个流程中需要注意几点:
1 在接受玩家的操作之后,如果没有特殊需求,view不能直接更改显示,显示的更改都要根据model发出的事件来触发;否则,在多个条件影响同一个view时,会出现错误;
2 view不能直接修改model的数据,只能读取,model的修改只能由ctrl来做;否则整个框架在游戏规模变大之后会变得相当混乱;
3model的作用只能是修改自身数据,并且发送事情出来,不能有其他操作;
由于完全开发各个模块各个层之间的可见关系,会将整个框架变为一个很复杂的网状结构,给拆分和扩展带来很大的麻烦,所以在可见性上做以下限制:
1 model层不能调用任何其他模块方法,只能调用事件管理器方法发送事件;
2 control层只能调用自己模块的model层方法;也就是说control层不能修改其他模块model层的数据;如果一个control必须要更改另外一个model的数据,可以通过调用另外一个control的方法来间接修改;
3 control层之间可以相互调用;因为处理网络IO的包时不管怎么样都需要在一个地方处理各个模块之间的交互,所以可以放在control层;
4 view可以调用其他模块的control层,但是不能view调用其他view,如果出现这种情况,一般都是设计不当造成的;
整个框架的调用关系就如下所示:
先写到这里……
【转载】u3d游戏客户端架构(---)的更多相关文章
- 泡泡堂、QQ堂游戏通信架构分析
http://blog.csdn.net/sodme/article/details/468327#comments ————————————————————————————————————————— ...
- U3D游戏开发商思考
代码驱动带来的技术题 游戏碎片化.U3D 引擎有个非常有力的特色,就是实时编译执行.这意味着不管在不论什么时候,仅仅要按下执行图标,当前的场景就会进入可执行状态. 这导致了游戏在开发的过程中常常陷入一 ...
- 微信Android客户端架构演进之路
这是一个典型的Android应用在从小到大的成长过程中的“踩坑”与“填坑”的历史.互联网的变化速度如此之快,1年的时间里,可以发生翻天覆地的变化.今天在这里,重新和大家回顾微信客户端架构的演进过程,以 ...
- 转:微信Android客户端架构演进之路
转自: http://www.infoq.com/cn/articles/wechat-android-app-architecture 微信Android客户端架构演进之路 作者 赵原 发布于 20 ...
- 精华阅读第 9 期 |滴滴出行 iOS 客户端架构演进之路
「架构都是演变出来的,没有最好的架构,只有最合适的架构!」最近,滴滴出行平台产品中心 iOS 技术负责人李贤辉接受了 infoQ 的采访,阐述了滴滴的 iOS 客户端架构模式与演变过程.李贤辉也是移动 ...
- 支付宝客户端架构解析:Android 容器化框架初探
摘要: 本文将介绍支付宝 Android 容器化框架设计的基本思路. 1. 前言 由本章节开始,我们将从支付宝客户端的架构设计方案入手,细分拆解客户端在“容器化框架设计”.“网络优化”.“性能启动优化 ...
- 《Unity 3D游戏客户端基础框架》概述
框架概述: 做了那么久的业务开发,也做了一年多的核心战斗开发,最近想着自己倒腾一套游戏框架,当然暂不涉及核心玩法类型和战斗框架,核心战斗的设计要根据具体的游戏类型而定制,这里只是一些通用的基础系统的框 ...
- 游戏引擎架构 (Jason Gregory 著)
第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...
- helios架构详解(二)客户端架构和cluster
helios的客户端架构和服务器端类似,只有部分类有所区别(黄色的),下图是客户端的架构 可以看出实际上只有IConnection的俩个实例(TcpConnection.UdpConnection)是 ...
随机推荐
- Yii 之数据库查询
模型代码: <?php namespace app\models; use yii\db\ActiveRecord; class Test extends ActiveRecord{ } 控制器 ...
- html5对各浏览器的支持情况
考虑到HTML5标准的制定原则:新特性基于HTML.CSS.DOM 以及 JavaScript:减少对外部插件的需求(比如Flash):独立于设备等,我们选取了HTML 5的几项主要特性来评价浏览器系 ...
- 常用业务返回对象类ResponseJson
目录 1.ResponseJson类 2.使用举例 1.ResponseJson类 import java.io.Serializable; public class ResponseJson imp ...
- android EditText监听和长度监测事件
<?xml version="1.0" encoding="utf-8"?> <!-- 定义基础的LinearLayout布局 --> ...
- Java中的Copy-on-Write容器 & ConcurrentHashMap & HashTable比较
参考这篇文章:Link 从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet ...
- Python基础语法04-数据结构
Python Number(数字) Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. Python 支持 ...
- oracle 静默安装
下载oracle的安装包: 下载地址: 注意下载oracle是须要注冊oracle的 http://download.oracle.com/otn/nt/oracle11g 下载两个包: linux. ...
- linux find 命令查找 复制
find 查找 find . -mtime -2 -a -path './.git*' -prune , -path './Cache' -prune -a -exec cp {} one \; rm ...
- ci中 chrome对favicon.ico请求,导致log报错 解决方法
chrome浏览器会自动对favicon.ico进行请求,所以当没有为网站添加 favicon.ico 时会出现404的页面错误在实际开发过程中,CI框架 打开 ERROR log,会一直显示ERRO ...
- invlpg 指令简单介绍
invlpg 指令简单介绍 void tlb_invalidate(pde_t *pgdir, void *va) { // Flush the entry only if we're modifyi ...