游戏高度可配置化:通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解
游戏高度可配置化:通数据引擎在模块化游戏开发中的应用构想图解
ygluu 码客 卢益贵
目录
一、前言
二、模块化与插件
1、常规模块化
2、插件式模块化(插件开发)
三、通用数据引擎理论与构成
1、名字系统(数据类型)
2、数据仓库(数据持久化)
3、监听器(事件与订阅-通知模型,观察者模式)
4、生产-消费模型
5、公式系统[6]、条件系统[5]、运算集合、流程控制系统
6、数据工作站
四、通用数据引擎在游戏开发中的构想
1、游戏的高度信息化(系统数据、玩家数据和行为信息的大统一)
2、游戏服务端与客户端数据同步(红点系统)
3、基础数据与衍生数据
4、数据维度空间模型与游戏的高度可配置化
5、成长线、活动、任务等策划需求的抽象和配置实现
6、抽象的八二法则与高效开发
7、游戏模块(插件)的冷热拔插
8、给予策划更广阔的想象空间
9、程序员的思维转换和工作转移
五、通用数据引擎的应用问题与前景展望
1、应用问题1:中间商赚差价
2、应用问题2:细节与方法论
3、前景展望1:公司内部插件式软件开发框架
4、前景展望2:云插件及云IDE服务商(插件式模块化游戏云开发平台)
六、相关知识与链接
一、前言
在插件式模块化软件开发当中,既要模块高度独立(解耦)又要共享模块数据,最好的方法是有个中间平台(中间件)提供标准的接口来进行数据的交换,这在很多行业软件开发中已经广泛应用。但是,由于中间件的抽象和封装没有具备通用性的前提,使得在实际应用中受到了很大的制约。
本文将以“数据引擎”的概念来阐述通用数据中间件的理论和构成,以及以“通用数据引擎在游戏开发中的应用构想”来作为其的应用范例。
二、模块化与插件
有关模块化软件开发的详细介绍这里不再做赘述(网上有很多参考资源[1])。
1、常规模块化
图1
2、插件式模块化(插件开发)
图2
三、通用数据引擎理论与构成
数据引擎是业界常用方法的集合(包含名字系统、数据仓库、条件系统、公式系统、运算集合、流程步骤控制系统、监听系统(数据变化监听和条件监听)、自定义函数系统、Go数学函数库、数据工作站),是为系统数据和模块数据提供统一交互接口的中间件(参考 data-e 源码[2])。
图3 数据引擎结构及数据交互模式
1、名字系统(数据类型)
名字系统是数据引擎的基础核心,它将系统所有数据进行命名和ID编号。
图4 数据名称配置表(可根据分类进行分表配置)
图5 数据ID编码方式
2、数据仓库(数据持久化)
数据仓库为数据提供了标准的Get/Set/Save/Load接口。
图6 数据统一持久化
3、监听器(事件与订阅-通知模型,观察者模式)
监听器是采用订阅-通知模型[3]而做的,是模块监听数据变化和做出及时响应处理的管理单元。
图7
4、生产-消费模型
事实上所有活动都是消费-生产的过程。在信息化系统里面,消费不一定是消耗。比如我们0元购买合法的商业信息,但这个信息并没有改变,我们仅是获得信息副本,但对提供信息的商家来说你的行为就是对这个信息的消费行为。也就是说GetValue和Value=Value-1都是消费行为。
图8 生产消费模型
再对消费-生产[4]进行一个概念的升级就是:依据什么条件(消费数据)做什么事情(生产数据),即On-Do,就此引入条件系统[5]。
图9 消费-生产配置表
图10 消费-生产模型实现代码
由图9和图10可见,模型化的生产-消费方式实现了高度可配置化——代码层并不知道具体执行什么。
5、公式系统[6]、条件系统[5]、运算集合、流程控制系统
数据引擎将四则运算表达式统称为公式。公式表达、条件表达、运算集合表达式关系如图11:
图11 公式、条件、运算集合表达式关系
流程控制表达式包含了运算集合和控制指令(计算控制和行为控制),如果图12:
图12 流程控制表达式
6、数据工作站
数据工作站是每个模块操作数据的个体实例,当生产数据时该模块的工作站会记录相关数据ID,便于条件符合时对该模块所生产的数据进行清理操作,并同时提供对数据的监听操作。
四、通用数据引擎在游戏开发中的构想
通用数据引擎在模块化开发中的应用场景很广,以下以游戏开发的应用构想为例。
1、游戏的高度信息化(系统数据、玩家数据和行为信息的大统一)
游戏中各种数据都是已经数字化的,但数字化不一定就能信息化,信息化离不开交互环节。当我们把游戏数据都纳入到数据引擎的管辖范围以后,才能够实现信息的无障碍交互。
图13 游戏数据的高度信息化
2、游戏服务端与客户端数据同步(红点系统)
依托标准数据同步接口和客户端数据引擎,服务端可以有超过50%以上的数据无需再编程实现和客户端的交换,客户端也可以依赖条件系统在红点处理方面减少开发工作量,能够进一步提升开发效率。
图14 游戏服务端与客户端数据同步
3、基础数据与衍生数据
每个一款游戏都有固定的基础数据和信息(比如属性等数据、进入离开地图和杀敌等事件)。无论是游戏业务模块还是游戏框架模块,玩家行为产生的仅是基础数据,由基础数据衍生的数据放在配置层来实现:
图15 游戏基础数据与衍生数据
如果图15所示,在配置层配置条件表达式“当次充值>0”和数据表达式“总充值+当次充值;日充值+当次充值;周充值+当次充值”,并加载到数据引擎的监听器中,当条件满足时即可衍生出“总充值、日充值、周充值”等衍生数据。以此类推,依托框架模块和业务模块的基础数据可以在配置层衍生出任意所需的数据。
4、数据维度空间模型与游戏的高度可配置化
以往,我们习惯于在玩家的各个行为事件环节用代码实现游戏数据的加工和逻辑控制。假如我们以一种模型的角度来现实,它产生效果是意想不到的。在此引用本人在数学建模的案例插图说明一下维度空间模型(见《可配置化数学建模的应用案例图解》[7]):
图16 数据维度空间模型
图17 数据维度空间模型的配置项样例
由图16和图17可见,在模型方式下,在代码层不再执行具体的数据运算和流程控制,而放在了配置层,依托数据引擎对配置表达式的解析和执行,我们游戏的可配置化程度再提升到了一个新的高度,并且也减少了大量的编码工作。
关于游戏的完整数据维度空间模型在此不多做举例,仅以玩家登录后在地图杀敌为例:
图18 数据维度空间模型及高度可配置化
由图18可见,依据代码层提供的基础数据,在配置层衍生了玩家杀敌需要的时长(可统计敌我实际战力平衡指数)、每日杀敌数量、总杀敌数量、赛季杀敌数量等,这些数据可应用于福利模块、任务模块等以满足一连串的策划需求。
5、成长线、活动、任务等策划需求的抽象和配置实现
通过对成长线、活动、任务等策划需求的分析,结合相关数据特性,可以抽象出两类数据管理对象:递进式和并列式数据管理对象,根据对数据的响应方式可以抽象出观察者模式、探测者模式。
递进式数据管理对象可以用于成长线(皮肤晋级、技能升级等)、七日福利、任务等等,而成长线、七日福利属于探测者模式(玩家请求后从数据引擎探测条件是否满足再执行),任务模块则是属于观察者模式(把条件提交给数据引擎的监听器,条件满足后自动执行相应的任务配置表达式)。
并列式数据管理对象可用于宝石系统等,各类颜色的宝石激活后即可叠加给属性加成,而每个颜色的宝石又是一个递进式的数据(宝石有升级需求),所以并列式的数据管理对象包含了递进式的数据管理对象。
上述抽象描述有点难理解,以图例说明(前述抽象的封装对象可以轻松完成以下例子的配置):
图19 成长线、活动、任务等策划需求的抽象和配置实现
图19仅是部分策划需求的范例,从中看出,多数的策划需求不外乎消费什么数据来生产什么数据,依托数据引擎可以抽象封装很多策划需求,所以无论可配置化率还是开发效率都极度的提升。
6、抽象的八二法则与高效开发
俗话说没有100%绝对的事情。如果抽象能解决80%(多数)问题那么就是正确的(剩下20%(少数)问题再具体问题解决解决),如果优化能减少80%(多数)繁琐细节那么他也是正确的。
图20 八二法则(图片来源于网络)
7、游戏模块(插件)的冷热拔插
系统初始化有代码单元初始化、线程初始化、模块依赖初始化,只要遵循一定框架规范,任意一个游戏模块都可以在运营时关闭和启动,当关闭时其他模块对它的数据取值返回为0而已,只是相关功能不能操作,不影响系统正常运营。
8、给予策划更广阔的想象空间
高度可配置化可以留给策划更广阔的想象空间,可以轻松设定和实现数值模型,并且能深度发掘需求潜力。
图21 想象空间(图片来源于网络)
9、程序员的思维转换和工作转移
相对于传统方式,生产-消费模型需要程序员转变思维方式。成熟的插件开发框架能让程序开发更加容易和轻松,所以程序员的工作方向转移到配合策划进行配置表配置。
五、通用数据引擎的应用问题与前景展望
1、应用问题1:中间商赚差价
但凡有中间商都会被赚取差价。所以中间件对性能是有损耗的,但以当下的CPU算力,多数系统是绝对能接受的(其实实际开发中有很多不良的编码方式导致很大的性能消耗),也就是说在性能可接受的前提下开发效率为王。
2、应用问题2:细节与方法论
确定了插件式的软件开发方向,往往很多细节问题会让人无所适从,解决问题无外乎方法论,而方法源于经历和阅历。
3、前景展望1:公司内部插件式软件开发框架
在优秀的抽象和逻辑能力下,随着时间迭代,基于数据引擎的软件系统就会形成一个成熟的软件框架,插件式开发可为企业提高可观的开发效率。
4、前景展望2:云插件及云IDE服务商(插件式模块化游戏云开发平台)
更乐观一些的,依托于docker、k8s、grafana和成熟软件框架(如捕鱼游戏框架、棋牌游戏框架、MMO游戏框架等)可组成一个云插件游戏开发平台,其他公司或工作室只需开发具体游戏业务插件,平台托管插件代码和负责运营并按比例抽成。
六、相关知识与链接
[1] 模块化参考链接:插件式模块化软件框架的思想图解(一、二、三)
https://blog.csdn.net/guestcode/article/details/119701789?spm=1001.2014.3001.5501
https://blog.csdn.net/guestcode/article/details/119981524?spm=1001.2014.3001.5501
https://blog.csdn.net/guestcode/article/details/124780626?spm=1001.2014.3001.5501
[2] 数据引擎(data-e))源码:
https://github.com/ygluu/data-e
[3] 订阅-通知模型(观察者模式)介绍
https://baike.baidu.com/item/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/5881786?fr=aladdin
[4] 生产-消费模型 (线程队列模式)参考链接
https://wenku.baidu.com/view/38b499c85df7ba0d4a7302768e9951e79b89691f.html?_wkts_=1677317893084&bdQuery=%E7%94%9F%E4%BA%A7%E6%B6%88%E8%B4%B9%E6%A8%A1%E5%9E%8B
https://blog.csdn.net/weixin_34409703/article/details/92112762
[5] 条件系统参考链接
https://baike.baidu.com/item/%E6%9D%A1%E4%BB%B6%2F%E4%BA%8B%E4%BB%B6%E7%B3%BB%E7%BB%9F/53173668?fr=aladdin
https://blog.csdn.net/weixin_34409703/article/details/92112762
[6] 公式系统参考链接
https://studygolang.com/articles/24125?fr=sidebar
[7] 可配置化数学建模的应用案例图解
https://blog.csdn.net/guestcode/article/details/127469191?spm=1001.2014.3001.5501
相关文章:

游戏高度可配置化:通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解
游戏高度可配置化:通数据引擎在模块化游戏开发中的应用构想图解 ygluu 码客 卢益贵 目录 一、前言 二、模块化与插件 1、常规模块化 2、插件式模块化(插件开发) 三、通用数据引擎理论与构成 1、名字系统(数据类型…...

CountDownLatch与CyclicBarrier原理剖析
1.CountDownLatch 1.1 什么是CountDownLatch CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之…...

NLP中的对话机器人——预训练基准模型
引言 本文是七月在线《NLP中的对话机器人》的视频笔记,主要介绍FAQ问答型聊天机器人的实现。 场景二 上篇文章中我们解决了给定一个问题和一些回答,从中找到最佳回答的任务。 在场景二中,我们来实现: 给定新问题,从…...
C语言学习及复习笔记-【14】C文件读写
14 C文件读写 14.1打开文件 您可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE包含了所有用来控制流的必要的信息。下面是这个函数调用的原型: FILE *fopen( const char…...
模拟退火算法优化灰色
clc; clear; close all; warning off; %% tic T01000; % 初始温度 Tend1e-3; % 终止温度 L200; % 各温度下的迭代次数(链长) q0.9; %降温速率 X[16.4700 96.1000 16.4700 94.4400 20.0900 92.5400 22.3900 93.3700 25.…...

Pandas怎么添加数据列删除列
Pandas怎么添加数据列 1、直接赋值 # 1、直接赋值df.loc[:, "最高气温"] df["最高气温"].str.replace("℃", "").astype("int32")df.loc[:, "最低气温"] df["最低气温"].str.replace("℃"…...

C++类和对象:构造函数和析构函数
目录 一. 类的六个默认成员函数 二. 构造函数 2.1 什么是构造函数 2.2 编译器自动生成的默认构造函数 2.3 构造函数的特性总结 三. 析构函数 3.1 什么是析构函数 3.2 编译器自动生成的析构函数 3.3 析构函数的特性总结 一. 类的六个默认成员函数 对于任意一个C类&…...

【Stata】从入门到精通.零基础小白必学的教程,一学就fei
视频教程移步:https://www.bilibili.com/video/BV1hK4y1d714/?p4&spm_id_frompageDriver&vd_sourcecc8074e9c81a225f214226065db53d32P3 第二讲 Stata处理数据全流程(上) P3 - 01:37内置数据 file example datasets使用…...
【RuoYi优化】调整JVM启动内存
📔 笔记介绍 大家好,千寻简笔记是一套全部开源的企业开发问题记录,毫无保留给个人及企业免费使用,我是作者星辰,笔记内容整理并发布,内容有误请指出,笔记源码已开源,前往Gitee搜索《chihiro-notes》,感谢您的阅读和关注。 作者各大平台直链: GitHub | Gitee | CSD…...
[架构模型]MVC模型详细介绍,并应用到unity中
简介: MVC模式是一种软件架构模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。MVC模式的目标是实现应用程序的松耦合,以便…...

?? JavaScript 双问号(空值合并运算符)
?? JavaScript 双问号(空值合并运算符) 一、简述 在网上浏览 JavaScript 代码时或者学习其他代码时,可能会发现有的表达式用了两个问号(??)如下所示: let username; console.log(username ?? "Guest"…...

作业2.25----通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作
1.通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作 例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输入led2off,开饭led2灯熄灭 5.例如在串口输入led…...

0101基础概念-图-数据结构和算法(Java)
文章目录1 图1.1 定义1.2 4种图模型2 无向图2.1 定义2.2 术语后记1 图 1.1 定义 图是一种非线性的数据结构,表示多对多的关系。 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E)…...

Linux基础命令和工具使用详解
Linux基础命令和工具使用详解一、grep搜索字符二、find查找文件三、ls 显示文件四、wc命令计算字数五、uptime机器启动时间负载六、ulimit用户资源七、curl http八、scp远程拷贝九、dos2unix和unix2dos十、sed 行处理10.1、简单模式10.2、替换模式十一、awk 列处理11.1、打印某…...

一个好的python文件可以有几种用途?
大家好鸭!我是小熊猫~ 这次来带大家浅浅回顾一点python小知识~ 源码资料电子书:点击此处跳转文末名片获取 python文件总共有两种用途: 一种是执行文件另一种是被当做模块导入 编写好的一个python文件可以有两种用途: 1. 脚本,…...

HDFS优化
单节点多块磁盘数据均衡 生成HDFS块均衡计划 hdfs diskbalancer -plan node1 执行均衡计划,node1.plan.json均衡计划文件 hdfs diskbalancer -execute node1.plan.json 查看当前均衡任务的执行情况 hdfs diskbalancer -query node1 取消均衡任务hdfs diskbalancer -cancel nod…...

行测-判断推理-图形推理-样式规律-黑白运算
黑白元素个数不同,优先考虑黑白运算白白白黑黑白黑白黑选A考试时,这种题不要先把规律全部推出来,再去做题,太慢了直接看要推的图,通过排除法选答案黑白元素个数不同,优先考虑黑白运算白白白黑黑白黑白黑选B…...

java+springboot+vue高校学生医疗保险管理系统
医保管理系统是对与职工健康息息相关的档案进行的系统化、自动化的管理,主要是对职工办理的医疗保险的管理,本系统能够很好的适应社会的需求,最大化的为城镇职工提供服务。医疗保险是国家社会保障体系的重要组成部分,也是社会保险…...
[已解决] AHK 映射 ESC 延迟 500 ms 的严重问题
问题描述 今天发现一个重大bug,我竟然用了一年多都不知道! CapsLock::Esc 我的 ahk 脚本将 capslock 映射为 esc,但这在vim环境中,估算响应 500ms。 也就说按下 caps 键,还要等一会,才进入normal模式 如果…...
QML state详解
1.state简介 changes(list<Change>):保存当前State下的多个Change对象,比如PropertyChanges、StateChangeScript、ParentChange等。 extend(string):表示该状态要在哪个State的基础上进行扩展,当一个…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...