Nvidia flex数据传输

时间:2016-03-17 20:58:55

标签: opengl cuda nvidia nvidia-flex

所以我试图将NVIDIA的flex API用于我的游戏引擎(作为核心游戏机制),现在我正在安排我的数据结构。我已经阅读了flex手册,但描述相当稀疏。因为我也在使用CUDA,所以我需要知道flex flexSetParticles等调用API是否也接受设备指针作为输入。此外,如果有人能告诉我,flexUpdateSolver究竟是什么,那将是很好的。它是否计算速度本身?它是否计算重力?如果不是,你必须自己计算更新的速度,Solver甚至会做什么?

目前,我自己计算新的位置和速度(没有弹性):

void updateParticle(int i, float deltaTime)
{
    velocities[i] = types[i].getVelocity(deltaTime);
    //calculates the currently fixed velocity at a given time
    positions[i] = positions[i] + velocities[i];
}

上面函数中的所有数组都是设备指针,该函数实际上是一个内核。如果我现在必须自己计算速度,我必须

1。)如有必要,通过添加新粒子(从主机到设备)更新阵列并计算速度(设备)

2。)将新位置(和速度)复制回CPU并将其移交给flex

3。)flex完成后,将新位置从flexGetParticles复制回GPU(用于渲染的OpenGL缓冲区)

这似乎效率很低,所以我想知道是否有更简单的解决方案。

1 个答案:

答案 0 :(得分:1)

是的,flexUpdateSolver将在内部计算粒子的位置和速度。因此,您一定不能自己这样做。请记住,您必须在每个时间步骤后致电NvFlexGetParticles(particleBuffer, n)以获得最新的位置和速度。

对于flexSetParticles,它需要一个主机或设备缓冲区指针。您可以通过传递适当的NvFlexAllocBuffer枚举来使用NvFlexBufferType创建缓冲区。