blink中走cmd的意义 https://www.chromium.org/developers/design-documents/gpu-command-buffer/#goals
- 安全性。分配一个texture,buffer内可能存在上个页面的密码、用户信息等内容。
- Chromium GPU 兼容性,收口方便统一处理。
- 跨进程IPC通信,cmd减少ipc服务端频繁通信的成本。
- 小程序场景。
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/
- 二进制模式,encode decode是如何做的呢?解析。每个command长度是固定的。所以不需要编码时加入结束标记。解码时,从第一个command开始读取。对于string这种变长的,则编码时第二个代表len,从第三位开始为内容。
- 为了达到每个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); - 四字节对齐。
- 需要同步时,则立即执行batchrender。
- 资源类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;
},
网友评论