游戏排行榜的一种实现

游戏排行榜的一种实现

我是游戏公司小猿一只,做游戏服务器开发。最近公司准备招新的 C++ 程序员,我一般都会问到一个常见的功能,一万人排行榜怎么实现。

得到的答案很多,比如 “1.直接从数据库中读取;2.用 hash 表;3.用一个环形数组;4.这个问题我要仔细考虑一下。”

对于这些答案我是不满意的,因为从事游戏逻辑开发的人,排行榜功能是一个基础功能,出于“优秀”C++ 程序员的本能,应该细想怎样实现之。对这个功能如果仅仅停留在表面,心理大概推测用什么数据结构,在关键性问题上支支吾吾,我可能不大愿意和这样的同事共事。我并非是一帮子打死所有不能在十分钟内给出好答案的人,而是想得到一个“正确的本能反应”,考虑的方向上是正确的即可。

给出一个我认为可行而且性能较好的实现方法。

排行榜这种功能,基础容器肯定是数组,vector 。因为排行榜要支持一个特性就是“根据名次找到人”。其他的容器并不支持这样的特性。

vector 中保存的是 Player 指针,和排行用到的 key,(比如等级排行榜的 key 是“等级”“0xffffffff - 时间戳“的组合)。

Player 结构中保存有排行榜名次。

    排行榜                               玩家数据

    第一名  key1, Player * p1            p1 {myrank : 1, ...}
    第二名  key2, Player * p2            p2 {myrank : 2, ...}
    第三名  key3, Player * p3            p3 {myrank : 3, ...}
    第四名  key4, Player * p4            p4 {myrank : 4, ...}

服务器启动时,将前一万名整理好,无论用快速排序、堆排序、插入排序、还是冒泡排序都无所谓。

游戏中,玩家数据有变化需要更新排行榜时,根据 myrank 找到玩家对应的榜位置,依次向上做冒泡比较,移动该玩家数据的同时,更新被移动的玩家 myrank 即可。这样就得到了一个新的排行榜。

极端情况不大可能存在,最后一名的玩家不可能跳跃性跳到第一名,而是渐渐的向上挪动,所以采用冒泡的方式并不会影响性能。

时间: 2024-11-04 17:04:20

游戏排行榜的一种实现的相关文章

哪种机械键盘更适合打游戏? 机械键盘5种常用机械轴详细介绍

哪种机械键盘更适合打游戏? 机械键盘5种常用机械轴详细介绍 机械键盘 12-08 (4)青轴 最具特点的就是青轴,青轴一般是打字员的梦想,很少用于游戏,不过是本人的最爱,特点是只有当声音响起的时候按键才被触发,因此打字的时候噼里啪啦,无论是指尖还是心理上都得到了极大满足. 但是其"机动性"打字和双击时效果并不是很好,因为触底比"触发"要高,这款特别适合输入文字,但是要注意噪音很大,但这也是我喜欢MX青轴的原因之一. (5)白轴 最后说一下白轴,目前白轴基本已经停产了

放松一下】北美小游戏排行榜TOP10——“点击英雄”

大家平时工作都比较忙,在这里推荐一款游戏让大家放松一下,让你体验到指数爆炸般挣钱的快感. 北美小游戏排行榜TOP10--"点击英雄" 简要说明: 游戏可以挂机,关闭电脑,游戏也会自动赚钱(游戏金币) 操作简单,鼠标点击怪物,升级即可 全球点到爆根本停不下来! 游戏地址:http://bbs.phpthinking.com/forum.php?mod=viewthread&tid=135 游戏截图: 快来一起玩到爆吧!

基于Laya游戏引擎实现微信小游戏排行榜

我们都知道,微信小游戏和小程序目前风头十足,很多公司都逐渐增加了相关业务线来迅速推广自己的产品和抢占用户群.说到微信小游戏,就不得不提到排行榜这个功能,就目前游戏行业,似乎都离不开排行榜这个重要功能,用户很大一部分留存都是依仗这个看似不起眼的模块.那么,微信小游戏中具体该如何借助laya引擎实现排行榜这个功能呢?我们先来看一下最终的效果图: 按照微信官方的说法,如果我们要使用微信官方提供的好友关系链的数据,我们就不能直接在项目中绘制排行榜,我们需要借助于开放域来绘制排行榜: ? 如果想要展示通过

【Redis+PHP】利用redis的zset实现游戏排行榜功能

1.需求:①完成游戏排行榜实时刷新 ②查看当前用户的排名.积分 2.参考文章:https://www.cnblogs.com/clubs/p/11691580.html (博主强推) https://www.cnblogs.com/anny-1980/p/4583806.html  (Redis的ZSET有序集合常用语法) 3.实现原理:不使用MySQL进行存储,改用redis的zset实现,单机支持百万级并发,数据热更新 4.附录我自己封装好的一个laravel5的Redis排行榜类: <?p

游戏排行榜算法设计实现比较

以前在音乐做过一些实时投票,积分排名:单曲.专辑等排行榜:游戏中也有类似的战斗力排行:SNS的游戏又有好友排行等,对于此类的排行算法在此做个总结. 需求背景: 查看前top N的排名用户 查看自己的排名 用户积分变更后,排名及时更新 方案一: 利用MySQL来实现,存放一张用户积分表user_score,结构如下: 取前top N,自己的排名都可以通过简单的sql语句搞定. 算法简单,利用sql的功能,不需要其他复杂逻辑,对于数据量比较少.性能要求不高,可以使用.但是对于海量数据,性能是无法接受

unity访问合买平台搭建其他游戏对象的四种方式

一.通过属性合买平台搭建论坛:haozbbs.com Q1446595067 查看器指定参数访问其他游戏对象 将要旋转的物体拖到属性栏上的obj,运行就可以看到cube旋转 二.通过父子关系的相应函数访问其他游戏对象 当前对象是cylinder,其子对象是cube,该函数实现对其子对象的旋转 通过该函数实现对其父目录下的对象旋转,父对象为Cube 三.通过名字或者标签获取游戏对象 1.通过名字获取游戏对象 2.通过游戏对象的标签获取游戏对象 前提必须为要获取的游戏对象加上"cube"标

MySQL 游戏排行榜

今天在坛子上看到了,顺便写下来. 有两种方法: 1.效率不高,因为有子查询.但是简洁.而且我对SOCRES表做了INDEX.所以性能上也差不了多少. mysql> show create table scores\G*************************** 1. row ***************************       Table: scoresCreate Table: CREATE TABLE `scores` (  `id` int(11) NOT NULL

google play SDK 游戏排行榜的接入分享

1.第一步 添加配置文件  <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@strin

豌豆荚游戏排行榜爬虫源码

var configs = { domains: ["apps.wandoujia.com"], scanUrls: ["http://apps.wandoujia.com/api/v1/apps?type=weeklytopgame&max=12&start=0"], contentUrlRegexes: ["http://www\\.wandoujia\\.com/apps/.*"], helperUrlRegexes: [&