手游匹配服务器设计总结

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

Empire Problem

上周以前大学同学分享探讨了一个编程问题,觉得还是挺有典型意义的(解法与题意理解上)。故在此记录下。

Problem
The empire has a capitol and a number of cities. Some cities are connected to other cities. A route connecting two cities can transport a message in both directions. All cities are reachable using some path from the capitol city. The connections among all cities are described in an adjacency matrix with the format shown below. At the start, a message is sent from the capitol city to all other cities, and we want to know what’s the minimal time for a message to spread out from the capitol to the whole empire.
Read More →