代码之家  ›  专栏  ›  技术社区  ›  geometrian

测量WebGL帧延迟

  •  0
  • geometrian  · 技术社区  · 6 年前

    单一的 要渲染的帧。如何在桌面和移动浏览器上都可移植?


    想法1:测量完成之间的延迟:

    gl.finish(); var t0=performance.now();
    //(render)
    gl.finish(); var t1=performance.now();
    var latency = 0.001*( t1 - t0 );
    

    这不管用!铬(故意错误地) aliases gl.finish() gl.flush() ,因此测得的延迟与所做的工作关系不大。


    想法二: Use EXT_disjoint_timer_query / EXT_disjoint_timer_query_webgl2 :

    can be used 在一个划锤式的攻击,所以它是 disabled in all browsers .


    想法三:使用 performance.now() 测量通话间隔时间 window.requestAnimationFrame(...) .

    1 回复  |  直到 6 年前
        1
  •  1
  •   gman    6 年前

    无法从浏览器内部检查延迟。无法知道图像何时会真正出现在屏幕上。浏览器可以是双缓冲区或三缓冲区,操作系统本身通常有一个复合步骤,因此可以添加一个帧,如果用户在电视上使用帧插值,也可以添加一个帧。也许你不是真的想测量“延迟”,但如果你真的想测量“延迟”,那么你只能用外部设备来测量。

    也不能使用度量渲染时间 gl.finish 甚至在OpenGL中也可以直接使用。你不会测量“渲染”时间。您将测量“启动时间”+“渲染时间”+“停止时间”,以便您可以使用 找出一种技术是否比另一种技术快,但你不能使用 总包饰面 了解帧的速度有多快,因为在正常操作中,图形是流水线的,跨多个线程或进程运行。打电话 增加了同步那些线程和进程的开销,这比渲染开销要大得多。

    你可以利用总包饰面计时渲染尽可能小的东西,(一个单一的1像素的纯色三角形)。使用它来测量“同步”多个线程的开销,并从较长渲染的较长计时中减去该时间,但即使这样也会在平铺架构gpu上产生问题,因为平铺架构gpu使用技术来避免过度绘制。

    在任何情况下你都可以模拟 (暂停所有进程)通过调用 gl.readPixels 要读取单个像素,因为为了将该像素转换为JavaScript,所有进程都必须暂停并同步。

    你也不应该使用第一次测量和绘制几次,因为很多东西都是延迟初始化的,所以你的第一次渲染可能比第二次渲染慢。

    所以,步骤应该是

    1. 初始化webgl和所有资源
    2. 使用简单的着色器绘制单个像素
    3. gl.readPixels像素一个像素(刷新上一个东西)
    4. 同步开始=表演。现在()
    5. 使用简单的着色器绘制单个像素
    6. gl.readPixels像素单个像素
    7. 绘图开始=表演。现在()
    8. 画出你想测量的东西
    9. gl.readPixels像素单个像素
    10. 渲染时间=(表演。现在()-drawStart)-同步时间