导语
在之前的压缩方法一里面我们把表示状态的数据编码到uint32的每个bit上,进行网络传输后再解码出来,以达到压缩数据,节省带宽的效果。这次我们尝试把UE4中的Rotator数据也进行压缩。
实现思路
UE中的Rotator本质上就是一个结构体,其中有三个float,那么传输一个Rotator要占用12个字节。
但是可以发现Rotator就是表示三个轴的旋转角度,而角度的范围是0 - 360.0,远小于float可以表示的范围,那么我们的目标就变成了如何用更小的数据量来传递0 - 360.0 了。
根据压缩精度不同,本文提供2种压缩方法,均为有损压缩。
上代码
其实UE 的 Actor 移动同步中已经有一些对数据进行量化(Quantization)的设置了。
量化的意思就是把某个数值范围映射(Map)到另一个数值范围。
我把源码翻出来了,需要的话自己封装一下,就可以用啦!
Runtime\Core\Public\Math\Rotator.h
1 | /** |
Rotator.cpp
1 | FORCEINLINE uint8 FRotator::CompressAxisToByte( float Angle ) |
总结
UE 中有很多优秀的源码的,多读源码可以少造轮子。