【HLSDK系列】Delta 详解

服务端和客户端总是需要互相交换数据,来做到实时的游戏体验。

很久之前,我们的网速都不是很快,甚至带宽只有 1Mbps (128KB/s)这样的速度,作为当时一个网络实时对战游戏,每时每刻都要传递数据,为了完成各种各样复杂的效果,要传递的数据量自然也就多了。

为了减少需要发送的数据大小,引擎的程序员开发出了 Delta 模块。

它能把需要传递的数据的大小压缩到极致,大大减少了网络传输的数据量,使得当时网速很慢的电脑也能流畅地玩游戏!

如果你看过我的前两篇文章,你一定对 clientdata_t、entity_state_t 有些了解(如果你还没看过,我建议你去看看),查看结构体你会发现里面的成员大多数是 int、float (4字节变量)为了节约网络带宽占用,引擎还会对这些变量进一步处理,才能发给客户端。

这里就是 Delta 模块发挥的时候了,打开 valve/delta.lst 或者 cstrike/delta.lst 这个文件,能看到这样的代码:

clientdata_t none
{
    DEFINE_DELTA( flTimeStepSound, DT_INTEGER, 10, 1.0 ),

    // ...
    DEFINE_DELTA( m_flNextAttack, DT_FLOAT | DT_SIGNED, 22, 1000.0 ),

    // ...

    DEFINE_DELTA( m_iId, DT_INTEGER, 5, 1.0 ),

    // ...
}

首先你看到了眼熟的 clientdata_t 这个结构体名字,接着还有它的成员们。

我们可以看到 DEFINE_DELTA ( .. ) 里有一些参数,我们逐个来分析它们。

为了方便讲解,我们从 DEFINE_DELTA( m_iId, DT_INTEGER, 5, 1.0 ) 这行开始。

第一个参数 m_iId 毫无疑问表示 clientdata_t 里的 m_iId 这个成员变量。

第二个参数 DT_INTEGER 表示这个成员变量是 整数型。

第三个参数 5 表示这个变量最多占用多少个“位”(如果你不知道“位”是什么,我建议你搜索“位和字节”来复习一下基础)下文简称占位参数。

第四个参数 1.0 对于整数型成员变量来说,它总是 1.0 不需要改变

重点来啦!注意第三个参数,这里是 Delta 模块压缩数据的精髓!我们知道一个 int 型变量要占用 4字节 也就是 32位,它能存下一个超级大的数值,

但我们的变量可能不需要存这么大的数值,比如我的 m_iId 的值最大就 31,连 1字节 都不够,只需要 5位!

Delta模块会在发送数据前,根据这个配置文件来精简变量数据(压缩),把要发送的数据压缩到最小!

比如上面的 m_iId 这个变量,经过 Delta压缩,只剩下 5位,这远远小于一个 int(32位)!Delta 根据配置文件来压缩每个成员变量的大小,到最后,引擎要发送的数据将会变得非常小!

这里还要解释一下传递小数(FLOAT)时是如何计算位数的,上面提到了一个 1.0 的参数,实际上它是一个倍数,Delta模块在处理小数时,会把小数乘上这个倍数,得到一个整数,

比如我的 m_flNextAttack 里的数值是 12.55 乘 1000.0 变成 12550 这样一个整数,而这个整数至少需要 13位 才能存得下,所以占位参数至少要写 13 才能发送 12.55 这个小数给客户端。然后客户端再除以 1000.0 就得到了这个小数。

你一定注意到还有个 DT_SIGNED ,它表示这个变量允许保存负数,它会额外占用 1位 数据,所以写占位参数时,要考虑到它。

你可以在 delta.lst 里为每个成员变量配置大小,这是非常必要的。当你决定要传递一个新的数据时,请一定要记得配置 delta.lst 不然你的客户端可能会接收到一个错误的数值。

Delta模块还有十分强大的差异管理功能,服务端不会每一帧都发送完全相同的数据给客户端,这很没必要。Delta会过滤掉没有改变的数据,只发送有变化的部分数据给客户端,进一步减少了数据发送量!

相信你一定已经被Delta的强大吸引,但是经过Delta压缩的数据,还会经过更高级的数据压缩算法压缩才发送给客户端。。。

我总觉得我忘了什么事情,等我想起来再补充吧!

时间: 2024-10-09 18:31:18

【HLSDK系列】Delta 详解的相关文章

OAF_OAF EO系列 - Initialize详解和实现(案例)

2014-06-14 BaoXinjian 一.摘要 Initialize data(数据初始化): 用于新增记录对值Value的初始化 1.在Design time 时设定Page item的Default value. 2. 在Run time 时用编程方式设定, Default value的设定这里不说.留待后面”深入UI item”时再说. 用于在新增记录时,值的联动设定 1. 在页面时的联动,如果用户选择某个值,自动带出另外的控件的默认值,如两个list的联动,选择省份后自动带出城市

1.SQL优化系列-->高手详解SQL性能优化十条经验

1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便会提高近百倍.改进方法如下: a.修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了. b.直接修改后台——根据输入条件,先查出符合条件的供应商,并把相关记录保存在一个

AxureRP7.0基础教程系列 部件详解水平线和垂直线 HORIZONTAL & VERTICAL LINES

原型库网站-讲师金乌原创发布,可自由转载,请注明出处! Axure中文官网:www.AxureRP.cn   <AxureRP7.0部件详解> 水平线和垂直线 HORIZONTAL & VERTICAL LINES 使用案例 将页面区块化 最常见的用法是将内容分解成几个部分,比如,讲页面分为 header 和 body. 编辑线条 添加箭头 线条可以通过工具栏中的箭头样式转换为箭头:选中线条,点击箭头样式,在下拉列表中选择箭头样式. 线宽.颜色和样式 线条可以添加颜色.设置宽度和添加样

【React Native开发】React Native控件之Touchable*系列组件详解(18)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50630984 本文出自:[江清清的博客] (一)前言 [好消息]个人网站已经上线运行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:http://www.lcode.org 今天我们一起来看一下Touchable*系列组件的使用详解,该系列组件包括四种分别为:TouchableHighlight,TouchableNativeFeedback,Touch

Android 自定义控件之第三讲:obtainStyledAttributes 系列函数详解

在项目中开发自定义控件时,或多或少都会用到 obtainStyledAttributes(AttributeSet, int[], int, int) 或者 obtainAttributes(AttributeSet, int[]) 函数,它们的主要作用是:根据传入的参数,返回一个对应的 TypedArray ,如果小伙伴还没有看过 LZ 的第二讲,那么请自行移步 Android 自定义控件之第二讲:TypedArray 详解,好了,就先扯到这里,下面开始今天内容讲解: 获取 TypedArra

AxureRP7.0基础教程系列 部件详解 HTML Button HTML按钮

原型库网站-讲师金乌原创发布,可自由转载,请注明出处! Axure中文官网:www.AxureRP.cn   <AxureRP7.0部件详解> HTML Button HTML按钮 为操作系统的浏览器体验而设计 HTML按钮的格式取决于你浏览原型的操作系统中的浏览器.它通常针对你的浏览器内置了鼠标悬停和鼠标按下时的样式,这和你操作系统中应用程序的样式类似. 编辑HTML BUTTON 提交按钮的填充颜色.边框颜色和其他大多数样式格式都被禁用了.取而代之的是生成原型后在浏览器中它会使用内建的样式

AxureRP7.0基础教程系列 部件详解 Droplist 下拉列表

原型库网站-讲师金乌原创发布,可自由转载,请注明出处! Axure中文官网:www.AxureRP.cn   <AxureRP7.0部件详解> Droplist 下拉列表 常用案例 传递表格信息 下拉列表经常用于性别选择.信用卡过期日期.地址列表等形式.所选择的项存储在变量中,然后通过变量进行传递. 跨页更改动态面板状态 查看效果 使用下拉列表改变图片 在下拉列表的选项改变时,图片内容也与之对应改变.详情下载案例RP文件. 本帖分享可见的内容 下拉列表选项 查看效果 编辑下拉列表 添加.删除.

AxureRP7.0基础教程系列 部件详解 动态面板 DynamicPanel

原型库网站-讲师金乌原创发布,可自由转载,请注明出处! Axure中文官网:www.AxureRP.cn   <AxureRP7.0部件详解> 动态面板 DynamicPanel 动态面板概述       动态面板(Dynamic panel) 动态面板是一个可以在层或状态中装有其他部件的容器. 你可以将动态面板比喻成相册,相册的每个夹层中又可以装进其他部件,并且每个夹层和里面的部件可以隐藏.显示和移动,并且可以动态设置当前夹层的可见状态.这些特性允许你在原型中演示自定义提示.灯箱.标签控制和

AxureRP7.0基础教程系列 部件详解 Check Box 复选框

原型库网站-讲师金乌原创发布,可自由转载,请注明出处! Axure中文官网:www.AxureRP.cn   <AxureRP7.0部件详解> Check Box 复选框 常用案例 作为附加选项 复选框经常用来允许用户添加一个或多个附加选项. 选择多个选项 在这个例子中,有多个选项可以选择.新手容易和单选按钮搞混淆,单选按钮只能选择一个. 编辑复选框要将复选框默认设置为勾选,可以在设计区域单击复选框或者右键选择选中.复选框可以通过用例编辑器中的动作设置为选择/选中进行动态设置. 对齐方式 默认

AxureRP7.0基础教程系列 部件详解 图片/Image

  原型库网站-讲师金乌原创发布,可自由转载,请注明出处! Axure中文官网:www.AxureRP.cn   <AxureRP7.0部件详解> 图片/Image 图片部件可以用来添加图片和插图显示你的设计理念,产品,照片,或更多. 自定义图片按钮 使用图片部件来添加一个自定义图片按钮,然后像给形状按钮添加交互一样,添加鼠标点击.悬停等响应 导入图片和自动大小 拖拽一个图片部件到设计区域并双击导入图片.支持常见图片格式:GIF,JPG,PNG,BMP.当询问你是否自动调整图片大小时,点击是将