云渲染网游系统架构(云风skynet-游戏开发核心技术实战)

专注分享Linux后台服务器开发,包括C/C ,Linux,Nginx,Skynet,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,zk,流媒体服务器,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等技术,文末领取资料福利包!一、环境安装

1. centos

yum install -y git gcc readline-devel autoconf

2. ubuntu

apt-get install git build-essential readline-dev autoconf

apt-get install git build-essential libreadline-dev autoconf (for ubuntu 16.04)

3. mac

brew install git gcc readline autocon

二、获取代码以及编译

git clone https://github.com/cloudwu/skynet.git

cd skynet

centos&&ubuntu:

make linux

mac:

make macosx

三、关于 win10

1. 开启开发者模式

系统设置->更新和安全->针对开发人员->开发者模式

2. 启用 linux 子系统组件

系统设置->应用->程序和功能->启动或关闭 windows 功能->适用于 linux 的 windows 子系

统->重启更新

3. 安装 linux 子系统

windows 应用商店->Ubuntu->修改 sources.list

https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

选择 18.04LTS

4. 在 win10 中 vscode 安装 wsl 插件

5. 在子系统 Ubuntu 中添加 skynet 源码

四、多核开发与 actor 模型1. 多进程

a) 消息队列

i. 协议问题

ii. 断线重连

iii. 进程启动顺序问题

iv. 负载均衡问题

v. 数据同步问题

b) RPC

i. 两个系统保持同步问题

c) zk

i. 配置项管理问题

ii. 集群管理

iii. 统一命名问题

iv. 状态同步问题

v. 分布式锁问题

d) 拆分

i. 功能拆分

ii. 热点拆分

2. 多线程

3. 并发模型 :CSP 模型 与 actor 模型

4. 结论:多进程并发实体是进程,多线程并发实体是线程,go 并发实体是 goroutine(协

程),actor 并发实体是 actor(语言层面抽象出来的“进程”)。它们都是在隔离性(运行环

境)与统一性(数据统一)之间作取舍平衡,而 actor 模型在语言层面做运行环境的隔离,

数据同步依然需要通过消息来同步。actor 模型是加强版的多进程解决方案,进程间通信由

socket 转为指针的传递,从而通信变得更加可靠,同时多进程解决方案中,公共开源组件(消

息队列,rpc,zookeeper)解决的问题,在 actor 模型中处理起来更方便。

5. actor 定义:

a) 用于并行计算

b) actor 是最基本的计算单元

c) 基于消息计算

d) actor 之间通过消息沟通并且相互隔离

五、skynet 中的 actor 模型

1. 结构组成

a) 隔离的环境(内存块或 LUA 虚拟机)

b) 消息队列

c) 回调函数

2. 实现

a) logger 服务 service-src/service_logger.c

b) lua 服务启动器 service-src/service_snlua.c

六、actor 运行以及消息调度

云渲染网游系统架构(云风skynet-游戏开发核心技术实战)(1)

1. 消息队列

a) 全局消息队列

b) actor 消息队列

2. skynet 中锁的使用

a) 互斥锁

云渲染网游系统架构(云风skynet-游戏开发核心技术实战)(2)

b) 自旋锁

i. worker 轮询消息队列

云渲染网游系统架构(云风skynet-游戏开发核心技术实战)(3)

c) 读写锁

i. handle_storage

d) 条件变量

i. worker 线程的休眠

云渲染网游系统架构(云风skynet-游戏开发核心技术实战)(4)

3. skynet 中线程

a) timer

b) socket

c) worker

i. “权重”来定制消费消息的数量(-1 消费一个,0 全部消费,1 消费一半)

ii. 休眠(条件变量)与唤醒(timer 和 socket)

d) monitor

i. 检查服务消息过载

七、lua 与 c 接口编程

1. lua 数据类型

a) boolean,number,string,function,userdata,lightuserdata,thread,table(__index,__newind

ex,__gc,__len),nil

2. table

a) table.concat

b) table.insert

c) table.remove

d) table.sort

e) hash 表来使用

3. 元表

a) 定制行为 __index, __newindex

b) 只有 table 和 userdata 对象有独自的元表,其他类型只有类型元表

c) 只有 table 可以在 lua 中修改设置元表

d) userdata 只能在 c 中修改设置元表,lua 中不能修改 userdata 元表

4. 协程

a) 一段独立的执行线程

b) 一个 lua 虚拟机中同时只能有一个协程在运行

c) 目的:写的时候是同步的书写方式,而实际内部是异步非阻塞的实现

5. 闭包

a) 表现

i. 函数内部可以访问函数外部的变量

ii. lua 文件是一个匿名函数

b) 实现

i. c 函数以及绑定在 c 函数上的 upvalues(上值)

c) 用 lua_pushcclosure 用来创建 c 闭包

d) 通过 lua_upvalueindex 伪索引来获取上值

6. 虚拟栈

云渲染网游系统架构(云风skynet-游戏开发核心技术实战)(5)

a) 栈上的都是 lua 类型的值

b) lua 调用 c 的函数都得到一个新的栈,独立于之前的栈

c) c 调用 lua,每一个协程都有一个栈,没有显示创建那么就是主协程上一个栈

7. 注册表

a) 预定义的表,用来保存任何 c 代码想保存的 lua 值

b) 使用 LUA_REGISTRYINDEX 来索引

八、skynet 网络 IO

1. 阻塞 io 和非阻塞 io

a) 阻塞在网络线程

b) io 操作(read/write)在没有数据到达时是否立刻返回

c) fd 决定了是否阻塞

2. 多路复用以及 epoll

3. epoll_event 与 actor 模型关联

4. 单线程读与多线程写

云渲染网游系统架构(云风skynet-游戏开发核心技术实战)(6)

PS: skynet 实际使用的状态切换来实现的 epoll_wait 后的事件遍历。这里为了在一个循

环中将 skynet 网络功能演示。

九、actor 通信细节

1. skynet.send/skynet.call

2. skynet.redirect

3. skynet.response

4. skynet.ret

云渲染网游系统架构(云风skynet-游戏开发核心技术实战)(7)

【文末福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以私信【1】加群找群主免费领取~更多免费直播技术点击免费即可开始学习:C/C Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页