Unity 3D定点数物理引擎实战系列1.1BEPUphysicsint 3D定点数物理引擎介绍

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

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀

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

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

BEPUphysicsint v1的由来;

BEPUphysicsint v1项目的github地址:

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 = 2.4, 12 + 12 = 24

减法: 直接上两个定点数相减即可, 1.2 – 1.4 = -0.2 12 – 14 = -2;

乘法: 两个定点数相乘相当于多扩大了一倍,最后再除以精度倍数

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物理引擎系列教程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/260799.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘车载测试:小白也能轻松学习

在现代汽车技术的发展中,车载测试起着至关重要的作用。但是,对于很多人来说,车载测试可能还是一个相对陌生的概念。不用担心!接下来将带你一起深入了解车载测试,并分享一些小白也能轻松学习的方法和技巧! 一…

C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区

1、存储区概念 欧姆龙PLC将整个数据存储器分为10个区:输入继电器区、输出继电器区、内部辅助继电器区、特殊继电器区、保持继电器区、暂存继电器区、定时/计数器区、数据存储区、辅助存储继电器区、链接继电器区。 输入输出继电器区 CP1E系列PLC输入继电器区有16…

【Java】深入理解i++、++i

先看两个例子 示例一 public class Test {public static void main(String[] args) {int i 0;int j i;System.out.println("i" i);System.out.println("j" j);} } 示例二 public class Test {public static void main(String[] args) {int i 0;i…

.Net Core webapi RestFul 统一接口数据返回格式

在RestFul风格盛行的年代,大部分接口都需要一套统一的数据返回格式,那么我们怎么才能保证使用统一的json数据格式返回呢,下面给大家简单介绍一下: 假如我们需要接口统一返回一下数据格式: {"statusCode": …

LEFT JOIN

通過中間表説明 biz_email_sent table1 biz_email table2 biz_email_sent_address 中間表 LEFT JOIN 是 JOIN 左邊的記錄(biz_email_sent id52)全部查出,比如52 的記錄全部查出。 即使中間表se.sa_email_id 在 table2中找不到&#xff0c…

Centos7配置静态ip地址

目录结构 Centos7配置静态ip地址查看网关进入存放ip地址的目录修改ip地址的文件重启网络检查ip地址 Centos7配置静态ip地址 查看网关 编辑–>虚拟网络编辑器–>NAT设置 记住这个网关地址 进入存放ip地址的目录 cd /etc/sysconfig/network-scripts/ 修改ip地址的文件 …

Windows下安装MongoDB实践总结

本文记录Windows环境下的MongoDB安装与使用总结。 【1】官网下载 官网下载地址:Download MongoDB Community Server | MongoDB 这里可以选择下载zip或者msi,zip是解压后自己配置,msi是傻瓜式一键安装。这里我们分别对比进行实践。 【2】ZI…

LeetCode 19 删除链表的倒数第 N 个结点

题目描述 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1…

什么是OEM分区?能不能删除OEM分区?

在某些电脑中,打开磁盘管理时会发现有一个OEM分区,那么这个OEM分区是什么意思呢?能不能删除呢?下面我们就来了解一下。 什么是OEM分区? OEM分区通常是品牌机厂商预装系统或软件以及一键还原的分区。OEM分区中的文件可…

在线更换Proxmox VE超融合集群Ceph OSD磁盘

因为资源紧张的原因,担心一旦关机,虚拟机因为没有空闲的资源而被冻结,以致于不能漂移,导致部分服务停止,只好让机房帮忙热插拔。 幸运的是,插上去能够被系统所识别(/dev/sdf就是新插入的硬盘&am…

【MYSQL】-表的操作

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

acwing-蓝桥杯C++ AB组辅导课Day2-递归习题+递推+二分

感谢梦翔老哥的蓝桥杯C AB组辅导课~ 递归习题: 1.递归实现组合型枚举 题意: 题目要求输出组合枚举,与排列不同,排列具有顺序之分,对于组合来说,是没有顺序之分的,所以[1,2,3]和[3,2,1]被看成同…

PyQt6 QTableWidget表格控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计50条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

神经网络:优化器和全连接层

SGD(随机梯度下降) 随机梯度下降的优化算法在科研和工业界是很常用的。 很多理论和工程问题都能转化成对目标函数进行最小化的数学问题。 举个例子:梯度下降(Gradient Descent)就好比一个人想从高山上奔跑到山谷最低…

23年12月AI烟火识别系统应用案例-北京梅兰芳故居防火系统

AI烟火识别智能视频分析系统在文化遗产保护领域的应用,尤其是在梅兰芳故居防火系统的部署,是现代科技与传统文化保护结合的典范。这篇文章将详细介绍富维烟火识别系统的设计、实施及其在23年12月在北京梅兰芳故居中的应用。 背景介绍 ● 梅兰芳故居的重要…

Ubuntu20.04.2-mate上Lazarus安装与测试

简言 Lazarus采用RAD方式界面开发,一套代码可交差编译出windows、ios、android、solaris、BSD等 各平台运行的程序,在unbuntu的repo中有2.2.0版本可用,在sourceforge上有2.2.6版本和3.0.0的Rolling版可下载安装,但感觉上2.2.0和2…

【实时绘画】comfyUI 实时绘画工作流 - 投屏

原理:(可用方案) 1:利用DesignDoll(人体控制模型)comfyUI实现 实时绘制人物对话场景 2:利用krita投影 实时绘制 场景人物 3:利用posemy.art进行实时绘画 设置有关模型。如果要开启lora&#xff…

C/C++与MySQL:多线程、大并发和异步操作的实践

C/C与MySQL:多线程、大并发和异步操作的实践 在前面的文章中,我们介绍了如何使用C/C调用MYSQL API进行基本的数据库操作。然而,在实际应用中,特别是面对大量用户请求和高并发场景时,单线程的数据库操作往往显得力不从…

内网离线部署Ant Design离线文档离线api antd离线组件api

我们经常会遇到需要在内网开发不方便查看api的尴尬情况,文本用最简单的nginx,让你十分钟部署好本地的离线antd文档,想在哪用在哪用,妈妈在也不用担心我啦 1.x及以下的只要到官网下载gh-pages分支,放到nginx里&#xf…

在centos7.9上安装Jenkins的安装过程

1.jenkins的安装和配置: 安装JDK: yum install -y fontconfig java-11-openjdk # 安装目录:/usr/lib/jvm # fontconfig 是 Linux 系统中用于配置和管理字体的一种工具 下载jenkins安装包: sudo wget -O /etc/yum.repos.d/jenkins…