当前位置:网站首页>Unity常用模块设计 : Unity游戏排行榜的制作与优化
Unity常用模块设计 : Unity游戏排行榜的制作与优化
2022-08-05 05:17:00 【博毅创为游戏圈】
游戏排行榜是一个很重要的功能,在弱联网的单机游戏与网络游戏中排行榜都是非常重要的,今天我们来详细的讲解游戏排行榜的制作方案,主要有4个点:
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀
(1) 游戏排行榜排序算法核心算法实现;
(2) 游戏排行服务器如何制作;
(3) Unity客户端如何对接与请求排行榜数据;
(4) Unity如何优化排行榜UI性能;
游戏排行榜排序核心算法的实现
排序在游戏开发中是一种十分重要的算法,特别是对于海量的数据,高效的排序算法,是核心与关键,排行榜也是一样的,我们要对全服所有的排行榜的玩家做排序,每次玩家的数据有变化,就会引发排序,最终让我们把排行榜的排名拉取下来。排序算法的性能非常关键点,主流的排序算法都是非常成熟的,对于海量的服务器数据而言,排序算法也有核心的实现模块,这里我们是基于redis 来做排序,redis提供了一个有序列表的功能,内部实现了海量数据的排序,我们只要把数据提交给redis的有序集合, 然后redis就会给我们排序好,我们就可以拉排行榜前面的数据给客户端。排行榜的排序的核心算法全部由redis实现,我们直接用就可以了。
redis 添加一条记录: zadd table 权重 value, 往有序集合table里面添加一个带权重的数据,redis就会更具这个权重排序。
redis 获取排行榜的数据: zrang table start stop, 从有序集合中拉取从[start, stop]段的数据。还有反向排序等,原理一样。
排行榜服务器如何制作
有了redis server来帮我们做排行榜内核,为什么我们还有搞一个排行榜服务器呢?不直接让客户端直接操作我们服务端的redis server呢?这个主要是有几个因素:
a; 每个游戏分区,可能不一样,所以我们用一个排行榜服务器来管理这个概念;
b: 与客户端通讯的安全情况非常复杂,我们不要把核心数据库直接暴漏给客户端。比如,如果直接把redis命令开放给客户段,要是有个外挂,不断的来发起刷排行榜的命令,这样我们的排行服务可能就会受影响,如果我们有个服务器,就可以来封ip地址等手段来处理。要是有个外挂,不断发一些不标准的数据,没有外面的服务器验证,这样也会导致排行榜乱掉。
c: 如果排序受到一些性能影响,我们可以让排序服务器保存榜单的最小的分数,如果分数小于这个最小分数,那么新进来的分数就可以不用参与排行,来解决排行性能问题。
d: redis有序集合里面存放的可能是能表示玩家的唯一UID,客户端显示排行榜,可能还要其它的数据,比如用户头像等,所以需要一个服务器来根据UID来组合出客户端所需要的数据信息。
一般我们做游戏排行榜服务器会自己写一个服务端程序,这个服务端程序,作为redis-server的客户端来控制redis 有序集合的核心操作。让redis来帮助完成排序核心。然后游戏排行榜服务器就做好策略,比如最低权重机制,如果权重低于当前最小的权重,就不上榜,不上榜就不会有性能排序的开销等。
排行榜服务器提供协议接口给客户端使用,客户端根据协议来给排行榜服务器发数据,排行榜服务器检查验证游戏数据的真实性与安全性后再更新到redis server。
Unity如何优化排行榜UI性能
Unity如何要如何展示有200项排行榜数据的榜单,性能才会好呢?我们先来看一基本的排行榜展示的信息与数据内容,来简单分析一下,这个是某游戏的排行榜,如图所示:

我们从排行榜中截取一个排行榜记录来分析一下,它的UI组成。如下图:

UI元素组成:
1: 要显示每一项数据的背景UI节点
2: 要显示排行数字的UI节点;
3: 显示玩家头像的一个或几个UI,还有mask等;
4: 显示玩家的等级节点;
5: 显示玩家的昵称节点;
6: 显示玩家的分数节点;
7: 显示一个玩家的礼物按钮节点,
从上面分析来看,每个排行榜的记录显示出来需要10~15个UI节点。
如果我这个排行榜要显示100项数据,那么我需要创建1500个UI节点出来,这样性能肯定差。那么我们如何优化一个游戏排行榜或大量数据的滚动列表呢?
分析了可能的问题后,我们一般考虑从一下几个方面找手优化:
a: 减少显示的UI节点的数目,提升渲染性能。比如100项数据,其实我们滚动列表中能看到的也就只有10多项,所以我们可以做好数据分页,来做动态数据加载显示,比如每页10项显示的话,我们可以做30项,这样就可以做到动态加载,同时UI节点的数目可控。
b: 节约drawcall,尽量让这些大量的UI节点能在一个或少数几个drawcall下完成,比如我们把排行榜相关的资源都做到一个图集,这样增加Uidrrawcall合并的可能,同时我们做排行榜设计的时候,不要让文字label打乱drawcall 合批,UGUI会对文字渲染合批做优化,在不影响渲染效果的情况下调整文字的渲染顺序,把文字放一起渲染,能获得最小的drawcall, 这样,我们在组织界面设计的时候,就不要让图片盖到文字上,如果有某一样的图片盖到文字上,那么就会使得这个文字Label无法参与所有文字的合批,而这个文字Label还会打乱图片渲染的合批。
C: 对于UGUI来说,可以把排行榜都部署到一个根节点下,根节点搞一个UGUI的Canvas组件,减少大量合并计算的开销。
本节的Unity游戏排行榜制作与优化分享就到这里,
边栏推荐
- LeetCode刷题之第33题
- [Kaggle project actual combat record] Steps and ideas sharing of a picture classification project - taking leaf classification as an example (using Pytorch)
- LeetCode刷题之第1024题
- Redis集群(docker版)——从原理到实战超详细
- 【Promise高级用法】实现并行和串行API
- 【UiPath2022+C#】UiPath数据类型
- C语言查看大小端(纯代码)
- (C语言)计算结构体大小——结构体内存对齐
- MSRA proposes extreme masking model ExtreMA for learning instances and distributed visual representations
- MySQL主从复制—有手就能学会的MySQL集群搭建教程
猜你喜欢
随机推荐
Jupyter notebook选择不同的Anaconda环境作为内核运行
【UiPath2022+C#】UiPath If条件语句
IT系统运行维护方法及策略
十一、拦截器运行原理
dataframe 常用操作
《基于机器视觉的输电线路交叉点在线测量方法及技术方案》论文笔记
GIS面试问题
LeetCode刷题之第746题
CAN、CAN FD
手把手教你搭建小程序
常见的 PoE 错误和解决方案
八、响应处理——ReturnValueHandler匹配返回值处理器并处理返回值原理解析
【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
MySQL主从复制—有手就能学会的MySQL集群搭建教程
MSRA proposes extreme masking model ExtreMA for learning instances and distributed visual representations
网络ID,广播地址,掩码位数计算
LeetCode刷题之第23题
八、请求处理之自定义类型参数绑定原理
Facial Motion Capture 调研
LeetCode刷题之第55题






![[Database and SQL study notes] 8. Views in SQL](/img/22/82f91388f06ef4f9986bf1e90800f7.png)
![[Database and SQL study notes] 10. (T-SQL language) functions, stored procedures, triggers](/img/b9/06b90160c962a25a3cc44731afb6dc.png)

