如何避免webGL着色器加载给cpu带来太多负载
how to avoid webGL shader loading putting too much load on cpu
当加载几个强大的着色器程序时,webGl会给cpu带来很大压力,使UI停滞,有时甚至会触发chrome的cpu看门狗,从而杀死页面。
在这种情况下,我能做些什么来显示"加载"屏幕,并限制我的处理器使用量,这样我就不会被chrome激怒?
相关的代码部分,最终导致这些实际的webGL调用:
var p = this.program = gl.createProgram();
gl.attachShader(p, this.makeShader(gl.VERTEX_SHADER, vertex));
gl.attachShader(p, this.makeShader(gl.FRAGMENT_SHADER, fragment));
gl.linkProgram(p);
的几个想法
-
你可以尝试等待几帧来检查的结果
var vs = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vs, vSource); gl.compileShader(vs); var fs = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fs, vSource); gl.compileShader(fs); var p = gl.createProgram(); gl.attachShader(p, vs); gl.attachshader(p, fs); gl.linkProgram(p); gl.flush(); // Important! setTimeout(checkResults, 2000); // check results 2 seconds later function checkResults() { var status = gl.getProgramParameter(p, gl.LINK_STATUS); ... }
至少在Chrome中,这可能意味着GPU进程将编译程序,而渲染进程(运行JavaScript的进程)将继续运行,因此至少JavaScript不会被阻止,当然,除非在检查结果时还没有完成。
-
将东西分解为多个步骤
var tasks = []; addTask(compileVertexShader); addTask(compileFragmentShader); addTask(linkProgram); addTask(render); function addTask(fn) { tasks.push(fn); runNextTask(); } var taskRunning = false; function runNextTask() { if (taskRunning) { return; } var taskFn = tasks.shift(); if (taskFn) { taskRunning = true; setTimeout(function() { taskRunning = false; taskFn(); runNextTask(); }, 1); } } function compileVertexShader() { ... } function compileFragmentShader() { ... } function linkProgram() { ... } function render() { ... }
只要一个功能不需要太长时间,就不会有任何问题。
有一些常见的库可以帮助处理这类事情。例如异步库。
相关文章:
- 一个html元素的克隆次数太多
- ExtJS类的最佳实践最终导致了太多的.JS文件.性能怎么样
- 使用.slice分页选择了太多项目
- 堆排序实现进行了太多比较
- 如何在不每秒调用太多次的情况下通过Soundcloud解析api进行循环
- 如何修复“;太多递归”;ReactJS中的错误
- 为什么fs.readFile在windows上花费太多时间
- 如何避免webGL着色器加载给cpu带来太多负载
- node.js 需要太多的 TCP 套接字
- JavaScript循环迭代太多
- 函数崩溃,因为太多迭代jQuery
- 为什么不'当用户输入空格或字符太多/不够时,此函数会发出window.alert
- Angularjs:为什么重复做太多的工作
- Node.js错误:参数太多上传批量数据时出错
- ng重复调用控制器功能的次数太多
- 我正在验证一个联系人表单.我是不是过滤太多了
- Jquery-append函数花费了太多时间
- 为什么首先单击文档空白处的任何位置启动代码,而不是单击超链接,以及为什么打开了太多选项卡
- 如何实时检测键盘输入,并且不要在Javascript上浪费太多CPU资源
- 如何cpu密集是太多的node.js(担心阻塞事件循环)