排行榜和成就系统程序设计

设计目标

? 支持大用户
? 支持多排行榜

方案一(暂不述)
 
 统一排行榜/成就系统。为众多游戏提供排行榜和成就系统。很多游戏平台提供对应的API。

方案二
 
 游戏单独内置排行榜。API的设计建议参考方案一的方式,后续可以方便的升级改造成方案一。

瓶颈1:排序计算需求

问难题原因:排行榜,需要进行排序,如果不断的进行排序,计算资源将被耗尽。如果完全排序采用定时进行,那么势必会导致玩家无法即时看到自己的排名,特别是针对进入排行后的玩家无法带来很好的刺激。后续有必要的情况下可以自己优化排序算法。
 
 解决方案:不同刷新频率
 月,周,日,半天,五分钟;
 1分钟+触发+评估(假实时):
  触发1:当有玩家请求查看排行榜
  触发2:待处理数据队列达设定上限(通常1000)
  评估:超出热显示范围的数据进入评估体现,给出一个粗略的排名
 注意:评估体系用在所有刷新频率的排行榜上。

瓶颈2:大数据

问题原因:大数据
 众多的角色如果真的都参与排序,假设注册角色10万,那么针对10万级别的数据进行排序,先不考虑计算能力,磁盘的IO瓶颈和内存的大小瓶颈直接导致一次排序需要的时长超过秒级;如果加上排序周期设置太短,就会变得在不断的排序,结果就是导致计算资源和IO资源耗尽。

解决方案:减少排序数据
 在设计需求上通常查看的也就是前100或者200,所以超出范围外的采用评估体系。玩家在200以外的情况,这个时候,就可以采用简单的评估数据给他一个排名。如何更好的设计评估体系,后续介绍。

瓶颈3:资源竞争(计算资源/内存资源/IO资源)
 
 问题原因:多任务操作系统
 操作系统给每个进程/线程分配的计算需求是可以设定的。为了避免一个就弄成过多的消耗。当然我们正常情况下,也没必要设置进程的优先级。
  
 解决方案:单进程
 采用独立的进程来实现提供此项服务。使用内存数据避免使用磁盘IO。

瓶颈4:频繁提交

问题原因:程序实现
 游戏代码,在玩家排行榜依赖的数值发生改变后,马上进行提交,导致了众多无效的数据提交。
  
 解决方案:定期提交+下限设定
 在玩家没有查看排行榜请求的时候,游戏服务器采用定期(5分钟一次)提交给排行榜服务器,提交前进行下限数据比较,超过下限设定的才进入提交数据包(*注意:这个提交数据包可以打包,不要一个小包一个小包发送)。当有角色查看排行榜请求的时候,触发提交操作,并在排行榜服务器上进行一次排序操作。
  
 
实现注意点

1)CPU占用
 采用单独的进程来实现排行榜,半天以上的排行榜可以共享一个进程。1分钟+触发的榜单可以采用单独的一个进程。

2)计算数据减少
 在线角色在提交数据后,和排行榜的最后一名比较,如果小于值,那么直接丢弃。如果进入榜单,将此数据压入待处理队列。

3)评估体系
 就是超出200(设定值)榜单范围外,到底是多少名次,并不是真实的数据,而是根据预设的排名区间需要的值,进行范围估值。例如1000名需要1000点,2000名需要2000点,如果玩家是1500点,那么就直接估计为1500名,而不是跟其他角色进行真实排序,也许实际上我们1000~1500之间没有一个角色,他的排名应该是1000,甚至有可能是800。
 这个评估体系,最好建立学习模型,可以进行自动动态更新。

4)关于多线程
 排行榜这种进程,不要使用多线程来实现,因为产生的socket的连接数量是小的,来自我们自己的游戏服务器。所以windows下直接采用select模型就可以了。

综述

服务器系统的设计,尽量的简单化、单一化。这样带来的好处就是整个程序的规模小,代码量小,BUG修正、维护升级改造等工作都变得简单和容易控制。

排行榜和成就系统,拥有较高的通用普遍性,在人力资源和时间许可上尽量采用方案一的设计来实现。

排序的算法优略,非常有效的提高排序速度。建议采用跳跃式比较方式+下限比较剔除方式组合。而不是直接使用冒泡法排序。

其他
 
 如有不明白,或者发现其中的错误,可以QQ:447483932联系;或者电子邮件。如果有更好的建议或者想法也欢迎及时交流。

时间: 2024-10-10 13:31:22

排行榜和成就系统程序设计的相关文章

2014025689 《嵌入式系统程序设计》第五周学习总结

<嵌入式系统程序设计>第五周学习总结 一.6.5(标准I/O编程)主要涉及的函数及知识点 标准的I/O的三种缓冲存储:全缓冲.行缓冲.不带缓冲. 1. 全缓存:当填满标准I/O缓存后才进行实际的I/O操作 2. 行缓存:当输入或输出中遇到行结束符时,标准I/O库执行I/O操作 3. 不带缓存:标准I/O库不对字符进行缓冲 打开文件的三个标准函数:  fopen().fdopen()和 freopen(). -fopen()可以指定打开文件的路径和模式 函数原型:FILE * fopen(con

2014025665《嵌入式系统程序设计》第三、四周学习总结

第三周1.我们在带三周的嵌入式程序设计中学到了如何搭建嵌入式Linux交叉开发环境.其实主要是解决64位系统下如何安装32位程序的问题.①若联网:Syum install Id-Linux.so.2②若不联网:Srpm-ivhg libc.rpm nss.rpm还有测试arm-Linux-gcc是否编译等问题.第二节课学的是如何配置PATH将工具链加入到PATH中:方法一:$export PATH=$PATH;/usr/local/arm/gcc-3.4.6-glibc-2.3.6/bin方法二

2014025669《嵌入式系统程序设计》第三,四周学习总结

第三周1.我们在带三周的嵌入式程序设计中学到了如何搭建嵌入式Linux交叉开发环境.其实主要是解决64位系统下如何安装32位程序的问题.①若联网:Syum install Id-Linux.so.2②若不联网:Srpm-ivhg libc.rpm nss.rpm还有测试arm-Linux-gcc是否编译等问题.第二节课学的是如何配置PATH将工具链加入到PATH中:方法一:$export PATH=$PATH;/usr/local/arm/gcc-3.4.6-glibc-2.3.6/bin方法二

2014025681 《嵌入式系统程序设计》第七周学习总结

1.有名管道的概念 为何要提出有名管道的说法,目的是为了克服无名管道的不足之处: (1)无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围 (2)有名管道可以使互不相关的两个进程互相通信.有名管道可以通过路径名来指出,并且在文件系统中可见 为了这种有名管道,Linux中专门设立了一个专门的特殊文件系统--管道文件,以FIFO的文件形式存在于文件系统中,这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信,因此,通过FIFO不相关

2014025670《嵌入式系统程序设计》第三,四周学习总结

第三周我们在带三周的嵌入式程序设计中学到了如何搭建嵌入式Linux交叉开发环境.其实主要是解决64位系统下如何安装32位程序的问题. 进行实验楼实验的时候真的一定要特别细致,环环相扣,做了两次实验到最后都是不对的,就是因为其中部分的错误,后期还查找不到. 以后一定要特别注意.

2014025674(16) 《嵌入式系统程序设计》第五周学习总结

一.标准I/O的编程 fread与fwrite 1.fread是一个函数,是计算机程序中从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功返回 0. 函数原型为: size_t fread( void * buffer , size_t size , size_t count , FILE * stream ); 2.fwrite是一个C语言函数,向文件写入一个数据块.函数写入文件(可安全用于二进制文件).把 string 的内

2014025628《嵌入式系统程序设计》第七周学习总结

本次实验首先学习了有名管道--FIFO 1.1有名管道的介绍 无名管道,由于没有名字,只能用于亲缘关系的进程间通信..为了克服这个缺点,提出了有名管道(FIFO). FIFO不同于无名管道之处在于它提供了一个路径名与之关联,以FIFO的文件形式存在于文件系统中,这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信,因此,通过FIFO不相关的进程也能交换数据.值的注意的是,FIFO严格遵循先进先出(first in first out),对管道及F

2014025628《嵌入式系统程序设计》第五周学习总结

本周学习内容 1.fread函数和fwrite函数的每个参数的含义 fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出. (1)size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); 其中,ptr:指向保存结果的指针:size:每个数据类型的大小:count:数据的个数:stream:文件指针 函数返回读取数据的个数. (2)size_t fwrite

2014025660《嵌入式系统程序设计》第三、四周学习总结

先复制链接http://labfile.oss.aliyuncs.com/courses/811/gcc-3.4.6-glibc-2.3.6.tar.bz2 到实验窗口右侧工具栏的剪切板中,然后保存,并关闭剪切板窗口: wget +网址(http://labfile.oss.aliyuncs.com/courses/811/gcc-3.4.6-glibc-2.3.6.tar.bz2) 就可以通过网络连接,下载你想要的功能. 首先解压下载好的gcc-3.4.6-glibc-2.3.6.tar.bz