一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - three.js中多線程的使用及性能測試詳解

three.js中多線程的使用及性能測試詳解

2021-12-28 17:42郭先生的博客 js教程

這篇文章主要給大家介紹了關于three.js中多線程的使用及性能測試的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

今天郭先生說一下WebWorker以及WebWorker在three.js中的應用。我們都知道Javascript是單線程的,比如執行js代碼的同時UI渲染就會停止,對于多核CPU的點腦,這一點讓人難以接受,好在Web Worker的出現多少解決了一些問題。官方說Web Worker指的是一種可由腳本創建的后臺任務,任務執行中可以向其創建者收發信息。要創建一個 Worker ,只須調用 Worker(URL) 構造函數,函數參數 URL 為指定的腳本。關于Web Worker的更多知識請閱讀Web Worker。線案例請點擊web-worker,

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

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

three.js中多線程的使用及性能測試詳解

讓他們簡單的動起來,CPU幾乎沒有什么壓力,FPS會在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位置信息的數組,group里面儲存了所有的Mesh,每次渲染都更改positions的位置信息,然后給Group的每一個Mesh設置新值,這種情況下FPS會低至7FPS,轉動場景可以很明顯的感覺到卡頓。接下來我們使用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左右,轉動場景感覺的到卡頓。這是十分讓人欣喜的。

2. 性能分析

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


累加次數(萬次) 使用Web Worker 未使用Web Worker
1 60 60
3 60 39
5 60 26
7 60 11
9 60 8
11 60 6

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

(未使用Web Worker)

three.js中多線程的使用及性能測試詳解

(使用Web Worker)

three.js中多線程的使用及性能測試詳解

這里可以看出使用更多的線程可以很明顯的提升CPU使用率。小伙伴們不妨打開線上案例親自測試一下。

總結

到此這篇關于three.js中多線程的使用及性能測試的文章就介紹到這了,更多相關three.js多線程使用及性能測試內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

版權聲明:本文為郭志強的原創文章,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://www.mrguo.link

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人国产在线播放 | 91短视频在线免费观看 | 免费国产高清精品一区在线 | 日本不卡视频免费的 | 欧美亚洲视频在线观看 | 精品国产一级在线观看 | 国产精品福利在线观看入口 | 动漫美女被吸乳羞羞小说 | 精品亚洲一区二区三区在线播放 | 激情五月姐姐 | 国内精品久久久久影院中国 | 波多野结衣在线中文字幕 | 欧美日韩一区二区三区免费 | 好大好湿好硬好爽好深免费视频 | 无人区大片免费播放器 | 3黑人巨大vs北岛玲 3d肉浦团在线观看 3d动漫免费 | 成人免费草草视频 | 国产精品露脸国语对白手机视频 | 911亚洲精品国内自产 | 久久强奷乱码老熟女 | 精品国产一区二区三区久 | 动漫美女人物被黄漫在线看 | 国产专区视频在线观看 | 日本男女视频 | 白丝校花掀起短裙呻吟小说 | 韩剧在线免费观看 | 国产成年人在线观看 | 日日操天天爽 | 变态女王麻麻小说在线阅读 | 亚洲日本免费 | 扒开老师挠尿口到崩溃刑罚 | 性派对xxxhd| 免费一级欧美片在线观免看 | 久久全国免费观看视频 | 男人j放进女人的p免费看视频 | 91啦丨porny丨蝌蚪 | 大胆国模一区二区三区伊人 | 被教官揉了一晚上的奶小说 | 午夜福到在线2019 | 欧美精选欧美极品 | www.亚洲5555.com|