摘要:綁定并編譯著色器程序創(chuàng)建程序?qū)ο髠魅腠旤c(diǎn)數(shù)據(jù),創(chuàng)建一個(gè)面覆蓋整個(gè)畫(huà)布。有無(wú)現(xiàn)成類(lèi)庫(kù)大家可以看到,我實(shí)現(xiàn)的中,并沒(méi)有將轉(zhuǎn)換成著色器語(yǔ)言類(lèi),而是用戶(hù)直接傳入著色器代碼。但是上已有將轉(zhuǎn)換為著色器語(yǔ)言的庫(kù)。
歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~
本文由騰訊Bugly發(fā)表于云+社區(qū)專(zhuān)欄1. 什么是Javascript實(shí)現(xiàn)GPU加速?
CPU與GPU設(shè)計(jì)目標(biāo)不同,導(dǎo)致它們之間內(nèi)部結(jié)構(gòu)差異很大。 CPU需要應(yīng)對(duì)通用場(chǎng)景,內(nèi)部結(jié)構(gòu)非常復(fù)雜。 而GPU往往面向數(shù)據(jù)類(lèi)型統(tǒng)一,且相互無(wú)依賴(lài)的計(jì)算。 所以,我們?cè)赪eb上實(shí)現(xiàn)3D場(chǎng)景時(shí),通常使用WebGL利用GPU運(yùn)算(大量頂點(diǎn))。 但是,如果只是通用的計(jì)算場(chǎng)景呢?比如處理圖片中大量像素信息,我們有辦法使用GPU資源嗎?這正是本文要講的,GPU通用計(jì)算,簡(jiǎn)稱(chēng)GPGPU。
2. 實(shí)例演示:色塊識(shí)別如下圖所示,我們識(shí)別圖片中彩虹糖色塊,給糖果添加表情。
2.1 實(shí)例地址(打開(kāi)頁(yè)面后,依次點(diǎn)擊按鈕“使用CPU計(jì)算”、“使用GPU計(jì)算”)http://tgideas.qq.com/2018/br...
2.2 運(yùn)行代碼var rgb2hsv = function(r, g, b) { var max = Math.max(r, g, b), min = Math.min(r, g, b), d = max - min, h, s = (max === 0 ? 0 : d / max), v = max / 255; switch (max) { case min: h = 0; break; case r: h = (g - b) + d * (g < b ? 6: 0); h /= 6 * d; break; case g: h = (b - r) + d * 2; h /= 6 * d; break; case b: h = (r - g) + d * 4; h /= 6 * d; break; } return { h: self.hueIndexs[parseInt(h*360)], s: s, v: v } };
運(yùn)行次數(shù):262144次
2.3 測(cè)試結(jié)論實(shí)例中,我們分別使用GPU和CPU進(jìn)行色相轉(zhuǎn)換(防止光線影響識(shí)別準(zhǔn)確度),其余步驟均一致。
2.4 使用GPGPU意義GPU與CPU數(shù)據(jù)傳輸過(guò)程,與GPU實(shí)際運(yùn)算耗時(shí)相當(dāng),所以使用GPU運(yùn)算傳輸成本過(guò)高,實(shí)測(cè)在Android中具有較大優(yōu)勢(shì)。
本測(cè)試案例是從webAR項(xiàng)目中抽取,需要實(shí)時(shí)跟蹤用戶(hù)攝像頭處理視頻流(256*256),使用GPU計(jì)算意義非常大,否則無(wú)法實(shí)現(xiàn)實(shí)時(shí)跟蹤。
3. 如何實(shí)現(xiàn)GPU通用計(jì)算? 3.1 首先,我們通過(guò)一張流程圖,演示原理 3.2 實(shí)現(xiàn)3.2.1 創(chuàng)建頂點(diǎn)著色器,只是傳遞了貼圖坐標(biāo)。
attribute vec4 position; varying vec2 vCoord;void main() { vCoord = position.xy * 0.5 + 0.5; gl_Position = position; }
3.2.2 創(chuàng)建片元著色器,根據(jù)貼圖坐標(biāo)貼圖。
precision highp float; varying vec2 vCoord; uniform sampler2D map;void main(void) { vec4 color = texture2D(map, vCoord); gl_FragColor = color; }
3.3.3 根據(jù)如上著色器代碼,創(chuàng)建程序?qū)ο螅兞縞ode是我們要傳入的用于計(jì)算的代碼。
// 綁定并編譯著色器程序var vertexShaderSource = "..."; var fragmentShaderSource = "..." + code + "..."; var vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexShaderSource); gl.compileShader(vertexShader); var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, fragmentShaderSource); gl.compileShader(fragmentShader); // 創(chuàng)建程序?qū)ο?var program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); gl.useProgram(program);
3.3.4 傳入頂點(diǎn)數(shù)據(jù),創(chuàng)建一個(gè)面覆蓋整個(gè)畫(huà)布。
// 頂點(diǎn)數(shù)據(jù)傳輸 var vertices = new Float32Array([-1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0]); var vertexBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); var aPosition = gl.getAttribLocation(program, "position"); gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(aPosition);
3.3.5 傳入原始數(shù)據(jù),本例中傳入我要處理的圖像數(shù)據(jù),作為貼圖,最終繪制到屏幕。
var gl = this.gl; var program = this.program; var texture = gl.createTexture(); var uMap = gl.getUniformLocation(program, "map"); gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.generateMipmap(gl.TEXTURE_2D); gl.uniform1i(uMap, 0); // 繪制 gl.clearColor(0, 0, 0, 1); gl.clear(gl.COLOR_BUFFER_BIT); gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);
3.3.6 從最終繪制的畫(huà)面上,獲取顏色信息作為最終處理結(jié)果數(shù)據(jù)。
var pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4); gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
3.3.7 完整代碼: http://tgideas.qq.com/2018/br...
其實(shí)清楚原理后,整體實(shí)現(xiàn)比較簡(jiǎn)單。 但是對(duì)于不了解WebGL的同學(xué)來(lái)說(shuō),理解上有一定難度,我后續(xù)準(zhǔn)備寫(xiě)一個(gè)系列的WebGL教程,有興趣的同學(xué)可以關(guān)注。
4. 有無(wú)現(xiàn)成類(lèi)庫(kù)?大家可以看到,我實(shí)現(xiàn)的gpu.js中,并沒(méi)有將javascript轉(zhuǎn)換成著色器語(yǔ)言(類(lèi)C),而是用戶(hù)直接傳入著色器代碼。但是github上已有將javascript轉(zhuǎn)換為著色器語(yǔ)言的庫(kù)。 https://github.com/gpujs/gpu.js
為什么我沒(méi)有直接使用呢?
簡(jiǎn)單的使用,2k可以實(shí)現(xiàn)的代碼,不想引入200k的庫(kù);
數(shù)據(jù)輸入輸出可以由自己靈活控制;
著色器語(yǔ)言很簡(jiǎn)單,特別只是使用基礎(chǔ)運(yùn)算邏輯的代碼,沒(méi)必要由庫(kù)從Javascript轉(zhuǎn)換。
沒(méi)有WebGL基礎(chǔ)的同學(xué),建議直接使用https://github.com/gpujs/gpu.js ,從本文理解整體邏輯; 有一定基礎(chǔ)的同學(xué),建議由http://tgideas.qq.com/2018/br... 自己定制,更為靈活。
問(wèn)答
是否有一種方法以編程方式測(cè)試瀏覽器GPU加速?
相關(guān)閱讀
有哪些主流的科學(xué)計(jì)算可以利用GPU加速?
如何使用JavaScript實(shí)現(xiàn)GPU加速神經(jīng)網(wǎng)絡(luò)
CPU與GPU區(qū)別大揭秘
此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,原文鏈接:https://cloud.tencent.com/dev...
歡迎大家前往騰訊云+社區(qū)或關(guān)注云加社區(qū)微信公眾號(hào)(QcloudCommunity),第一時(shí)間獲取更多海量技術(shù)實(shí)踐干貨哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/95912.html
摘要:書(shū)接上文瀏覽器內(nèi)核之渲染基礎(chǔ)硬件加速基礎(chǔ)概念硬件加速技術(shù)是指使用的硬件能力為幫助渲染網(wǎng)頁(yè),在為的作用主要是用來(lái)繪制圖形并且性能特別好。包含的節(jié)點(diǎn)表示的是使用硬件加速的元素或者技術(shù)。 showImg(https://segmentfault.com/img/remote/1460000016348971); 微信公眾號(hào):愛(ài)寫(xiě)bugger的阿拉斯加如有問(wèn)題或建議,請(qǐng)后臺(tái)留言,我會(huì)盡力解決你...
摘要:但硬件加速是把雙刃劍,過(guò)渡的使用硬件加速會(huì)適得其反。所以,一定要牢記不要讓頁(yè)面的每個(gè)元素都使用硬件加速,當(dāng)且僅當(dāng)需要的時(shí)候才為元素創(chuàng)建渲染層。參考文檔無(wú)線性能優(yōu)化動(dòng)畫(huà)及硬件加速高性能動(dòng)畫(huà)與頁(yè)面渲染渲染優(yōu)化層模型 前言 談起瀏覽器的硬件加速,想必大家都知道的一個(gè)技巧就是在用CSS3做動(dòng)畫(huà)時(shí),給元素添加transform: translateZ(0)或者transform: transla...
摘要:但硬件加速是把雙刃劍,過(guò)渡的使用硬件加速會(huì)適得其反。所以,一定要牢記不要讓頁(yè)面的每個(gè)元素都使用硬件加速,當(dāng)且僅當(dāng)需要的時(shí)候才為元素創(chuàng)建渲染層。參考文檔無(wú)線性能優(yōu)化動(dòng)畫(huà)及硬件加速高性能動(dòng)畫(huà)與頁(yè)面渲染渲染優(yōu)化層模型 前言 談起瀏覽器的硬件加速,想必大家都知道的一個(gè)技巧就是在用CSS3做動(dòng)畫(huà)時(shí),給元素添加transform: translateZ(0)或者transform: transla...
摘要:而瀏覽器渲染與密切相關(guān),因此只有了解其中工作原理才能讓更好地工作。瀏覽器也稱(chēng)為布局渲染方式瓦片渲染流暢動(dòng)畫(huà)總結(jié)參考文章瀏覽器用戶(hù)界面包括地址欄前進(jìn)后退按鈕書(shū)簽菜單等。瀏覽器引擎在用戶(hù)界面和渲染引擎之間傳送指令。渲染引擎負(fù)責(zé)顯示請(qǐng)求的內(nèi)容。 singsong: 文本是自己看了一些不錯(cuò)資料整理出來(lái)的,對(duì)該知識(shí)點(diǎn)感興趣的同學(xué)可以查看參考文章小節(jié)。 ??最新內(nèi)容請(qǐng)以github上的為準(zhǔn)?? 為...
摘要:而瀏覽器渲染與密切相關(guān),因此只有了解其中工作原理才能讓更好地工作。瀏覽器也稱(chēng)為布局渲染方式瓦片渲染流暢動(dòng)畫(huà)總結(jié)參考文章瀏覽器用戶(hù)界面包括地址欄前進(jìn)后退按鈕書(shū)簽菜單等。瀏覽器引擎在用戶(hù)界面和渲染引擎之間傳送指令。渲染引擎負(fù)責(zé)顯示請(qǐng)求的內(nèi)容。 singsong: 文本是自己看了一些不錯(cuò)資料整理出來(lái)的,對(duì)該知識(shí)點(diǎn)感興趣的同學(xué)可以查看參考文章小節(jié)。 ??最新內(nèi)容請(qǐng)以github上的為準(zhǔn)?? 為...
閱讀 529·2023-04-25 14:26
閱讀 1284·2021-11-25 09:43
閱讀 3476·2021-09-22 15:25
閱讀 1446·2019-08-30 15:54
閱讀 517·2019-08-30 12:57
閱讀 765·2019-08-29 17:24
閱讀 3165·2019-08-28 18:13
閱讀 2671·2019-08-28 17:52