erlang mongodb驱动地址: https://github.com/comtihon/mongodb-erlang

先说说mongodb-erlang驱动的一些特性:

  • 支持atom和binary作为Key,atom最终是转换为binary进行存储的,而在读取时,驱动并不会将对应binary转换为atom(它也不知道怎么转)
  • 不支持integer,string(对erlang来说是字符串,对mongodb来说是数组)作为Key
  • 支持atom,binary,integer作为值,这三者的存取是透明的,不需要特殊转换,在mongodb中,atom被存为Symbol(xxx)
  • 支持string作为值,但实际上存的是字符数组,如果想存字符串,应使用binary
  • 目前最新的mongodb-erlang驱动使用erlang map来存储doc(之前版本用的是bson list)

基于游戏服务器的需求,我们希望:

  • mongodb driver能够支持integer作为key
  • 从模型到对象的转换是透明的,无需我们关心
阅读全文 »

主要流程

服务器端套接字的主要流程:

  1. socket():创建一个主动套接字
  2. bind():为套接字绑定一个本地协议地址和端口(这一步不是必须)
  3. listen():将套接字改为被动套接字,如果套接字没有绑定端口,为套接字选择一个临时端口,此时TCP状态机等待SYN包的到达
  4. accept():从listen backlog队列中取出一个已经建立(已完成三次握手)的连接

而对于客户端来说,只需要知道服务器IP,Port,直接connect()即可,客户端一般无需主动调用bind()绑定端口,因为客户端不关心它的本地端口,connect()会为其选择一个临时端口。

阅读全文 »

TCP核心参数

关于TCP核心参数,参见:https://www.frozentux.net/ipsysctl-tutorial/chunkyhtml/tcpvariables.html

其中比较重要的有:

tcp_syn_retries

三次握手中,发出的SYN未得到响应时,超时重传SYN包的次数

tcp_synack_retries

三次握手中最后一个ACK未收到时,超时重传SYN-ACK包的次数

tcp_max_syn_backlog

服务器端SYN队列大小,关于TCP Listener的状态转变,可参考下图:

tcp_abort_on_overflow

当服务器忙不过来时(listen backlog满了),发送RST包重置连接

tcp_tw_reuse

复用正在TIME_WAIT状态的端口

tcp_defer_accept

server端会在接收到最后一个ack之后,并不进入ESTABLISHED状态,而只是将这个socket标记为acked,然后丢掉这个ack。此时server端这个socket还是处于syn_recved,然后接下来就是等待client发送数据, 而由于这个socket还是处于syn_recved,因此此时就会被syn_ack定时器所控制。直到收到客户端第一个包(此时连接才ESTABLISHED)或重传超时(丢掉连接)。

针对客户端发送第一个包(典型地,如HTTP浏览器)的情况下,这个参数可以延迟连接的建立(ESTABLISHED),在应用层体现为延迟连接服务(进程/线程/Actor)的创建,对某些对最大连接(服务)数有限制的服务器,可以更充分地利用资源。并且由于少了服务的休眠/唤醒,可能在这方面有细微地性能提升。

阅读全文 »

一. TCP首部

首部长度以4字节为单位,4位首部长度最多可表示60字节,其中有20字节的固定长度。由于封装在在一个IP报文中,并且可根据首部长度得到数据起始位置,因此TCP首部没有数据或总长度字段,这和IP首部不一样,IP首部同时有首部长度和总长度字段,前者用于得到数据起始位置,后者用于得到结束位置,因为以太网要求桢的数据部分最小长度为46字节,IP报文小于46字节将在后面添加Padding,因此需要总长度来区分哪些是数据,哪些是Padding。这一点对TCP来说不存在,因为得到IP报文数据的结束位置,也就得到了TCP数据的结束位置:

阅读全文 »

动画系统

如果动画包含多层,要在初始化时设置动画层权重。

通常情况下,在我们操作角色时,脚本根据玩家输入,设置动画的行进速度(可平滑过度),由动画的Blend Tree来做到角色走和跑之间的平滑过渡,并且将动画的实际位移作用于角色模型上。也就是说,由动画控制前进(走,跑),脚本直接控制转向(rigidbody.MoveRotation)。模型只需提供WalkRun两个动画片段即可,但需要导入位移信息。

Animator有个比较有用的选项,用于通过脚本而不是动画来控制模型移动。

Apply Root Motion:是否将动画的位移,转向作用于实际模型之上。即模型的运动(Position,Rotation的变化)是由动画控制还是脚本控制。

阅读全文 »

一. 简介

ranch是erlang的一个开源网络库,提供一个高效的监听进程池,并且将数据传输和数据处理分离开来。使用起来非常简单,灵活。关于ranch的更多介绍和使用,参见官方文档

阅读全文 »

最近又开始想在博客上实现自己一直想要的摘要功能,然后倒腾jekyll,本来也没有前端基础,就博客系统而言,对我来说,简单就好,能专注写东西。但是发现jekyll偏离了这个宗旨,缺乏成熟的主题机制,可定制性太强,学习成本高。然后发现了这个Hexo主题,觉得就是自己想要的功能。最终抛弃了jekyll,投向Hexo。

阅读全文 »

OverView

Erlang外部调用的几种方式:

外部接入(OS进程级):

  • Ports: 用C实现的可执行程序,以Port的方式与Erlang交互。
  • C Nodes: 用C模拟Erlang Node行为实现的可执行程序。
  • Jinterface: Java和Erlang的通讯接口。
  • Network: 通过自定义序列化格式与Erlang节点网络交互,如bert-rpc

内部接入(和虚拟机在同一个OS进程内):

  • BIF: Erlang大部分BIF用C实现,如erlang:now,lists:reverse等
  • Port Driver: 以链接库方式将Port嵌入虚拟机,也叫Linkin Driver
  • NIF: 虚拟机直接调用C原生代码

下面主要理解常用的三种:Ports, Port Driver, NIF。

阅读全文 »