游戏高度可配置化(二)用“模型抽象”化解游戏策划和程序员的江湖恩怨

游戏高度可配置化(二)用“模型抽象”化解游戏策划和程序员的江湖恩怨

码客 卢益贵 ygluu

关键词:模型抽象、功能抽象、抽象工厂模式、游戏服务端引擎、高度可配置化、恩怨情仇、游戏策划、数据引擎、生产消费模型、订阅-通知模型

一、前言

众所周知,由于游戏策划的丰富想象力导致游戏服务端引擎实现起来非常艰难。因为紧迫的工期和不断变化的需求,在策划和程序之间还上演了不少江湖恩怨。

本文主要介绍模型抽象在游戏服务端引擎开发中的应用。确切的说本文是上篇的补充(游戏高度可配置化(一)[1])。

二、程序员的脾气和宿命

一般程序员都有者对技术执着的宿命通病,如执着地用技术解决性能问题、执着地用技术解决功能问题。在策划一而再、再而三的改变需求时,多数程序只能“疲于奔命”,所以“没有脾气的程序员不是好程序员”。

图1 RD和PM打起来了(图片来源于网络)

图2 被逼疯的程序员(图片来源于网络)

三、策划的抱怨和冤屈

“你按我说的做就得了,配置要简单要灵活。”

“这个功能很简单啊,什么时候完成?”

“我Kao,这么一个小案子花这么多时间还有这么多Bug。”

“不好意思案子改了,你再改下程序”。(不改案子的策划不是好策划

图3 被喷的策划(图片来源于网络)

图4 这么多Bug(图片来源于网络)

四、主策和主程的共同目标

主策:案子什么时候出?

策划:#%¥*&#……

   

主程:这个案子什么时候完成?

程序:&@*@#!*&#¥*......

在短期KPI使然下,开发初期欠下的债都会在运营后慢慢地还。游戏是否成功与代码好坏无关,但与开发效率和质量有关。

主策和主程是优秀的管理者,应该联手着重解决开发效率问题,过程优化是决定效率的关键因素。

图5 主策和主程的共同目标

五、什么是模型抽象

抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。抽象的意义在于通过抽象能透过事物的表面现象抓住事物的本质。[2]

【真正的高手,都具备高度抽象能力】高级开发者,能够根据业务的特点,抽象出软件最合理的设计,使得程序具有良好的可读性和扩展性,通常一开始写出的逻辑就为了以后的重用。许多开发框架就是一步步抽象/埋坑/优化而来的。[3]

1、功能抽象

功能抽象在文本定义为:以系统功能特征为基础的低度抽象。

“人”的功能抽象:头、眼、鼻、手、脚......

2、模型抽象

模型抽象在本文定义为:以实现系统功能的模式为基础的高度抽象。

“人”的模型抽象:大脑、神经中枢、感应组织、行动组织,以此形成一个“感知-思维-传导-执行”的模型,它能以“更加广泛的方式”解决“更加广泛的问题”。

3、抽象高度

模型抽象和功能抽象的抽象高度如图6所示。

图6 模型抽象和功能抽象的高度

图6中有3种抽象应用流(箭头流)。第1种比第3种具有更高的抽象高度,相比第3种能更灵活地解决多数需求。众所周知,抽象是不能100%解决问题的,所以第2种是以第1种(模型抽象)为基础的,相比第3种具有更加便捷和高效的特点,用于解决少数特殊的需求问题。

六、ON-DO模型

1、生产-消费模型

人类活动都是一个生产-消费的过程,游戏也不例外(但对游戏数据的处理以生产-消费模型[5]出现的甚少)。

图7 生产-消费模型

2、ON-DO模型

由于在数字信息世界里,消费不等于消耗,如我们从数据仓库里获得(消费)一个数据,仅是这个数据副本而已并没有产生实际消耗,另外生产结果也不一定是正值。所以综合游戏数据特征,将消费-生产模型演进为ON-DO模型,即当什么条件满足时做什么事情(条件对象和执行对象)。如8所示,

图8 ON-DO模型的可配置化

3、模型抽象比功能抽象更有优势

由图9可知,功能抽象的编码工作量远大于模型抽象。

图9 模型抽象和功能抽象的开发工作量

引用本人之前文章的插图(可配置化数学建模的应用案例图解[5]):

 图10 模型抽象和功能抽象的可配置化对比

如图10所示,模型抽象比功能抽象的可配置化程度更高,应对需求变化更灵活。

4、数据引擎

如前所述,配置层所依赖的数据从哪里来?在消费-生产模型中都会依赖一个数据缓冲的中间件[4],在本人做科研时依赖一个数据交换机的中间件[5],本文把这个中间件称作“数据引擎”[1](下称:数据引擎或de),如图11所示。

图11 数据引擎

每一款游戏都它特定的基础数据和基础行为,只要将他们进行高度信息化后统一纳入到数据引擎的管理范畴中[1],就可以满足在配置层的数据所需,并且还可以在配置层衍生出多维度的数据信息[1]。

 图12 游戏基础数据和基础行为的高度信息化

数据引擎源码下载见[6]

七、游戏数据形态的模型抽象

依据游戏数据形态抽象出两种管理模型:1、递进式模型,2、并列式模型。依据数据变化的响应模式抽象出两种模式:1、观察者模式(监听,订阅-通知模型),2、探测者模式(查询)。管理模型和响应模式可以俩俩组合的。

图13 递进式模型的配置实现

图14 递进式模型观察者模式的伪代码实现

图15 并列式模型的配置实现

图16 并列式模型探测者模式的伪代码实现

图17 其他数据配置样例

由图13、图15、图17可知,在ON-DO模型下,各种数据统一了配置格式,减少了配置样式和Load代码的开发成本。由图14、图16可知,在ON-DO模型下,无论是哪种数据管理模式和哪种数据响应模式,编码的成本是非常低的。

八、游戏行为模式的模型抽象(维度空间模型抽象)

每种游戏都它既定的行为模式,每一种行为都可以产生不同维度的数据,把行为模式抽象成维度空间模型[5],每个维度空间执行不同的配置项,如图18所示。


图18 维度空间模型

图19 维度空间模型的配置实现

图20 维度空间模型的伪代码实现

由图19可知,ExeObj对象支持txt格式的流程控制表达文件(txt)和脚本对象,也可以支持和图13、图15、图17一样的数据运算表达式。由图20可知,维度空间模型的编码成本依然还是非常低。

流程控制表达式样例如图21所示(脚本就不再举例):

图21 流程控制表达式样例

九、留给策划更广阔的想象空间(游戏服务端引擎)

如前所述,ON-DO模型抽象(数据引擎)有以下特点:1、极大的降低编码成本,2、高度实现可配置化,3、在配置层可衍生数据,4、在配置层可实现游戏场景布置(流程控制,时间原因暂无样例说明)。

综上所述,游戏服务端引擎应该具备两个特点:1、高度可配置化:能够易用灵活地应对多数策划需求;2、模块化编码:可以便捷高效地编码以满足少数策划需求。

当然,高度可配置化必须建立在“广泛和易用”的原则之上,不要盲目为了可配置化而可配置化。

所以,基于模型抽象的游戏服务端引擎,能留给策划更广阔的想象空间(减少策划和程序的冲突概率)。

十、相关链接

[1] 游戏高度可配置化——通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解:

https://blog.csdn.net/guestcode/article/details/129214458

[2]、抽象的概念:

冯回祥,第100页.思维方法与数学教学 思维方法在小学数学教学中的应用:华中科技大学出版社,2018.01:100-101

抽象(科学学概念)_百度百科

https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1/9021828?fr=aladdin

[3]、真正的高手,都具备高度抽象能力:

https://blog.csdn.net/weixin_45719624/article/details/102482305

[4] 消费-生产模型参考:

https://www.cnblogs.com/chentingk/p/6497107.html

[5] 可配置化数学建模的应用案例图解:

https://blog.csdn.net/guestcode/article/details/127469191
[6] 数据引擎(data-e)下载链接:

https://github.com/ygluu/data-e
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/735236.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day11 —— 大数据技术之Spark

Spark快速入门系列 Spark的概述什么是Spark?Spark的主要特点Spark的主要组件 Spark安装Spark三种运行模式Spark Standalone架构Spark Standalone的两种提交方式Spark On YARN架构 RDD算子转化算子行动算子 Spark RDDRDD的创建从对象集合创建RDD从外部存储创建RDD Sp…

基于SpringBoot+vue闲置物品交易网站详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

系统架构师概述

引言 系统架构设计师是项目开发活动中的众多角色之一,它可以是一个小组或者一个人或者是一个团队,架构师包含建筑师,设计师,创造者,缔造者,可以说架构师就是我们社会各个领域的创造者和缔造者。从组织上划分…

【深度学习系列】全面指南:安装TensorFlow的CPU和GPU版本

本博客旨在为初学者提供一份全面的指南,介绍如何根据个人电脑的配置选择并安装适合的TensorFlow版本。内容涵盖了如何查看电脑显卡型号以确定是安装CPU还是GPU版本的TensorFlow,创建Python虚拟环境,以及使用conda命令查找可用的TensorFlow版本…

使用Vercel 搭建自己的Dashy导航页

背景 Dashy 是一个开源的自托管导航页面配置服务,它具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。用户可以利用 Dashy 将自己常用的一些网站聚合起来,形成一个个性化的导航页面。 同类的竞品还有Heimdall, Flare 等。 可以通过Docker 等…

DAMA学习笔记(二)-数据治理

1.引言 数据治理(Data Governance,DG)的定义是在管理数据资产过程中行使权力和管控,包括计划、监控和实施。在所有组织中,无论是否有正式的数据治理职能,都需要对数据进行决策。建立了正式的数据治理规程及…

深入学习Java1213新特性

一、关于Java生态圈 二、Java老矣,尚能饭否? 三、JDK各版本主要特性 四、JDK与IDE的下载与安装 五、Java12新特性 1.switch表达式(预览)

以太坊==MetaMask获取测试币最新网址

估算分数https://community.infura.io/t/unable-to-receive-sepolia-eth-from-faucet/7715 Gitcoin Passport 水龙头地址,填入自己的测试地址 水龙头项目地址 GitHub - pk910/PoWFaucet: Modularized faucet for EVM chains with different protection methods (…

DNF手游攻略:云手机辅助流光星陨刀详细攻略大全!

DNF手游中,流光星陨刀是鬼剑士的专属神器之一,拥有快速的攻击速度和优秀的物理与法术攻击属性,因其出色的性能和未来升级的潜力,成为广大玩家关注的焦点。 流光星陨刀的背景与起源 流光星陨刀作为鬼剑士的标志性武器之一&#xf…

Go 语言学习笔记之数组与切片

大家好,我是码农先森。 数组与切片的区别 在 Go 语言中,数组和切片是两种不同的数据结构,它们之间有以下主要区别。 参数长度: 数组(Array):数组的长度是固定的,在创建时就需要指…

CMMM Plus+ Calculus Update 超级游戏大作 游戏说明

资源链接 关卡编辑器 ◽️使用 WASD 移动视图。 ◽️LMB 放置单元格。 ◽️Space LMB 删除单元格。Ctrl Space LMB 删除所有相同类型的单元格。 ◽️Q / E 旋转单元格。 ◽️Z / X 在单元格类别之间切换。 ◽️键 1-9 快速选择单元格。 ◽️按 F 显示可拖动的图块。 ⌨️控…

机器学习好神奇,来看看Lasso的超参数调整与模型选择

目录 一、什么是机器学习?二、稀疏建模介绍三、Lasso回归简介四、Lasso超参数调整与模型选择 一、什么是机器学习? 机器学习是一种人工智能技术,它使计算机系统能够从数据中学习并做出预测或决策,而无需明确编程。它涉及到使用算…

贪心算法——最少跳跃步数(C++)

未来,未来。 ——2024年6月17日 题目描述 给定一个含n(1≤n≤1000)个非负整数数组nums(0≤nums[i]≤1000),数组中的每个元素表示在该位置可以跳跃的最大长度,假设总是可以从初始位置0到达最后一…

【C++】————类和对象(中)

作者主页: 作者主页 本篇博客专栏:C 创作时间 :2024年6月22日 一、类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下&#x…

MySQL数据库中的索引知识

MySQL数据库中索引的作用是用来加快数据的查询速度。 索引 index(表的层面) 在数据库中使用select来查询数据的时候会一条一条得去查询符合要求的数据,而索引就相当于在这张表中依据某一个字段的数值给这张表的数据创建了一个目录。目录帮…

MK的前端精华笔记

文章目录 MK的前端精华笔记第一阶段:前端基础入门1、(1)、(2)、 2、3、4、5、6、7、 第二阶段:组件化与移动WebAPP开发1、(1)、(2)、 2、3、4、5、6、7、 第三…

发布微信小程序需要icp证吗?

微信小程序需要办理ICP许可证吗? 微信小程序需不需要办理ICP许可证,具体要看你的小程序类目是什么,还要看你的小程序具体是做什么的? 根据《互联网信息服务管理办法》 第四条 国家对经营性互联网信息服务实行许可制度&#xff1b…

微信小程序反编译 2024 unveilr.exe

ps:一开始用的反编译工具是wxappUnpacker,后面改为 unveilr.exe 1.先找到小程序安装目录“E:\聊天记录\WeChat Files\Applet”,要反编译小程序的包 文件夹下的名字对应的是小程序ID,如果不确定是哪个,可以删除->打…

Open3D点云处理学习

Color ICP Colored point cloud registration — Open3D 0.11.0 documentation Colored point cloud registration - Open3D 0.18.0 documentation 展示了使用color-icp结果 对比gicp错误处理结果 intel自己的论文 Colored Point Cloud Registration Revisited 优化方程 参…

JVM专题六:JVM的内存模型

前面我们通过Java是如何编译、JVM的类加载机制、JVM类加载器与双亲委派机制等内容了解到了如何从我们编写的一个.Java 文件最终加载到JVM里的,今天我们就来剖析一下这个Java的‘中介平台’JVM里面到底长成啥样。 JVM的内存区域划分 Java虚拟机(JVM&…