2022-07-05 commandbuffer

blink中走cmd的意义 https://www.chromium.org/developers/design-documents/gpu-command-buffer/#goals

  1. 安全性。分配一个texture,buffer内可能存在上个页面的密码、用户信息等内容。
  2. Chromium GPU 兼容性,收口方便统一处理。
  3. 跨进程IPC通信,cmd减少ipc服务端频繁通信的成本。
  1. 小程序场景。
    1.1 通信层
    1.1.1 走jsbridge,通信成本高,通信成本 和 cmdbuffer encode的js运行成本之间的pk。jsc无jit无加速。大量调用才有优势。
    1.1.2 走binding,通信成本不高。cmd的优势是可 回放、跨进程IPC时的高效性。
    1.1.3 是否存在跨进程成本。

1.2
图形api驱动层
绘制10个 绘制1000个三角形 对gpu的影响无差异,但是分批的话由于调用驱动的通信成本高,对cpu的性能有影响。所以要合并数据集的合批处理。

分层级 渲染API 图形API

From RenderLayers to GraphicsLayers

Chromium GPU 渲染的流程大汇总。
https://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome/

案例 https://github.com/HelloHuDi/AndroidReverseNotes/blob/master/docs/weixin_7.0.4_source/%E5%8F%8D%E7%BC%96%E8%AF%91%E6%BA%90%E7%A0%81/%E5%8F%8D%E6%B7%B7%E6%B7%86%E5%90%8E/src/main/assets/wxa_library/commandbuffer.js

  1. 二进制模式,encode decode是如何做的呢?解析。每个command长度是固定的。所以不需要编码时加入结束标记。解码时,从第一个command开始读取。对于string这种变长的,则编码时第二个代表len,从第三位开始为内容。
  2. 为了达到每个command都是长度可固定原则。不允许重载函数。比如texImage2D的入参可有很多种组合。每个组合被定义为独立的commnd_id。比如。
    commandBufferData.pushInt32Array([28, a, b, c, d, e], 6);
    commandBufferData.pushInt32Array([29, a, b, c, d, e, f, g, h], 9);
  3. 四字节对齐。
  4. 需要同步时,则立即执行batchrender。
  5. 资源类obj是在js中构建管理的。对二进制模式传递的都是 index_id。 program。
    createProgram: function () {
    var data = _(this);
    checkContextChange(data.ctxid);
    commandBufferData.pushInt32(10);
    var program = {};
    var programId = commandBufferData.batchRender();
    data.programObjs.set(program, programId);
    data.webglObjs.set('Program-' + programId, program);
    return program;
    },

你可能感兴趣的:(2022-07-05 commandbuffer)