Anti-Cheat – 实现一种检查内存被修改的方法

这个Anti-Cheat方法为了解决什么问题?

一般来说,一款网页\手机游戏纯靠客户端来解决反作弊(Anti-Cheat)几乎是不可能的。在这种情形下,页游\手游客户端(后文均称游戏客户端)可以利用一些手段来增加作弊\破解人员的成本,包括但不限于:代码加密,代码混淆,隐藏明文,内存混淆(加密)……

这个方法主要是避免\检测出类似CE工具对客户端内存进行恶劣修改达到关键数据变更的行为,属于上面提到的内存混淆(加密)类。

本文建立在所有源码未被对方知晓的情况下进行操作……

Read More →

利用线性同余法产生随机数进行同步计算

随机数使用场景

主要适用于伪随机环境下的同步计算:

场景一:服务端要校验客户端数据,服务端和客户端公用一个随机数种子,使每一步产生相同的随机数,服务端校验客户端产生的结果;

场景二:不同服务器环境下对于相同种子的伪随机同步;

场景三:…… Read More →

基于侵入式链表的时间轮定时器实现

游戏服务器一般都会需要这样一种功能 – 在某个确定的时间点干某件特定的事情,例如:某个排行需要在每月第一天进行结算,某个比赛需要在下周六中午12:00准时通知服务器所有玩家比赛开始……当然,这种功能不局限于游戏服务器,其他类型服务器或多或少也有包含。我们称之这个功能为定时器功能或者定时器组件

这里实现了一种用C++模板机制实现的秒级(比较容易改写成毫秒级)定时器,核心算法使用的是时间轮(Timing-Wheel),辅助数据结构使用的是侵入式链表(Intrusive-List)。首先简单介绍一些基本概念。

Read More →

Boost无锁队列分析与实现

在多线程编程环境中,有时为了保证数据处理的效率会使用一些无锁(Lockfree)的数据结构,例如无锁队列(Lockfree Queue)、无锁栈(Lockfree Stack)、环形缓冲(Ring Buffer)、无锁哈希(Lockfree Hash)之类。本文分析Boost库(V1.57.0)中的无锁队列,并将其从复杂的Boost数据结构中剥离出来单独实现。

boost v1.57.0下载

改写的源码

Read More →

手游匹配服务器设计总结

设计实现了一个手游匹配服务器,在这里记录一下思路与优化点,举一反三:D

设计的总体思路参照目前主流游戏做法(比如DOTA2),点击匹配->等待->结果弹出->确认或者取消->进入游戏或者取消进入。因为手游的特殊性,为了减少对客户端的依赖变成:点击匹配->等待->进入游戏或者匹配超时(匹配超时在客户端网络不好的情况下发生)。

总体的设计原则有以下几点:

一、尽量减少对客户端的逻辑依赖。

二、整体服务支持平行扩容,防单点,防雪崩。

三、匹配的合理性与公平性。

Read More →

一致性哈希算法(consistent hash)的黑科技

这是一个来自Google的零内存消耗、均匀、快速、简洁的一致性哈希算法 – Jump Consistent Hash

算法的作者是Google的John Lamping和Eric Veach,论文原文链接 – 点这里,一些讨论 – 点这里

整篇文章基于对论文原文的翻译,掺杂自己的一些思想理解,以及对该算法代码的适应场景分析修改,水平有限,难免有偏差:D

Read More →

Twitter-Snowflake,64位自增ID算法详解

Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同。

Snowflake算法核心

时间戳工作机器id序列号组合在一起。

 

snowflake-64bit

 

除了最高位bit标记为不可用以外,其余三组bit占位均可浮动,看具体的业务需求而定。默认情况下41bit的时间戳可以支持该算法使用到2082年,10bit的工作机器id可以支持1023台机器,序列号支持1毫秒产生4095个自增序列id。下文会具体分析。

Read More →