集群的安全启动/终止

典型地,我们需要在GS和各个服务都启动完成之后,再打开网关接入网络连接,这需要通过master节点进行监控,GS和服务也需要向cluster汇报自己的状态(启动中,运行中),master在关键服务都启动完成并状态正常之后,再通知gateway开放连接。基于cluster中的控制信息,这一点不难做到。集群的终止流程也类似。

阅读全文 »

前几天看一些Go框架的源码和相关工具,由于之前没有在正式项目中用过Go,看起来是有些吃力的,有一种顾头不顾尾的感觉,到之后仍然是困于其中,不得精髓。这和本人的一些学习习惯有关:迷信源码,觉得只有理解其源码,才能运用自如,不知道是不是部分受于C/C++出身的影响,底层思维根深蒂固。之前看的一些框架(skynet,firefly,kbengine等)也是一样,虽然直接看的源码,但是由于缺少实践,对其运用场景,优缺点没有足够的认识,能够吸收的干货也比较有限。加之工作上开始忙起来,难免急躁,事倍功半。

阅读全文 »

一. 分布式Erlang

Erlang为分布式提供的基础设施

  1. 良好的函数式编程语义,为并发而生
  2. 异步通信模型,屏蔽底层通讯细节(Erlang进程间/系统进程间/物理机间),将本地代码扩展为分布式程序非常容易
  3. 透明的通信协议,完善的序列化/反序列化支持
  4. 完善的监控能力:监督(supervisor), 监视(monitor), 链接(link)等
  5. 其它分布式组件:如global,epmd,mnesia等
阅读全文 »

一. 分布式计算的八大谬论

1. 网络总是可靠的

在分布式系统中,你可能最容易犯下的错误就是认为远程节点是永远可用的,尽管这可以通过添加更多的硬件(比如主从)来实现,但这也带来了冗余性。网络可能随时因为断电,硬件故障,自然因素,人为因素等不可用,在这种情况下,保证你的程序能够在远程节点或者第三方服务不可用时,能够正常运行是非常重要的。Erlang除了能够监测到外部服务失去连接(或者不能响应)之外,没有任何的其它措施,毕竟,除了你自己以外,谁也不知道某个组件有多重要。

注意,Erlang跨节点的monitor和link操作是比较危险的,因为一旦远程节点不可用,将触发关于该节点所有的远程monitor和link,这可能会引起一场网络风暴,给系统带来意料之外的高负载。在不可靠的网络上构建可靠的分布式应用,需要你随时准备面临这种突发状况,并且保证系统能够继续正常稳定地工作。

阅读全文 »

漫反射贴图(Diffuse Mapping)

漫反射贴图反映出物体表面在漫反射下的颜色和强度,表现出物体的固有色以及纹理。是物体最基础的贴图。通常也可以直接理解为纹理。

高光贴图(Specular Mapping)

高光贴图表现物体表面的光照属性,包括镜面反射强度,光泽度,以及菲涅耳衍射强度,决定物体在强光下,表面不同材质(布料,金属,皮肤等)的光照表现。一些高光贴图只包含镜面反射强度信息,每个像素只需要8位,即使用一个通道。

阅读全文 »

顶点动画

3D动画本质上是模型的顶点轨迹,因此要记录一段动画,最原始的办法就是记录动画过程中所有的顶点信息。但由于肉眼的识别速度和GPU的处理能力都有限,因此有了桢(frame)的概念,帧是模型特定姿态的一个快照。为了进一步减少动画桢的内存占用,我们可以从动画的轨迹中提出中关键帧,保存每一个关键帧的模型网格信息,由引擎来得到平滑的动画效果(关键帧过渡),在关键帧之间平滑过渡的帧叫过渡帧或插值桢。

阅读全文 »

在使用cluster_server做gameserver后台集群支撑的过程中,逐步暴露出一些问题,在此记之。

1. 节点交互效率低下

我们按照业务职责将集群节点分为,agent,player,map,alliance,battle等,这些节点可以在一台物理机上(操作系统进程间交互),也有可能部署到不同的物理机上(网络IO交互),而玩家一个业务逻辑可能涉及到多个节点,形成一个节点交互链:如玩家在大地图上进行一场战斗,按照流程需要走:agent -> player -> map -> battle -> map -> player -> agent。整个过程都是异步的。这种交互是频繁的且低效的。

阅读全文 »

简单介绍一下Erlang常用数据结构的内部实现和特性,主要参考Erlang OTP 18.0源码,和网上很多优秀博客(参见附录),整理了一些自己项目中常用到的。

Erlang虚拟机使用一个字(64/32位)来表示所有类型的数据,即Eterm。具体的实施方案通过占用Eterm的后几位作为类型标签,然后根据标签类型来解释剩余位的用途。这个标签是多层级的,最外层占用两位,有三种类型:

  • 01: list,剩下62位是指向列表Cons的指针
  • 10: boxed对象,即复杂对象,剩余62位指向boxed对象的对象头。包括元组,大整数,外部Pid/Port等
  • 11: immediate立即数,即可以在一个字中表示的小型对象,包括小整数,本地Pid/Port,Atom,NIL等

这三种类型是Erlang类型的大框架,前两者是可以看做是引用类型,立即数相当于是值类型,但无论对于哪种类型,Erlang Eterm本身只占用一个字,理解这一点是很重要的。

阅读全文 »

在游戏服务器中,通常要面临对象到模型的映射,以及对象到协议的映射,前者用于GS和DB交互,后者用于GS和Client交互。我们的项目中做到了对象到模型的自动映射,这样在开发过程中无需关心GS和DB的交互,很方便。

而现在我们还没有实现对象(map)到协议(record)的自动映射,我觉得这个特性是比较有用的,特别是在同步一些实体数据的时候。无需写一堆Packer函数来将对象数据打包为协议。因此就研究了一下如何将map的数据自动映射到protobuffer,也就是转换为record。

阅读全文 »

数据组织

我们将地图上的数据分为动态数据(行军)和静态数据(点数据),因为行军过程不会对地图上的点造成影响(飞行),并且不考虑实时碰撞,因此行军的逻辑是非常轻的,将其剥离出地图点数据,处理起来会更简单。也就是说,行军是地图上特殊的一类事件,而不是动态的点。

阅读全文 »