01Lua中ipairs()和pairs()的区别与使用
根据官方手册的描述,pairs会遍历表中所有的key-value值,而pairs会根据key的数值从1开始加1递增遍历对应的table[i]值,直到出现第一个不是按1递增的数值时候退出。
用pairs()遍历是[key]-[value]形式的表是随机的,跟key的哈希值有关系
但是如果是这样定义表stars的话 stars = {"Sun", "Moon", “Earth”, "Mars", "Venus"},表stars是数组的形式,是会按顺序输出的,如果 执行 stars[1] = "day",则数组会变成哈希表,再遍历时就不会顺序输出。
02firefox浏览器强制取消自动更新
Firefox浏览器,在浏览器的设置中已经设置了取消自动升级,实际退出Firefox浏览器重新启动浏览器后还是会升级到最新版本。
影响:
Firefox浏览器不同的版本的插件的支持兼容不一样,如果需要使用某款插件,需保证浏览器的版本保持固定。
03navmesh寻路与漏斗算法
多边形寻路参考PolygonNavMesh 原理:
1. 将unity导出的数据生成凸多边形
2. 找出所有凸多边形共享的边
3. 使用A*算法找出起点到目标点所经过的多边形列表
4. 使用漏斗算法找出顶点坐标

05程序员的核心能力 - 引擎式思维
把你代码中普适的、可重用的部分与具体业务逻辑分离的思想,就是引擎式思维。在游戏中我们叫它引擎(Engine),在应用开发中我们叫它框架(Framework),在基础服务里我们又叫它架构(Architecture),但它们背后的思想是相同的。
有些新手可能会觉得引擎、框架这些东西都是大牛开发的,我们只要会用就好了。但其实事情不论大小,只要有套路可寻,都可以用引擎式思维去解决。在你日常要解决的问题中,粗看可能各不相同,但这时你若退后一步,从一个更高地视角去发现问题之间的共同点,把解决方案中通用的部分从具体的问题中抽离出来,这时你就有了自己的框架。这是程序员的一种核心能力,它不会因为技术的日新月异而过时,但你也不可能一跃而蹴,它会随着你技术能力的成熟而逐渐精进。就如同武侠小说里的内功,难以速成,但却比学习任何具体的招式都更重要。
06一致性哈希算法的理解与实践
在维基百科中,是这么定义的一致哈希
是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。

07Sigkill带来的挑战
这个排查问题的过程是我更关注的,接触了好多新的东西,OOM killer 机制,ulimit各种参数及后果,强大的systemtap内核调试工具,可以跟踪很多内核事件以及一次完整的经验,以后希望能够更快的定位问题,更有力的思维过程,最终写好自己的程序,为他们的运行负责。详细关键的日志真是不可缺少。08Redis中5种数据结构的使用场景介绍
原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码。目前目标是吃透 redis 的数据结构。我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢?
String——字符串
Hash——字典
List——列表
Set——集合
Sorted Set——有序集合
09C/C++中复杂的指针的理解方法
char* const* (*ss[23][200])(void (*)(int h, void (*)(void)));
(1) 最外层: char* const * (*ss[23][200]) ( void (*) ( int h, void (*)(void) ) ); 这个相当于:T * (A) (B); 也就是一个函数指针,所指向的函数的参数是B,返回值是T的指针;
(2) 一个一个来看,先看T,char* const 是 char型的指针常量;
(3) 再看A:(* ss[23][200] ) (B),这个相当于: (* F ) (B),也就是一个函数指针;
(3.1) A的里面 ss[23][200] 是一个二维数组声明,这个数组的类型是什么呢?结合(3)就知道了:这个数组的每个元素就是(3)中分析得到的——函数指针;整理一下就是:ss[23][200]的每个元素都是一个函数指针;
(4) 再看B: ( void (*) ( int h, void(*)(void) ) ) 这个又是一个函数指针,相当于: void (*F) (P); 它指向的函数参数是P,返回值是void;
(4.1) B这个函数指针指向的函数需要2个参数:第一个参数是int型,第二个参数是:void (*)(void),即:第二个参数又是一个函数指针(这个指针很好分析,就不写了);
(5) 结合(3)和(4)就知道 (*ss[23][200]) (B) 这个数组函数指针所指向的函数的参数也是一个函数指针;
(6) 又结合 (2) 知道(5)的函数指针返回值类型。
所以,整理一下,得到:ss是一个23X200的二维数组,每个元素是一个函数指针(a);它 指向的函数的返回值是一个指针,这个返回值指针的类型是char型的指针常量;函数(a)的参数只有一个,是一个函数指针(b);(b)指向的函数返回值 是void型,参数有两个,第一个是 int 型变量,第二个又是一个函数指针(c),(c)的返回值是void,参数也是void。

10透过 Linux 内核看无锁编程
非阻塞型同步 (Non-blocking Synchronization) 简介如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步。同步可分为阻塞型同步(Blocking Synchronization)和非阻塞型同步( Non-blocking Synchronization)。
内核无锁第一层级 — 少锁
内核无锁第二层级 — 原子锁
内核无锁第三层级 — Lock-free
内核无锁第四层级 — 免锁
11游戏服务端究竟解决了什么问题?
整理下这篇文章到目前为止做了什么事情:
在文章的一开始确定了游戏服务端要解决的核心两个问题:消息的pipeline与游戏世界状态维护。
通过回顾历史的形式提出游戏服务端中最常见的需求情景:多玩家场景同步,并梳理了场景同步最适合的消息pipeline。
结合切场景的扩展需求,提出Gate这种基础设施抽象(infrastructure abstraction,简称IA)。
尝试进行高内聚、低耦合的服务划分,并总结Gate无法兼顾的消息pipeline。
针对Gate无法处理的消息pipeline(service -> service),提出新的MQ-IA,可以大大简化服务间拓扑关系。基于不同的IA与相关协议,提出更高层次的RPC协议,定义了适合.Net2.0和.Net4.5的两种异步RPC调用规范。实现了不同IA到统一规范的Adaptor。
总结了游戏中RPC应用的pattern,不同pattern如何与不同IA结合使用。同样通过回顾历史的形式引入数据服务来取代传统MMO中的Db代理进程。
结合MQ与数据服务,提出无状态服务在游戏服务端中的应用情景,展开介绍数据服务对于无状态服务的意义所在。
基于构建全局数据服务的理念,尝试实现一种多实例的、每实例内向不同服务提供原子修改操作级别一致性的数据服务。
为数据服务增加了符合需求的高可用支持。引入了zookeeper,可以让普通的服务也可以复用同样的协调者组件。
总结下出现的几种概念:
IA。包括Gate、MQ、内存db、持久化强一致性db、分布式协调器等等。不同的IA各司其职,各自只负责解决分布式系统中的一小部分问题。
RPC与Pattern。面向应用层的统一服务调用方式与规范。
Adaptor。不同的IA与相关协议到统一RPC与Pattern的适配器。
12Redis源码分析(11大优秀设计)
坚持了一个月左右的时间,从最开始的对Redis的代码做分类,从struct结构体分析开始,到最后分析main主程序结束,中间,各大模块的代码逐个击破,学习,总之,收获了非常多,好久没有这么久的耐心把一个框架学透,学习一个框架,会用那只是小小的一部分,能把背后的原理吃透才是真功夫。在这个学习的最后阶段,是时候要来点干货了,我把这1个多月来的一些总结的一些比较好的代码,和设计思想总结出来了,原本想凑成10大精彩设计的,可后来感觉每个点都挺精彩的,还是做成了11大优秀设计,包证让你打开研究,这里无关语言,重在一种编程的思想和设计,希望大家能好好领会。
点击排行

站长推荐

猜你喜欢
站点信息
- 建站时间:2016-04-01
- 文章统计:728条
- 文章评论:82条
- QQ群二维码:扫描二维码,互相交流
