skynet 中定时器的设计

距离上一次阅读 skynet 的源码已经有 4 年之久了,那是我第一次阅读如此优雅的代码,以至于我从 Java 直接转到了 skynet 开发。 前几个月有朋友问我如何实现 timer 的,我只简单的回答了下用了分级来实现的。 至于是如何分级的,我今天下午重新阅读了代码把思路整理了下。 说实话,通过看代码来推断设计思路远不如先看设计思路再阅读代码来的清晰。

首先需要说明的是 skynet 的时间精度是厘秒,即 1s = 100 cs。 以及下面会混用定时器引擎和添加进来的定时器任务,我都统称为定时器,请根据上下文进行分辨。 并且此文中队列和链表是一样的,链表是队列的具体实现方式。

0x01 数据结构定义

下面先解释 timer 的分级结构,然后再介绍如何添加定时器,以及定时器的 update 。

以下是 timer 的结构体:

#define TIME_NEAR_SHIFT 8
#define TIME_NEAR (1 << TIME_NEAR_SHIF

阅读全文 “skynet 中定时器的设计”

我对编程的想法

大半年没有写任何东西了,这段时间发生了很多事情,对编程的想法也在发生着改变。以前是怕编程,怀疑自己不是编程的那块料,毕竟我从来没有做出过任何值得称道的项目。内心深处因为大学没有扎扎实实学过任何一门编程的课,总有那么一个障碍。看到这些复杂的项目觉得自己肯定写不出来,也搞不定。

改变是从学习完 C++ 基本的内容开始的。在学习 C++ 之前,我觉得这个东西极其的神圣,学会了肯定就什么都会了,对于会 C++ 的人有一种发自内心的觉得不可超越。直到学习完之后才发现,这东西并不是不可为,并不是学不会。而且由于我极其认真地几乎将整本《C++ primer》都翻译成了中文,去掉了其中解释性的句子,只保留了最简单的描述以及复杂点的解释。说实话,C++ 语言的各种用法确实太多了,而且需要注意的坑也太多了,即便是这样学完了之后,如果要真的写点东西的话还是有非常多地方需要深思,免不了要多翻一下自己的笔记。

然而我已经知道 C++ 是怎么回事了。虽然肯定达不到精通的地步,但想要继续深入的话也是完

阅读全文 “我对编程的想法”

摆脱肤浅的学习

学习必然是一件苦差事,没有捷径可走,不要妄想在非常短的时间内有非常大的提升,学习必然是一点一点积累起来的,唯独勤奋可以达成目的。

想要达到专家水平需要非常长的时间,预计是十年,而且这十年的学习不是简单的重复而是刻意练习(deliberative practice)。刻意练习的关键在于:不仅仅是一遍遍重复去做,而是用刚好超出你当前水平的任务来挑战你自己,尝试它,在做的过程中和做完之后分析你自己的表现,然而修正错误。这样重复,然后再重复,直到生命的尽头。这其中并没有什么捷径。

真正的专业是需要一生的努力,想要在任何领域做的出色只能通过一辈子的劳作;没有更低的代价。在绝大多数领域即便是最有天赋的人也需要非常多的时间来达到最高水平的表现。

具体到编程领域

  • 对编程感兴趣,做这件事是因为乐趣,确保这件事足够有趣以至于我们愿意花10年的时间来做这件事;
  • 真正地去编程:学习最好的方式是做中学(learning by doing),只有精心设计的努力才能提供一个人的技能水平,最有效的

阅读全文 “摆脱肤浅的学习”

C++ Primer CH19 大型工程的工具和技术

19.1 控制内存分配

当对内存分配有特别需求的时候可以重载 new 和 delete 操作符来控制内存分配。

19.1.1 重载 new 和 delete

重载 new 和 delete 操作符的方式与重载其它操作符的方式有非常大的不同。当使用 new 表达式时会依次发生三件事:1. 调用库函数 operator new 或者 operator new[] 来分配足够的裸的没有类型的内存以存储对象或数组。2. 调用构造函数构造对象。3. 返回指向这个新分配构建的对象的指针。

当使用 delete 表达式时将发生两件事。1. 调用析构函数进行析构;2. 编译器调用库函数 operator delete 或者 operator delete[] 来释放内存。

定义自己的 operator new 和 operator delete 函数可以 hook 掉内存分配过程。即便是库中已经包含了这些函数的定义,我们依然可以定义自己的版本,而编译器并不会抱怨说重复定义。反而,编

阅读全文 “C++ Primer CH19 大型工程的工具和技术”