数据表(三) - 多语言的实现

news2025/2/22 1:09:30

前文介绍了关于数据表的几种形式,以及如何让数据表运用更加简单高效,这篇我们来讲讲多语言在数据表中的实现方式。

游戏项目中文字显示本身就是件比较头疼的事,再加上多语言,更多的问题将待需解决。很多时候项目起初,文本是写进代码里的,但是当项目中后期,文字又需要由策划来修改和添加,这个导致了大量的程序员的重复工作。所以文字的数据还是放在表里比较好些,就让该考虑文字内容的人去考虑文字内容吧,我们需要把这块工作分离出来,完全交给独立的人处理。

===

为了实现这个独立模块,我们需要多数据配置表的导出做些规则的设计。

我们来分析下,一般文字放在Excel表里一般都会以Key-Value形式存放,就比如,Key为”RoleName”,Value为”角色名字”,或者Key为1101,Value为”好友分享”等。

这种Key-Value形式,一般会以Int-String形式存在,或者string-string形式存在。

我们先来讨论下这两种形式。

你从数据表里获取文字的方式,你是喜欢以整数为键值还是字符串形式呢?

用整数形式获取就会像这样的样式存在

string content = GetTextString(12)

这种形式,看起来不是很美观,对于其他程序员来说,或者我们过了几周再回头来看时,我们怎么知道12代表什么?只能猜,这个12可能是某个字符串。随着代码的增多文字量的增多,对应数字Key也增多,我们很难识别这句话是代表什么,调试起来会很麻烦。一个项目一般会有10-30万行代码,到处都是这种形式的字符串获取方式,任何人看起来都会崩溃。维护性太差,校验检查难度太大,效率太低。

如果用字符串形式获取

	string content = GetTextString(“FightWin”)

这种形式,会好些吗?看起来似乎好了些,至少我知道了我获取的大概是什么内容的字符串。不过任然有问题,你用一个字符串去获取另一个字符串,那岂不是双份内存,GC垃圾回收的消耗也会同时增加。原本只需要存储一个字符串就够了,现在要存两个,就因为用了键值字符串去获取内容字符串。

当文字内容很多时,我们可能需要用很长的字符串去获取另一个很长的内容,比如用”BattleSceneFightAllianceWin” 去取”联盟战胜利了”,这种形式的字符串换字符串,导致文字数据表变得很大,内存占用量也加大了很多,因为你要另外存一份常量的字符串。

那么我们来想个更好的方法吧,我们既要用简洁的数字去代表文字,又要让键值看起来形象。怎么办?

我们策略是生成一个类,用变量的形式去记录文字的ID,在文字表生成数据表,同时生成数据定义类,使用变量去代表数字。我们依然在表里填字符串对应字符串,比如上面提到的”BattleSceneFightAllianceWin” 对应”联盟战胜利了”,在导出xls数据文件时,生成一个类文件,专门把Key值按次序写进类中当变量。如下

ClassTextKey{
	publicconstBattleSceneFightAllianceWin=1;
	publicconstBattleSceneFightAllianceLose=2;}

再把“联盟战胜利了”这种文本数据按次序,依次写入数据文件。这样就可以一一对应了。也就是,第一个变量对应第一个文字,第二个变量对应第二个文字。获取文本的方式改为了

string content = GetTextString(TextKey.BattleSceneFightAllianceWin)

这时文本数据的排列是如下

联盟战胜利了
联盟战失败了
…

而程序变量生成后为如下:

ClassTextKey{
	BattleSceneFightAllianceWin=1;
	BattleSceneFightAllianceLose=2;}

文字与变量的数字依次对应,既解决了用数字做Key不够形象的问题,又解决了字符串做Key太多冗余的问题。

那么多语言部分怎么处理?

简单的处理方式就是做多个表,每个表一个语言。获取方式可以根据不同语言来获取,如下

string content = GetTextString(”win”,Language.Chinese)

不过每次增加删除都要一一对应,否则一个语言没有改就会报错,调试起来非常麻烦。

优化下合并数据表,把一个表里的一个Key对应多个语言的文字内容写在一个表里面。如下

键值  中文  英文  日文   韩文
Win   赢了  Win  勝った 이기다

这样就有了规则,即第2列是中文,第3列是英文,第4列是日文,第5列是韩文,依次类推。

接口没变,任然是

string content = GetTextString(”win”,Language.Chinese)

但是文字表在编辑时就更加的形象,方便,快捷了。

做到这里多语言部分就完美了。策划设计人员和运营人员只要关心文字语言表里内容和键值是否正确就可以了,其他都可以完全交给程序员处理了。

关于分散读取,和集中读取,以及预读取部分,我们也在这里做个讲解。

假如把所有表都集中起来成一个表,那么游戏在加载数据表就需要一次集中使用CPU去处理,导致游戏有时会卡顿现象,不合理。我们需要让游戏表现的尽可能的顺畅。

所以分散读取比较可取,各个表数据都自己管自己读取吧,这样就CPU就分散开来了,不会一下子对CPU的需求量很大。而且在读取数据表时,要按需读取,而不是一开始就初始化,这样的话跟集中在一起就没有区别了。

至于预读取,其实和提前集中读取没有区别,关键是如何利用空挡时间进行预读取。比如在Loading等待时读取一部分数据,这样在等待时也不会浪费CPU。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang-GMP模型

写在前面 Go 为了自身 goroutine 执行和调度的效率,自身在 runtime 中实现了一套 goroutine 的调度器,下面通过一段简单的代码展示一下 Go 应用程序在运行时的 goroutine,方便大家更好的理解。 The Go scheduler is part of the Go runtime,…

华为机试题:HJ92 在字符串中找出连续最长的数字串(python)

文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

C++语法规则2(C++面向对象)

继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的数据成员和成…

SpringBoot修改启动图标(详细步骤)

目录 一、介绍 二、操作步骤 三、介绍Java学习(题外话) 四、关于基础知识 一、介绍 修改图标就是在资源加载目录(resources)下放一个banner.txt文件。这样运行加载的时候就会扫描到这个文件,然后启动的时候就会显…

vue -- 自定义指令钩子函数补充 自定义过滤器filter参数

自定义指令补充 自定义指令通过钩子函数的形式来实现自定义的功能 这里是几个常用的钩子函数以及它的方法: bind:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置。 inserted:被绑定元素插…

Docker Nginx 反向代理

最近在系统性梳理网关的知识,其中网关的的功能有一个是代理,正好咱们常用的Nginx也具备次功能,今天正好使用Nginx实现一下反向代理,与后面网关的代理做一个对比,因为我使用的docker安装的Nginx,与直接部署N…

web worker的基本使用案例

文件目录如下 代码按照顺序分别如下 webworker.html <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewpo…

C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror()

C语言函数&#xff1a; 字符串函数及模拟实现strtok()、strstr()、strerror() strstr()函数: 作用&#xff1a;字符串查找。在一串字符串中&#xff0c;查找另一串字符串是否存在。 形参: str2在str1中寻找。返回值是char*的指针 原理&#xff1a;如果在str1中找到了str2&…

为什么这几年参加PMP考试的人越来越多?

PMP认证从国外引进大陆这么多年了&#xff0c;其火热程度依然不减&#xff0c;我个人认为是取决于市场的运作和“游戏规则”&#xff08;岗位招聘和项目招标需要&#xff09;。PMP含金量不算高&#xff0c;更多的是“敲门砖”作用&#xff0c;项目管理岗位的门槛&#xff0c;当…

MySQL日志审计和分析

审核数据库活动是加强数据库安全性的重要组成部分。这涉及识别漏洞&#xff0c;例如默认或弱登录凭据、过多的用户和组权限以及未修补的数据库。攻击者利用这些漏洞来实现自己的目标&#xff0c;如权限提升、SQL 注入和 DoS 攻击。因此&#xff0c;出于安全性和合规性原因&…

源码分析spring如和对@Component注解进行BeanDefinition注册的

Spring ioc主要职责为依赖进行处理&#xff08;依赖注入、依赖查找&#xff09;、容器以及托管的(java bean、资源配置、事件)资源声明周期管理&#xff1b;在ioc容器启动对元信息进行读取&#xff08;比如xml bean注解等&#xff09;、事件管理、国际化等处理&#xff1b;首先…

SPI读写SD卡速度有多快?

SD卡是一个嵌入式中非常常用的外设&#xff0c;可以用于存储一些大容量的数据。但用单片机读写SD卡速度一般都有限&#xff08;对于高速SD卡&#xff0c;主要是受限于单片机本身的接口速度&#xff09;&#xff0c;在高速、实时数据存储时可能会有影响。但具体速度可以达到多少…

Spark RDD的设计与运行原理

一、Spark RDD概念 一个RDD就是一个分布式对象集合&#xff0c;本质上是一个只读的分区记录集合&#xff0c;每个RDD可以分成多个分区&#xff0c;每个分区就是一个数据集片段&#xff0c;并且一个RDD的不同分区可以被保存到集群中不同的节点上&#xff0c;从而可以在集群中的…

Could not resolve dependencies for project

maven 打包Could not resolve dependencies for project和无效的目标发行版: 1.8 1.maven 打包Could not resolve dependencies for project 最近项目上使用的是idea ide的多模块话&#xff0c;需要模块之间的依赖&#xff0c;比如说系统管理模块依赖授权模块进行认证和授权&a…

聊聊关于分类和分割的损失函数:nn.CrossEntropyLoss()

目录 1. nn.CrossEntropyLoss() 2. 多分类中 nn.CrossEntropyLoss() 的应用 3. 分割中 nn.CrossEntropyLoss() 的应用 3.1 测试文件 3.2 输出可视化 3.3 softmax 3.4 log 3.5 CrossEntropyLoss 1. nn.CrossEntropyLoss() 分类中&#xff0c;经常用 nn.CrossEntropyL…

.NET Core Api使用Folder(文件夹)形式发布并指定监听端口

分为以下几个步骤 1. 先安装SDK及运行环境, 无需安装IIS, 因为他不在IIS上运行 环境下载路径, 我用的是.NET 7.0, 可以根据自己的版本下载: 下载 .NET 7.0 SDK (v7.0.201) - Windows x64 Installer 下载.NET运行环境 下载后安装.直接下一步..安装即可 2. 配置发布设置 (…

Nginx服务优化与防盗链

目录 1.隐藏nginx版本号 1.查看版本号 2.隐藏版本信息 2.修改用户与组 3.缓存时间 4.日志分割 5.连接超时 6.更改进程数 7.网页压缩 8.配置防盗链 1.配置web源主机&#xff08;192.168.156.10 www.lhf.com&#xff09; 2.配置域名映射关系 3.配置盗链主机 &#xff0…

python实现波士顿房价预测---(2)

计算梯度 继续上一篇的内容python实现波士顿房价预测—(1)。 梯度计算公式中引入计算因子12\frac{1}{2}21​&#xff0c;为了计算更加简洁。 L12N∑i1N(yi−zi)2L\frac{1}{2N}\sum_{i1}^{N}(y_i - z_i)^2L2N1​∑i1N​(yi​−zi​)2 其中ziz_izi​是模型对于第i个样本的预测值…

【halcon】轮廓拟合相关函数

涉及函数 edges_sub_pix 寻找边缘 edges_sub_pix (Image, Edges, canny, 1, 10, 20) 后面三个参数&#xff0c;越小&#xff0c;找到的细节越多。这个是对应录波器为canny时。 canny滤波器用的最多。 segment_contours_xld 将连续的轮廓进行分段&#xff0c;按圆弧或者执…

软件测试13

Linux命令 1.pwd&#xff1a;查看当前所在的路径位置 2.ls&#xff1a;查看当前路径下有哪些文件 3.cd&#xff1a;切换路径 4.touch&#xff1a;创建普通文件&#xff0c;可以创建单文件&#xff0c;也可以创建多文件&#xff08;touch a&#xff0c;touch b c&#xff09; 5…