《百万在线 大型游戏服务端开发》前两章概念笔记

2023-11-11

第1章 从角色走路说起

游戏网络通信的流程则是服务端先开启监听,等待客户端的连接,然后交互操作,最后断开。
在这里插入图片描述

套接字

每个Socket都包含网络连接中一端的信息。每个客户端需要一个Socket结构,服务端则需要N+1个Socket结构,其中N为客户端的连接数,另外一个是服务端打开监听的套接字。

单线程事件模型(Reactor模型)

单线”指的是单线程,“事件”指的是事件触发,即当新连接、断开连接、收到数据这些事件到来时会触发某段代码。
在这里插入图片描述

一致性问题是分布式系统的一大难题

可能会出现很多异常情况:重复执行等,需要保持一致性;

操作系统

单个程序中可能会存在一些阻塞语句让CPU空闲,开启多个程序可以填补CPU的空闲时间。比如:
readFileSync

var server = net.createServer(function(socket){
	//新连接
	var data = fs.readFileSync('save.txt');
	//...
	//断开连接
	socket.on('close',function(){
	fs.writeFileSync('save.txt', data)
	});
});

如果程序中不包含阻塞语句,且运行在单核CPU下,同台物理机下部署多个程序是不能提升性能的。不过当代大多是多核CPU,可以同时执行多个程序,因此在非阻塞程序中,开启与CPU核心数相当的进程可以充分利用CPU。

阻塞为什么不占用CPU

常见的一些阻塞函数:等待客户端连接的accept函数,接收数据的recv函数等。那阻塞为什么不会占用CPU资源呢:
操作系统会分时执行各个运行状态的进程,由于速度很快,看上去就像是在同时执行多个任务。
阻塞了会到等待队列,等到条件成立(比如等待一段时间)操作系统会重新将进程A放入工作队列中,继续执行。
在这里插入图片描述

切换线程

CPU切换线程需要做很多工作,它执行一条语句大概需要几纳秒,完成一次线程切换大概需要几微秒,花销较大。开启的线程数越多,CPU就需要做更多的切换工作,这会使响应变慢。

网络模块的底层实现有两种方式:

1)每当有新的客户端连接时,开启新线程处理该客户端。
2)使用多路复用技术,所谓“多路”,指的是服务端可以阻塞(如使用epoll_wait)等待多个客户端的连接,有任何一个收到数据即返回。
Web服务器可以用这两种方法,但游戏服务端大多只会用第2种方法。这是因为Web服务器都是短连接发送消息后即断开,同时在线的客户端很少;游戏服务端大多是长连接,同时在线的玩家很多,方法1只能支持数百名玩家。

难以分割的业务

实现分布式程序的前提是游戏逻辑能够分割。如果游戏规则复杂,各个功能紧密相连,则不容易找到分割的方案。

actor

合理分割功能是分布式模型的一大难点,我们需要寻找一种模式,它既能符合游戏逻辑的表达,又能让计算机高效执行。传统的多进程方式很多场景不能满足游戏逻辑的表达;

每个Actor都会包含自身状态(HP、Coin),以及一个信箱(消息队列),Actor通过给其他Actor“寄信”来实现通信。至于收到信件后的反应,取决于收信的Actor。

在这里插入图片描述
在这里插入图片描述

由于各个Actor相互独立,计算机很容易让它们并行工作。

对游戏服务端而言,Actor并发模型给游戏业务的分割提供了灵活性。

第2章 Skynet入门精要

Skynet的强项在于单个节点内的并行运算

启动流程

在这里插入图片描述

skynet.socket模块

socket.read中所谓的阻塞模式和skynet.call一样,都利用了Lua的协程机制。调用socket.read,服务有可能被挂起,直到接收到数据,才会往下执行。

skynet协程

Skynet服务在收到消息时,会创建一个协程,在协程中会运行消息处理方法(即用skynet.dispatch设置的回调方法)。这意味着,如果在消息处理方法中调用阻塞API(如skynet.call skynet.sleep、socket.read),服务不会被卡住(仅仅是处理消息的协程被卡住),执行效率得以提高,但程序的执行时序将得不到保证。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《百万在线 大型游戏服务端开发》前两章概念笔记 的相关文章

随机推荐

  • Photoshop cs6 如何让图层渐变透明

    点击图层面板下方的蒙板工具 再选择左侧工具栏的渐变填充 选择黑 白渐变色 在图层上拖动 1 点击面板下方蒙板工具 在需要处理的图层上添加蒙板 2 选择渐变工具 快捷键G 选择黑白渐变 然后按住shift拖动鼠标拉个渐变就出来了 3 另外可以
  • 小程序的父子之间的传值调用

    前言 我们在小程序中父子组件之间的传值方法 目录 父传子 properties 步骤 1 在父组件 index wxml里面给调用子组件的地方绑定一个字段map 2 在父组件 index js中定义字段map 并用this setData改
  • Hbase批量查询-scan介绍

    1 scan原理 HBase的查询实现只提供两种方式 1 按指定RowKey 获取唯一一条记录 get方法 org apache hadoop hbase client Get Get 的方法处理分两种 设置了ClosestRowBefor
  • 桌面软件自动化测试小记

    什么是软件自动化测试 如何学习软件自动化及几个例子 Py UiAutomation
  • Swagger的使用详细教程

    Swagger的使用详细教程 Swagger是一款开源的API文档工具 它提供了一种简单且强大的方式来描述 展示和测试RESTful风格的Web服务接口 本文将详细介绍Swagger的使用方法 包括安装配置和使用示例 步骤 1 添加Swag
  • 基于Python的机器学习实践(portein)

    目录 数据集 简介 代码 1 数据的读入 2 数据理解 3 数据规整化处理 数据准备 4 数据建模 5 查看模型 6 模型预测 7 结果输出 数据集 https download csdn net download llf000000 86
  • JMeter使用命令行模式生成HTML测试报告

    自动生成html图形化报告 win r 输入 cmd 说明 jmeter n t Jmx脚本位置 l 结果文件result jtl存放的位置 e o 生成HTML报告指定文件夹 n 表示non gui mode 就是非图形化模式 t 指定J
  • 怎么更改dns_ESHOP连不上?SWITCH最新实用DNS地址分享

    虽然任天堂Switch采用的是不锁区的方式 但是由于各种虚拟墙的存在已经网络延迟等问题 经常导致玩家连不上eshop 买不了游戏 更新个游戏显示都要好几万小时 当然这个可以使用各种加速器等方式来解决 但是好的加速器需要付费 免费的又会经常抽
  • Receive port always be disabled.

    I configured a receive port in FILE to a local folder Biztalk administration console keep show that port is disables I f
  • 支付宝个人收款解决方案之支付宝签约方案

    关键词 签约支付 签约收款 支付宝收款 个人签约收款 背景 有做网赚或者在网上售卖个人小产品小服务的 需要进行收款 如果零星个别的收款可能直接走个人转账然后手动发货即可 但是一旦流程标准下来 量走起来之后 付款发货就需要自动化了 以提高人效
  • TCP实现socket通信(python)

    socket简介 UDP实现socket通信 python TCP实现socket通信 python 1 套接字工作流程 服务器端先初始化Socket 建立一个套接字 与端口绑定 bind 用 bind 函数来绑定一个端口号和 IP 地址
  • Java开发中的23种设计模式详解

    设计模式 Design Patterns 可复用面向对象软件的基础 设计模式 Design pattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代码 让代码更容易被他人理解 保证代码可
  • Hibernate Validator的使用以及自定义

    Hibernate Validator的英文官方文档 https hibernate org validator documentation Hibernate Validator的作用 Hibernate Validator是一个校验框架
  • Java五子棋的实现(附源码)

    学习目的 熟悉java中swing类与java基础知识的巩固 文末有源代码文件和打包的jar文件 效果图 思路 1 首先构建一个Frame框架 来设置菜单选项与按钮点击事件 MyFrame java文件代码如下 package StartG
  • http传输字符编码与转义(深度好文)

    一 引言 最近陆陆续续看了好多关于字节 字符 字符编码 字符转义的文章 终于对这个过程有了比较清晰深刻的认识 和后台开发相结合知道了乱码出现的理论具体原因 和前台开发结合知道了get与post请求的过程 这里分析下供大家学习分享 字符转义指
  • centos7离线安装sql server2019

    关闭SELINUX root localhost sed i SELINUX s enforcing disabled g etc selinux config setenforce 0 上传rpm包和依赖包 下载地址 https pkgs
  • SQL create file遇到操作系统错误5拒绝访问

    客户操作系统重新安装之后 也重新安装的了SQL Server2008R2 但是附加原来的数据的时候出现下面的错 尝试打开或创建物理文件 E liudaxitong D Data MDF 时 CREATE FILE 遇到操作系统错误 5 拒绝
  • kubernetes Service(SVC)几种4层代理的不同用法,ClusterIP、Headless、NodePort、LoadBalancer

    kubernetes Service SVC 个人学习记录 kubernetes Service SVC service 概念 service 类型 SVC 访问流程组件 VIP 和 Service 代理 代理模式分类 userspace
  • 怎么用Python设置Tkinter(TK)窗口屏幕居中且获得/设置Tkinter窗口的标题

    要修改窗口位置和修改窗口大小 要用到是tk对象提供的geometry方法 该方法的用法是geometry 字符串 这个字符串格式为 窗口宽x窗口高 窗口位于屏幕x轴 窗口位于屏幕y轴 可以只设置窗口大小或者是只设置窗口的x轴和y轴 例如ge
  • 《百万在线 大型游戏服务端开发》前两章概念笔记

    第1章 从角色走路说起 游戏网络通信的流程则是服务端先开启监听 等待客户端的连接 然后交互操作 最后断开 套接字 每个Socket都包含网络连接中一端的信息 每个客户端需要一个Socket结构 服务端则需要N 1个Socket结构 其中N为