话说在前头,我分析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模式的两种理解

  1. 在脚本中对UI元素进行的组件绑定、响应绑定、对UI元素进行的一系列复杂的操作(游戏追求的画面效果明显比传统用于显示数据的软件复杂的多)也是可以视为View层的。响应绑定的内容,就说不清楚了。如果单独建一个Controller层,View层接受用户输入后(由于游戏引擎的预处理,在代码中直接对UI组件绑定响应函数,已经是一层转发了)调用Controller的方法,Controller调用Model层的逻辑。这样的好处是“Model与View解耦,在Model需要更换时,只需要修改Controller中的代码”(模仿网络常见论调)。
  2. 但是,如果把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模式的思考的更多相关文章

  1. 稍微谈一下 javascript 开发中的 MVC 模式

    随着前台开发日益受到重视,客户端代码比重日益增加的今天,如何在javascript开发里应用MVC模式,这个问题似乎会一直被提到,所以偶在这里粗略的谈一下自己的看法吧. MVC模式的基本理念,是通过把 ...

  2. 二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  3. 二十七、EFW框架BS系统开发中的MVC模式探讨

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  4. Web前端开发中的MCRV模式(转)

    作者: izujian  来源: baiduux 摘要:针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性.扩展性和适应性差等问题,本文尝试以MVC思想为 基础,结 ...

  5. 【Web开发】Mean web开发 01-Express实现MVC模式开发

    简介 Mean是JavaScript的全栈开发框架.更多介绍 用Express实现MVC模式开发是Mean Web全栈开发中的一部分. Express 是一个基于 Node.js 平台的极简.灵活的 ...

  6. 生活中的MVC模式,一个吃货的理解。

    以下是生活中对于MVC模式的领悟,虽然可笑,轻喷. 2015年 8月 26日 M  => Model       模型 我认为叫做模具更好的理解.批量加工生产具有相同特征的东西.        ...

  7. php中的MVC模式运用

    [size=5][color=Red]php中的MVC模式运用[/color][/size] 首先我来举个例子: 一个简单的文章显示系统 简单期间,我们假定这个文章系统是只读的,也就是说这个例子将不涉 ...

  8. 浅析前端开发中的 MVC/MVP/MVVM 模式

    MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...

  9. web开发中的MVC框架与django框架的MTV模式

    1.MVC 有一种程序设计模式叫MVC,核心思想:分层,解耦,分离了 数据处理 和 界面显示 的代码,使得一方代码修改了不会影响到另外一方,提高了程序的可扩展性和可维护性. MVC的全拼为Model- ...

  10. 前端开发中的 MVC、MVP、MVVM 模式

    MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...

随机推荐

  1. VSCode设置第三方字体

    最近需要写C,所以下了一个VSCode IDE嘛 当然是美观最重要了(不是 个人比较喜欢JetBrains家的字体 在IDEA中主要使用的是 JetBrains Mono 想着把VSCode的字体也设 ...

  2. Day09_Java_作业

    A:简答题 1.什么是多态,多态的前提是什么? 2.多态中成员(成员变量,成员方法,静态成员方法)的访问特点是什么? 3.多态的好处? 4.多态的弊端是什么,如果我们想访问子类的特有的功能我们应该怎么 ...

  3. 《最新出炉》系列入门篇-Python+Playwright自动化测试-9-页面(page)

    1.简介 通过前边的讲解和学习,细心认真地小伙伴或者童鞋们可能发现在Playwright中,没有Element这个概念,只有Page的概念,Page不仅仅指的是某个页面,例如页面间的跳转等,还包含了所 ...

  4. java发送http请求(jquery发送http请求,前后端看这一篇文章够了,很完整)

    为什么写这篇博客? 1.目前很多系统使用了微服务架构,那么各个微服务之间进行内部通信一般采用http协议的方式,springcloud中提供了ribbon,feign,openFeign等组件. 但是 ...

  5. Go中 net/http 使用

    转载请注明出处: net/http是Go语言标准库中的一个包,提供了实现HTTP客户端和服务器的功能.它使得编写基于HTTP协议的Web应用程序变得简单和方便. net/http包的主要用途包括: 实 ...

  6. ApiPost: Error:ESOCKETTIMEDOUT

    原因 apipost设置响应时间过短 解决方案

  7. 论文解读(LightGCL)《LightGCL: Simple Yet Effective Graph Contrastive Learning for Recommendation》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:LightGCL: Simple Yet Effective Graph Contrastive Lear ...

  8. 【RocketMQ】MQ消息发送总结

    RocketMQ是通过DefaultMQProducer进行消息发送的,它实现了MQProducer接口,MQProducer接口中定义了消息发送的方法,方法主要分为三大类: send同步进行消息发送 ...

  9. Deno 中使用 @typescript/vfs 生成 DTS 文件

    背景 前段时间开源的 STC 工具,这是一个将 OpenApi 规范的 Swagger/Apifox 文档转换成代码的工具.可以在上一篇(<OpenApi(Swagger)快速转换成 TypeS ...

  10. centos7.X安装mysql5.7 – 东凭渭水流

    1.下载mysql5.7 可以使用windows下载好后上传至Linux.网络条件好的推荐使用 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/m ...