手游匹配服务器设计总结

设计实现了一个手游匹配服务器,在这里记录一下思路与优化点,举一反三: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 →

Lua与C交互简明教程

lua
Lua是一个由标准C编写的轻量级脚本语言,很容易被C++/C调
用,反过来也可以调用C++/C的函数。作用是可以作为扩展脚本与
配置脚本,优势是速度快,支持动态改变。

 

Read More →

“TTT之课程设计及魅力讲师”学员总结

TTT – Training the Trainer to Train

有幸参与公司“TTT之课程设计及魅力讲师”课程的培训,周末10:00 ~ 18:00,收货颇多。一方面是因为讲师的精彩传授,一方面也是自己出任公司讲师以来,有一些授课方便的疑惑得以解决。以下以自己角度(技术类课程)总结一些重要点。

Read More →

在Linux终端使用C语言来玩Flappybird

        世界上有一种鸟是没有脚的,它只能不停的飞呀飞。累了,就睡在风里。它一生只能落地一次,就是它死的时候……
                                                                    ——对Flappybird的说法

Flappybird游戏,相信从事互联网都知道,毫无征兆地突然之间一夜火起来,然后迅速的被抄袭改编……近期自己使用C语言在linux终端下模仿制作Flappybird(真正像素级:D),记录一下整个实现过程的思路,代码附在文末。

Read More →

Diablo背包功能C++实现

Diablo – 暗黑破坏神暴雪娱乐(Blizzard Entertainment)旗下系列品牌。

一些题外话

1998年,笔者接触到了Diablo 1,被其游戏性折服;2002年暑假,与小伙伴联机Diablo 2为了一件装备的归属吵来吵去;2012年,没有第一时间买到Diablo 3亚洲服务器的激活码,最后只能在奸商的抬价中以近1.5倍的原价入手。

经历了Diablo 1~3,可以很明显感觉到游戏系统的丰富、游戏画质的提升、游戏历史的延展,但是如果有人问我:提起Diablo你首先联想到的会是什么?我会回答:背包与装备系统。

Read More →

二级指针的作用分析

二级指针 – pointer to pointer

简单举例说明下这是一个什么神奇的东西,首先定义

const char *c = "hello";

我们虚拟展示一块内存(地址值与地址分配,包括机器位数都是人为虚拟设置的)

1

Read More →

深入理解C/C++形参、传指针、传引用

一则经典的问题:

//为了突出程序主要目的,忽略了malloc()分配是否成功检查与free()相关逻辑
//这是第一段代码
struct test {
    int num;
};

void change_value(struct test *out)
{
    struct test *in = (struct test *)malloc(sizeof(struct test));
    in->num = 100;
    out = in;
    printf("in num:%d\n",out->num);
}

int main()
{
    struct test *out = (struct test *)malloc(sizeof(struct test));
    out->num = 0;

    change_value(out);

    printf("out num:%d\n",out->num);
    return 0;
}

Read More →