【问题标题】:Does binding a VAO really take 1ms or is my stopwatch class broken?绑定 VAO 真的需要 1 毫秒还是我的秒表类坏了?
【发布时间】:2014-05-17 06:39:05
【问题描述】:

这是我的秒表课

public class Benchmark {
static long starttime;
static ArrayList<Long> timeList = new ArrayList<Long>();
public static void start() {
    glFinish();
    starttime = System.nanoTime();
}

public static void stop() {
    glFinish();
    timeList.add(System.nanoTime() - starttime);
    if(timeList.size() > 10) {
        Long total = (long) 0 ;
        for(Long time : timeList) {
            total += time;
        }
        System.out.println(((float)total / timeList.size())/1000000 ); 
        timeList.clear();
    }
}

这是简单的基准测试

    Benchmark.start();
    glBindVertexArray(vao);
    Benchmark.stop();

我正在读取 1ms 的值,这怎么可能?我的秒表坏了吗?我注意到如果我注释掉一些绘图调用,那么它会读取 0.2ms 的较低值,这很奇怪,因为它不应该影响这一点。

绑定真的这么贵还是有什么问题?

【问题讨论】:

  • 为什么绘图调用不会影响这个?如果你不使用glFinish() 那么绘图调用不会影响这一点,但你会;)
  • 我对 openGL 代码比你的手表更感兴趣。不过,你为什么要使用 glFinish()。您使用的是旧版 openGL 吗?
  • 实际上,唯一的原因是它需要你超过纳秒(这里谈论现代硬件)是因为你正在使用glFinish()
  • @CoffeeandCode 不一定,验证可能会有可衡量的开销。尽管顶点数组通常是最便宜/最简单的验证资源。不过,你有一个很好的观点......所测量的大部分时间是glFinish (...) 的结果。
  • @AndonM.Coleman 我只是假设驱动程序很好 :L 但glFinish 调用实际上会非常昂贵(当然不是实际调用本身,只是副作用),因为它在返回之前等待任何帧缓冲区/连接/状态更改完成。这意味着任何绘图调用或缓冲区绑定。

标签: opengl graphics shader lwjgl


【解决方案1】:

由于您对glFinish 的调用,您的代码执行可能会花费您获得的时间。

原因是glFinish 导致您的程序停止,直到所有连接/帧缓冲区/状态更改完成:这包括任何绘制调用或缓冲区绑定。

【讨论】:

  • 我在 start() 中调用了 glFInish,因此在计时发生之前缓冲区应该清除任何内容。对……你注意到了吗?
  • @BlazArt 是的,但您也可以在顶点数组绑定之后调用它。完成该功能所需的实际时间将远少于完成该功能的所有副作用所需的时间。
  • @BlazArt 老实说,只需使用 GL 计时器查询对象并避免所有这些废话。它们的分辨率要高得多,为您提供命令在管道中所花费的确切时间,如果您等到它们完成后再读回结果,您将不会停止管道。
  • @BlazArt 是的,我确实注意到了这一点,这对我的回答没有任何影响。在顶点数组绑定中,服务器端有很多副作用。
  • 单独使用 GPU 计时器进行此调用也毫无意义。我不希望直接从此调用生成任何 GPU 命令。状态验证通常会推迟到下一次绘制调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多