最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Unity 3D定點(diǎn)數(shù)物理引擎實(shí)戰(zhàn)系列1.1BEPUphysicsint 3D定點(diǎn)數(shù)物理引擎介紹

2022-07-21 14:08 作者:博毅創(chuàng)為  | 我要投稿

Unity 3D定點(diǎn)數(shù)物理引擎實(shí)戰(zhàn)系列

1.1BEPUphysicsint 3D定點(diǎn)數(shù)物理引擎介紹

幀同步的游戲中如果用物理引擎,為了保證不同設(shè)備上的結(jié)果一致,需要采用定點(diǎn)數(shù)來計(jì)算迭代游戲過程中的物理運(yùn)算。也就是我們通常說的定點(diǎn)數(shù)物理引擎(確定性物理引擎)。本系列教程給大家詳細(xì)的講解如何在你的項(xiàng)目中內(nèi)置一個(gè)確定性物理引擎。確定性物理引擎我們使用github上開源的物理引擎BEPUphysicsint v1庫(kù)。本節(jié)內(nèi)容主要有:

定點(diǎn)數(shù)計(jì)算的原理與優(yōu)缺點(diǎn);

BEPUphysicsint v1的由來;

BEPUphysicsint v1項(xiàng)目的github地址:

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

定點(diǎn)數(shù)計(jì)算的原理與優(yōu)缺點(diǎn)

首先來給第一次接觸定點(diǎn)數(shù)的開發(fā)者介紹一下定點(diǎn)數(shù)計(jì)算的基本原理。定點(diǎn)數(shù)計(jì)算的原理很簡(jiǎn)單, 例如: 1.2 * 1.2, 我們用整數(shù)來模擬小數(shù),原理就是確定一個(gè)精度,把小數(shù)的小數(shù)部分放大, 比如1.2, 我們確定精度為10進(jìn)制下精確到小數(shù)點(diǎn)后1, 那么1.2對(duì)應(yīng)的定點(diǎn)數(shù)為12, (定點(diǎn)數(shù)是對(duì)應(yīng)的小數(shù)擴(kuò)大10倍后取整), 如果確定精度是小數(shù)點(diǎn)后2位,那么1.2對(duì)應(yīng)的定點(diǎn)數(shù)位120(定點(diǎn)數(shù)是對(duì)應(yīng)的小數(shù)擴(kuò)大100倍)。我們都知道計(jì)算機(jī)是二進(jìn)制的,一個(gè)int在32位的機(jī)器上, 為32bit, 最高位表示的是符號(hào)位,剩下的是31位, 31位中多少表示小數(shù)位,就代表定點(diǎn)數(shù)的精度。比如 8個(gè)bit表示小數(shù)部分的精度,那么這個(gè)定點(diǎn)數(shù)就擴(kuò)大了2^8。所以1.2變成定點(diǎn)數(shù)就是 int (1.2 * 256 = 307.2 整數(shù)化后就為307)。

32bit位: 1111 1111 1111 1111 1111 1111 1111 1111, 當(dāng)你把精度定在哪個(gè)bit位,就相當(dāng)于把小數(shù)點(diǎn)定在了多少位, 如上面, 小數(shù)點(diǎn)定在了8bit地方, 1111 1111 1111 1111 1111 1111?. 1111 1111所以叫做”定點(diǎn)數(shù)”。通過擴(kuò)大倍數(shù),把小數(shù)部分按照特定的精度變成了整數(shù),后續(xù)都基于整數(shù)來進(jìn)行運(yùn)算。如果我們的物理引擎使用定點(diǎn)數(shù)計(jì)算,最后雖然將定點(diǎn)數(shù)轉(zhuǎn)化為Unity Transform的相關(guān)浮點(diǎn)數(shù)顯示物體位置,但是最終在決定物理碰撞,游戲事件中, 物理移動(dòng)中都是定點(diǎn)數(shù)化后的整數(shù)運(yùn)行,所以這樣就做到了物理引擎迭代的確定性。做到了不同機(jī)器上跑物理引擎模擬,結(jié)果一致。

搞懂了原理后,我們來看下定點(diǎn)數(shù)的加,減,乘,除的模擬,以上述小數(shù)點(diǎn)后一位小數(shù)為例(擴(kuò)大10倍):

加法:?直接讓兩個(gè)定點(diǎn)數(shù)相加即可, 1.2 + 1.2 = 2.4, 12 + 12 = 24

減法:?直接上兩個(gè)定點(diǎn)數(shù)相減即可, 1.2 – 1.4 = -0.2 12 – 14 = -2;

乘法:?兩個(gè)定點(diǎn)數(shù)相乘相當(dāng)于多擴(kuò)大了一倍,最后再除以精度倍數(shù)

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

除法:兩個(gè)定點(diǎn)數(shù)的除法,分子,分母都擴(kuò)大10倍,結(jié)果相當(dāng)于沒有擴(kuò)大, 我們可以先把分子再繼續(xù)擴(kuò)大十倍,然后再除以分母。也可以把分母縮小10倍再計(jì)算(有很多種處理方式)。一般做除法,我們會(huì)把分子擴(kuò)大10倍,再除以分母。1.4 / 1.2 = 1.166 定點(diǎn)數(shù): 14 * 10 / 12 = 11,表示的結(jié)果為1.1,也是精確到小數(shù)點(diǎn)后1位。

搞懂了上述的計(jì)算過程后,我們知道定點(diǎn)數(shù)的優(yōu)點(diǎn)就是都是基于整數(shù)計(jì)算,結(jié)果確定,在沒有浮點(diǎn)運(yùn)算器的CPU下計(jì)算性能好。接下來分析下定點(diǎn)數(shù)計(jì)算的缺點(diǎn),就是定點(diǎn)數(shù)在做乘法?or?除法的時(shí)候容易溢出。我們拿乘法為例,假設(shè)32 bit的整數(shù),16bit作為小數(shù)部分,那么就是 15.16的定點(diǎn)數(shù)(最高表示符號(hào),15個(gè)bit表示整數(shù)部分,16bit表示小數(shù)部分),如果兩個(gè)數(shù)相乘,很大的概率就溢出了(計(jì)算結(jié)果超過32bit)。如2^20與2^21兩個(gè)定點(diǎn)數(shù)相乘為:?(2^20 * 2^21)?/ (2^16) =?2^41?/ 2^16, 計(jì)算分子相乘的時(shí)候得2^41次,在32bit的int存儲(chǔ)中就溢出了。而2^20與2^21都是合法的定點(diǎn)數(shù)。

BEPUphysicsint v1的由來

在github中有一個(gè)開源的3D物理引擎的項(xiàng)目,叫做BEPUphysics, 它分成了v1, v2兩個(gè)重大版本的分支如圖1.1-1:


BEPUphysicsint v1 開源項(xiàng)目是將BEPUphysics v1的代碼中的浮點(diǎn)運(yùn)算用定點(diǎn)數(shù)來代替而fork出的一個(gè)分支。BEPUphysicsint v1與BEPUphysics v1使用方式上基本都是一致的,只是內(nèi)部采用的是定點(diǎn)與浮點(diǎn)的區(qū)別。在BEPUphysicsint這個(gè)項(xiàng)目中,采用定點(diǎn)數(shù),所以精度很有限,無法達(dá)到浮點(diǎn)的精度,而且經(jīng)常容易溢出,所以它有一個(gè)要求,物理世界中x, y, z每個(gè)軸的范圍在1000的范圍內(nèi)。BEPUphysicsint?定點(diǎn)數(shù)物理引擎的性能要比BEPUphysics float版本的性能要差4倍左右。以后可能差距沒有那么大,但是定點(diǎn)數(shù)版本的要比浮點(diǎn)數(shù)版本的性能差。如圖1.1-2:


如果在實(shí)際的項(xiàng)目中發(fā)現(xiàn)性能問題,也可以自己實(shí)現(xiàn)物理引擎或者基于自己項(xiàng)目實(shí)現(xiàn)一個(gè)閹割版的高性能物理引擎。

今天的分享就到這里了, 關(guān)注我們, 接下來還會(huì)繼續(xù)更新定點(diǎn)3D物理引擎系列教程。

下節(jié)預(yù)告:?基于BEPUphysicsint的使用詳解

附:視頻教程

Unity / 精選推薦

Unity幀同步核心技術(shù):3D定點(diǎn)數(shù)物理引擎架構(gòu)實(shí)戰(zhàn)

https://www.bycwedu.com/promotion_channels/1454843650

Unity 3D定點(diǎn)數(shù)物理引擎實(shí)戰(zhàn)系列1.1BEPUphysicsint 3D定點(diǎn)數(shù)物理引擎介紹的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
遂川县| 洮南市| 祁门县| 峨眉山市| 洪泽县| 凤冈县| 色达县| 丰台区| 安远县| 嘉禾县| 长丰县| 灵石县| 循化| 三原县| 大姚县| 广汉市| 嘉祥县| 泰来县| 隆德县| 饶平县| 黔西| 绥阳县| 诸城市| 辽阳县| 道真| 静安区| 泾川县| 博爱县| 同江市| 观塘区| 安丘市| 韶山市| 东海县| 昌宁县| 嫩江县| 安岳县| 浦江县| 大关县| 洮南市| 江油市| 偏关县|