我想知道为什么初始化vbo的方法在与cuda交互时会对fps产生很大的影响。 当我创建vbo时,有两种可能性:
vbo仅保留具有给定数据大小的内存空间(在这种情况下,粒子的位置为 第一次在内核中写入vbo,然后在内核中修改:
gl.glBufferData(GL3.GL_ARRAY_BUFFER, n_particles * 4 * Sizeof.FLOAT, null, GL3.GL_DYNAMIC_DRAW);
vbo使用给定的数据大小保留内存空间并获取一些初始数据(粒子的位置 - 当然这些值会在内核中修改)
gl.glBufferData(GL3.GL_ARRAY_BUFFER, n_particles * 4 * Sizeof.FLOAT, FloatBuffer.wrap(particlesPositions), GL3.GL_DYNAMIC_DRAW);
1.~408 fps 2.~75 fps
您可以使用Nvidia GPU Computing SDK中的Simple OpenGL示例来检查此行为。
答案 0 :(得分:1)
因为第一种情况不必将数据上传到GPU。第二种情况确实如此。
区别在于:
void *memory = malloc(size);
和
void *memory = malloc(size);
memcpy(memory, data, size);
第一个必然比第二个快。
此外,如果您经常在同一缓冲区对象上调用GL_STREAM_DRAW
,则可能希望使用GL_DYNAMIC_DRAW
而不是glBufferData
。