当前位置:网站首页>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游戏排行榜制作与优化分享就到这里,
边栏推荐
猜你喜欢

【UiPath2022+C#】UiPath If条件语句

Jupyter notebook选择不同的Anaconda环境作为内核运行

关于存储IOPS你必须了解的概念

PoE视频监控解决方案

C语言—三子棋的实现

【UiPath2022+C#】UiPath数据类型

【ts】typescript高阶:模版字面量类型
![[Kaggle project actual combat record] Steps and ideas sharing of a picture classification project - taking leaf classification as an example (using Pytorch)](/img/7d/7f1301c30034f1c247d41f04c40244.png)
[Kaggle project actual combat record] Steps and ideas sharing of a picture classification project - taking leaf classification as an example (using Pytorch)

Redis设计与实现(第一部分):数据结构与对象

三、自动配置源码分析
随机推荐
将一句话的单词进行倒置(C语言纯代码)
游戏引擎除了开发游戏还能做什么?
七、请求处理——Map、Model类型参数处理原理
【ts】typescript高阶:模版字面量类型
对象比较
CAN、CAN FD
原型版本管理
一个小时教你如何掌握ts基础
C语言联合体union占用空间大小问题
CVPR 2020 - 频谱正则化
【ts】typeScript高阶:any和unknown
三、自动配置源码分析
[Database and SQL study notes] 10. (T-SQL language) functions, stored procedures, triggers
Comparison and summary of Tensorflow2 and Pytorch in terms of basic operations of tensor Tensor
You should write like this
网络信息安全运营方法论 (上)
教你如何封装功能组件和页面组件
二、自动配置之底层注解
六、请求处理—获取请求参数系列注解是怎样工作的?
每日一题-删除链表的倒数第 N 个结点-0718