溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在three.js中使用多線程

發(fā)布時間:2021-01-08 16:06:32 來源:億速云 閱讀:355 作者:Leah 欄目:開發(fā)技術

本篇文章為大家展示了如何在three.js中使用多線程,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

1. 在three.js中使用多線程

在three.js中使用Web Worker經(jīng)常發(fā)生在大量計算造成CUP阻塞的情況下,我們舉一個例子,比如說我們制作了1000個Mesh,

如何在three.js中使用多線程

讓他們簡單的動起來,CPU幾乎沒有什么壓力,F(xiàn)PS會在60左右,但是如果讓這1000個Mesh的位置都需要大量計算才能得到,那么FPS就會很低(和計算量成負相關),下面是一段代碼

for(let i=0; i<num; i++) {
 let angle = positions[i].y / (1000 / (Math.PI * 10));
 positions[i].x = positions[i].x + Math.sin(angle);
 positions[i].z = positions[i].z + Math.cos(angle);
 positions[i].y = positions[i].y + 1;
		//上面就是簡單的位置變化,下面的代碼模擬復雜的變化,累加100000次(這是非常占用線程的情況)
 for(let j=1, total=1; j<=100000; j++) {
 total += j;
 }
 if(positions[i].y > 500) {
 positions[i].y = positions[i].y - 1000;
 }
}
for(var i=0; i<num; i++) {
 group.children[i].position.set(positions[i].x, positions[i].y, positions[i].z);
}

positions是儲存1000個Mesh位置信息的數(shù)組,group里面儲存了所有的Mesh,每次渲染都更改positions的位置信息,然后給Group的每一個Mesh設置新值,這種情況下FPS會低至7FPS,轉(zhuǎn)動場景可以很明顯的感覺到卡頓。接下來我們使用Web Worker處理這個問題,主線程代碼如下

myWorker = new Worker('/static/js/worker.js');
myWorker.postMessage(positions);
myWorker.onmessage = e => {
 let positions = e.data;
 for(var i=0; i<num; i++) {
 group.children[i].position.set(positions[i].x, positions[i].y, positions[i].z);
 }
}

腳本代碼如下

onmessage = function(e) {
 let num = 1000;
 let positions = e.data;
 setInterval(e => {
 for(let i=0; i<num; i++) {
  let angle = positions[i].y / (1000 / (Math.PI * 10));
  positions[i].x = positions[i].x + Math.sin(angle);
  positions[i].z = positions[i].z + Math.cos(angle);
  positions[i].y = positions[i].y + 1;
  for(let j=1, total=1; j<=100000; j++) {
  total += j;
  }
  if(positions[i].y > 500) {
  positions[i].y = positions[i].y - 1000;
  }
 }
 postMessage(positions);
 }, 1000 / 60)
};

主要代碼和未使用Web Worker幾乎一樣,只不過是將處理位置的代碼放在新的線程中完成,setInterval定時器每一次完成位置計算都會通過postMessage(positions)將位置信息返回給主線程,主線程通過onmessage接受信息,返回對象的data屬性就是新的positions。這樣一來FPS可以達到60左右,轉(zhuǎn)動場景感覺的到卡頓。這是十分讓人欣喜的。

2. 性能分析

前面已經(jīng)說了在每一次位置計算中做10萬次累加,未使用Web Worker的情況下FPS降到了7,下面是更多的數(shù)據(jù)(數(shù)據(jù)僅做對比,和當前使用情況以及配合有關)。

累加次數(shù)(萬次)使用Web Worker未使用Web Worker
16060
36039
56026
76011
9608
11606

這里面可以看出,不管是多么大量的計算,使用Web Worker都不會影響主線程,但是對于未使用Web Worker影響是十分嚴重的,下面展示一下兩種情況下電腦性能的對比

(未使用Web Worker)

如何在three.js中使用多線程

(使用Web Worker)

如何在three.js中使用多線程

上述內(nèi)容就是如何在three.js中使用多線程,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI