BEPUphysicsint定点数3D物理引擎介绍

本文介绍了在游戏开发中使用定点数物理引擎确保跨设备一致性的方法,重点讲解了BEPUphysicsintv1库,涉及定点数计算原理、优点与缺点,以及该库的性能特点。后续将深入探讨如何在项目中实现和使用定点3D物理引擎。
摘要由CSDN通过智能技术生成

帧同步的游戏中如果用物理引擎,为了保证不同设备上的结果一致,需要采用定点数来计算迭代游戏过程中的物理运算。也就是我们通常说的定点数物理引擎(确定性物理引擎)。本系列教程给大家详细的讲解如何在你的项目中内置一个确定性物理引擎。确定性物理引擎我们使用github上开源的物理引擎BEPUphysicsint v1库。本节内容主要有:

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

https://github.com/sam-vdp/bepuphysics1int

定点数计算的原理与优缺点

首先来给第一次接触定点数的开发者介绍一下定点数计算的基本原理。定点数计算的原理很简单, 例如: 1.2 * 1.2, 我们用整数来模拟小数,原理就是确定一个精度,把小数的小数部分放大, 比如1.2, 我们确定精度为在10进制下精确到小数点后1位, 那么1.2对应的定点数为12, (定点数是对应的小数扩大10倍后取整), 如果确定精度是小数点后2位,那么1.2对应的定点数位120(定点数是对应的小数扩大100倍)。我们都知道计算机是二进制的,一个int在32位的机器上, 为32bit, 最高位表示的是符号位,剩下的是31位, 31位中多少表示小数位,就代表定点数的精度。比如 8个bit表示小数部分的精度,那么这个定点数就扩大了2^8。所以1.2变成定点数就是 int (1.2 * 256 = 307.2 整数化后就为307)。

32bit位: 1111 1111 1111 1111 1111 1111 1111 1111, 当你把精度定在哪个bit位,就相当于把小数点定在了多少位, 如上面, 小数点定在了8bit地方, 1111 1111 1111 1111 1111 1111. 1111 1111所以叫做”定点数”。通过扩大倍数,把小数部分按照特定的精度变成了整数,后续都基于整数来进行运算。如果我们的物理引擎使用定点数计算,最后虽然将定点数转化为Unity Transform的相关浮点数显示物体位置,但是最终在决定物理碰撞,游戏事件中, 物理移动中都是定点数化后的整数运行,所以这样就做到了物理引擎迭代的确定性。做到了不同机器上跑物理引擎模拟,结果一致。

搞懂了原理后,我们来看下定点数的加,减,乘,除的模拟,以上述小数点后一位小数为例(扩大10倍):

1.2 * 1.2 = 1.44 12 * 12 = 144 / 10 = 14

除法: 两个定点数的除法,分子,分母都扩大10倍,结果相当于没有扩大, 我们可以先把分子再继续扩大十倍,然后再除以分母。也可以把分母缩小10倍再计算(有很多种处理方式)。一般做除法,我们会把分子扩大10倍,再除以分母。1.4 / 1.2 = 1.166 定点数: 14 * 10 / 12 = 11,表示的结果为1.1,也是精确到小数点后1位。

搞懂了上述的计算过程后,我们知道定点数的优点就是都是基于整数计算,结果确定,在没有浮点运算器的CPU下计算性能好接下来分析下定点数计算的缺点,就是定点数在做乘法 or 除法的时候容易溢出。我们拿乘法为例,假设32 bit的整数,16bit作为小数部分,那么就是 15.16的定点数(最高表示符号,15个bit表示整数部分,16bit表示小数部分),如果两个数相乘,很大的概率就溢出了(计算结果超过32bit)。如2^20与2^21两个定点数相乘为: (2^20 * 2^21)/ (2^16) = 2^41 / 2^16, 计算分子相乘的时候得2^41次,在32bit的int存储中就溢出了。 而2^20与2^21都是合法的定点数。

BEPUphysicsint v1的由来

在github中有一个开源的3D物理引擎的项目,叫做BEPUphysics, 它分成了v1, v2两个重大版本的分支如图1.1-1:

图1.1-1

BEPUphysicsint v1 开源项目是将BEPUphysics v1的代码中的浮点运算用定点数来代替而fork出的一个分支。BEPUphysicsint v1与BEPUphysics v1使用方式上基本都是一致的,只是内部采用的是定点与浮点的区别。在BEPUphysicsint这个项目中,采用定点数,所以精度很有限,无法达到浮点的精度,而且经常容易溢出,所以它有一个要求,物理世界中x, y, z每个轴的范围在1000的范围内。BEPUphysicsint 定点数物理引擎的性能要比BEPUphysics float版本的性能要差4倍左右。以后可能差距没有那么大,但是定点数版本的要比浮点数版本的性能差。如图1.1-2:

图1.1-2 官方关于性能与精度的介绍

今天的分享就到这里了, 关注我们, 接下来还会继续更新定点3D物理引擎系列教程。

下节预告: 基于BEPUphysicsint的使用详解

Unity物理引擎使用的是计算机中的定点数(Fixed Point)来进行计算。定点数是一种用固定小数部分的数来表示实数的数值表示方法。 在计算机中,浮点数和定点数是两种常见的表达实数的方式。浮点数使用科学计数法来表示实数,它包含小数部分和指数部分。由于浮点数的存储和计算都需要考虑指数部分,所以相对于定点数来说,浮点数的运算速度更慢。 而定点数则采用一种固定的小数位来表示实数,没有指数部分。在Unity物理引擎中,使用定点数可以提高运算速度和准确性,因为它不需要进行复杂的浮点数运算,只需要进行简单的整数运算即可。 Unity物理引擎使用的是定点数的一种特殊形式,称为"Fixed"。在Unity中,Fixed数据类型类似于整数,但实际上它以定点数的形式进行存储和计算。Fixed数据类型将一个整数分为整数部分和小数部分,小数部分的位数是固定的,通常为16位。通过使用Fixed数据类型,Unity可以在进行物理计算时更加准确地模拟物理行为,同时也能提高运算速度,使游戏运行更加流畅。 总之,Unity物理引擎使用的是定点数来进行计算。它通过定义一个固定的小数部分来表示实数,并且通过使用Fixed数据类型来存储和计算这些实数。这种使用定点数的方式可以提高运算速度和准确性,在物理模拟和游戏开发中起到非常重要的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值