国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Javascript如何實(shí)現(xiàn)GPU加速?

susheng / 2746人閱讀

摘要:綁定并編譯著色器程序創(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

相關(guān)文章

  • 瀏覽器之硬件加速機(jī)制

    摘要:書(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ì)盡力解決你...

    mengera88 評(píng)論0 收藏0
  • 硬件加速

    摘要:但硬件加速是把雙刃劍,過(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...

    mo0n1andin 評(píng)論0 收藏0
  • 硬件加速

    摘要:但硬件加速是把雙刃劍,過(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...

    xiaotianyi 評(píng)論0 收藏0
  • 瀏覽器渲染簡(jiǎ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)?? 為...

    Yang_River 評(píng)論0 收藏0
  • 瀏覽器渲染簡(jiǎ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)?? 為...

    shuibo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<