Opengl 绑定VAO真的需要1毫秒吗?还是我的秒表课坏了?
这是我的秒表课Opengl 绑定VAO真的需要1毫秒吗?还是我的秒表课坏了?,opengl,graphics,shader,lwjgl,Opengl,Graphics,Shader,Lwjgl,这是我的秒表课 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()
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();
}
}
我正在读取1ms的值,这怎么可能?我的秒表坏了吗?我注意到如果我注释掉一些draw调用,那么它会读取较低的值.2ms,这很奇怪,因为它不应该影响这个
绑定真的这么贵吗?或者这里的问题是什么?由于调用
glFinish
,您的代码执行可能花费了相当长的时间
原因是
glFinish
导致程序暂停,直到所有连接/帧缓冲区/状态更改完成:这包括任何绘图调用或缓冲区绑定。绘图调用为什么不影响这一点?如果您没有使用glFinish()
,那么draw调用不会影响这一点,但确实会影响;)我对openGL代码比对你的手表更感兴趣。不过,为什么要使用glFinish()。您使用的是传统的openGL吗?实际上,它花费您超过纳秒的时间(这里说的是现代硬件)的唯一原因是因为您使用的是glFinish()
@CoffeeandCode不一定,验证会有可测量的开销。尽管顶点数组通常是最便宜/最简单的验证资源。不过,你有一个很好的观点。。。测得的大部分时间是由glFinish(…)
@AndonM.Coleman造成的。我只是假设驱动程序很好:L但是glFinish
调用实际上会非常昂贵(当然不是实际调用本身,只是副作用)因为它在返回之前等待帧缓冲区/连接/状态的任何更改完成。这意味着任何绘图调用或缓冲区绑定。我在start()中调用glFInish,因此在计时发生之前,缓冲区应该清除任何内容。正确的。。。你注意到了吗?@BlazArt是的,但你也在顶点数组绑定后调用它。完成该函数所需的实际时间将远远少于完成该函数的所有副作用所需的时间。@BlazArt老实说,只需使用GL定时器查询对象,避免所有这些胡说八道。它们的分辨率要高得多,为您提供了命令在管道中所需的确切时间,如果您等到它们完成后再读取结果,您将不会暂停管道。@BlazArt是的,我确实注意到了这一点,这对我的回答没有影响。在顶点数组绑定中,服务器端有很多副作用。单独使用GPU定时器进行此调用也是毫无意义的。我不希望从这个调用中直接生成任何GPU命令。状态验证通常推迟到下一次绘制调用。
Benchmark.start();
glBindVertexArray(vao);
Benchmark.stop();