游戏客户端开发中对MVC模式的思考
话说在前头,我分析MVC模式是为了确定自己要做的独立游戏的结构出来,并不适用于大型商业游戏的开发。
MVC模式的概述
关于MVC模式,Model用于存储数据,View层用于显示数据,Controller用于连接Model和View层,这种概念是比较公认的。但具体实现如何就有较大的争议了。
还有一种概念是软件的三层结构:用户交互层(UIL)、应用逻辑层(BLL)、数据访问层(DAL)。通常认为MVC是用户交互层使用的一种模式。但实际应用中MVC似乎又泛化了,广泛指代类似的、Model和View分离开来的、三层的结构。
一些实现中,Model实际是数据实体的集合,仅用于从数据库读写数据,业务逻辑主要在Controller层;另一大类实现,则是Model层存放数据和相关处理逻辑,Controller仅起到路由的功能。
MVC模式没有确切的“标准”,主要目的是实现View和Model的解耦,所以M、V两个模块不变,衍生出了一些MVXX模式(MVP、MVVM等)。
而对于游戏客户端来说,MVC模式主要指代在UI系统方面,View层和Controller层的区别看起来比较模糊。游戏中承载UI元素的GameObject (UGUI) 或 Node (Godot UI), (后简称GameObject),归为View层是没有疑问的。
模糊的MVC模式的两种理解
- 在脚本中对UI元素进行的组件绑定、响应绑定、对UI元素进行的一系列复杂的操作(游戏追求的画面效果明显比传统用于显示数据的软件复杂的多)也是可以视为View层的。响应绑定的内容,就说不清楚了。如果单独建一个Controller层,View层接受用户输入后(由于游戏引擎的预处理,在代码中直接对UI组件绑定响应函数,已经是一层转发了)调用Controller的方法,Controller调用Model层的逻辑。这样的好处是“Model与View解耦,在Model需要更换时,只需要修改Controller中的代码”(模仿网络常见论调)。
- 但是,如果把
GameObject视为View层,把上面说到的那个代码脚本视为Controller层,在代码中的响应函数直接连接Model层的逻辑,Model需要更换时,只需要修改Controller中的代码,好像也没什么问题。
那么考虑这两种结构的主要区别,前者多一个单独的“Controller”出来,View传递的事件由中转Controller接收,如果每个“View”对应一个“Controller”,那么通信更复杂了,似乎完全没有必要;如果每个“View”对应多个“Controller”,这个“Controller”就成为了一个公用的模块。在web开发中是很常见的,一些框架通过“Controller”对参数进行判断,返回相应的“View”(ASP.NET MVC)。但因为游戏开发的特殊性,如果存在“View”层的代码脚本,也通常是一个界面就对应一个绑定脚本。除此之外,前者可以在“View”层代码中单独存放UI组件相关的一些数据,后者则不行。
目的到底是什么
之前业余用过一个UI方面的MVC框架(类似上面说的前者),可能是工作经验还太浅,理解不深,或者种种原因,做了错误的判断,但感觉的确不如后者好用。
最近也浏览过几个游戏框架的设计文档,这些框架充分考虑了通用性,即使用不同的UI系统、甚至使用不同的游戏引擎,在代码中预留的位置做好相关适配就可以用。
但并没有遇到这样集中的情况,工作中的开发就确定依赖某个游戏引擎,依赖某个UI系统,并不需要频繁更换这些东西。
而个人开发来说,要做一个独立游戏的话,依赖于某个游戏引擎也是肯定的。考虑那些不使用代码编程,仅用DnD模式制作游戏的开发者……即使一套框架再通用,好像也没什么用武之地。
就个人而言,最终目的还是要做一个游戏出来,而不是做一个框架,相关理念好的学习,做不到的就舍弃,看看就好,越犹豫不决,拖的时间越长,就越难把东西做出来。就Model层和View层,无论是用一个全局类来存储也好,还是分模块来存储也好,这两层尽量分离是毋庸置疑的。剩下的怎么顺手怎么来吧。至于结构的优化、效率的优化、日志追踪等等等等,首先知道有这回事,等demo做出来之后再去做吧……
游戏客户端开发中对MVC模式的思考的更多相关文章
- 稍微谈一下 javascript 开发中的 MVC 模式
随着前台开发日益受到重视,客户端代码比重日益增加的今天,如何在javascript开发里应用MVC模式,这个问题似乎会一直被提到,所以偶在这里粗略的谈一下自己的看法吧. MVC模式的基本理念,是通过把 ...
- 二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...
- 二十七、EFW框架BS系统开发中的MVC模式探讨
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...
- Web前端开发中的MCRV模式(转)
作者: izujian 来源: baiduux 摘要:针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性.扩展性和适应性差等问题,本文尝试以MVC思想为 基础,结 ...
- 【Web开发】Mean web开发 01-Express实现MVC模式开发
简介 Mean是JavaScript的全栈开发框架.更多介绍 用Express实现MVC模式开发是Mean Web全栈开发中的一部分. Express 是一个基于 Node.js 平台的极简.灵活的 ...
- 生活中的MVC模式,一个吃货的理解。
以下是生活中对于MVC模式的领悟,虽然可笑,轻喷. 2015年 8月 26日 M => Model 模型 我认为叫做模具更好的理解.批量加工生产具有相同特征的东西. ...
- php中的MVC模式运用
[size=5][color=Red]php中的MVC模式运用[/color][/size] 首先我来举个例子: 一个简单的文章显示系统 简单期间,我们假定这个文章系统是只读的,也就是说这个例子将不涉 ...
- 浅析前端开发中的 MVC/MVP/MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
- web开发中的MVC框架与django框架的MTV模式
1.MVC 有一种程序设计模式叫MVC,核心思想:分层,解耦,分离了 数据处理 和 界面显示 的代码,使得一方代码修改了不会影响到另外一方,提高了程序的可扩展性和可维护性. MVC的全拼为Model- ...
- 前端开发中的 MVC、MVP、MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
随机推荐
- Prometheus-3:一文详解promQL
读前提示: 本文字数较多且紧凑,最好预留15min一次性看完,好营养,易吸收. promQL详解 Prometheus提供了内置的数据查询语言PromQL(全称为Prometheus Query La ...
- Java扩展Nginx之二:编译nginx-clojure源码
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 为什么要编译nginx-clojure源码 作为< ...
- 当cmd运行python无法显示中文报错 SyntaxError: Non-UTF-8 code starting with 时
报错图片: 解决方法: 在python的脚本开头加上 再运行后
- CentOS 30分钟部署免费在线客服系统
前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程.期间有一些朋友希望能够给出 Linux 环境的安装部署指导,本文基于 CentOS 7.9 来安装部署. 我详细列 ...
- PB从入坑到放弃(四)常用函数
写在前面 这一期呢,来整理下PB 常用的函数,包括系统的和一些自己封装好的函数 一.字符串相关 1.1 Len函数 获取字符串长度 ① 语法 Len(string) ②参数 string-->s ...
- C标准库 操作文件
C标准库 操作文件 数据持久化的两种方法:文件和数据库 文本文件和二进制文件 举个例子,写C++的代码,源代码为文本文件.编译出来的可执行文件(.exe)文件是二进制文件 文本文件 以文本的编码(AS ...
- 最全面的JAVA多线程知识总结
背景: 2023年经营惨淡,经历了裁员就业跳槽再就业,在找工作过程中对于知识的梳理和总结,本文总结JAVA多线程. 应用场景: 需要同时执行多个任务或处理大量并发请求时, 目前常用的场景有: We ...
- 一个批处理,解决你重装python第三方模块的烦恼~(1.0版本)
@echo offpip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simplepython -m pip insta ...
- 文心一言 VS 讯飞星火 VS chatgpt (70)-- 算法导论6.5 9题
九.请设计一个时间复杂度为 (n lgk)的算法,它能够将 k 个有序链表合并为一个有序链表,这里 n 是所有输入链表包含的总的元素个数.(提示:使用最小堆来完成 k 路归并. 文心一言: 要设计一个 ...
- lazarus、delphi文件Http下载断点续传的实现
下载大文件时,断点续传是很有必要的,特别是网速度慢且不稳定的情况下,很难保证不出意外,一旦意外中断,又要从头下载,会很让人抓狂.断点续传就能很好解决意外中断情况,再次下载时不需要从头下载,从上次中断处 ...