2

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

目前,我自己计算新的位置和速度(没有弯曲),如下所示:

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 缓冲区)

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

4

1 回答 1

2

是的,flexUpdateSolver它将在内部计算粒子的位置和速度。所以,你不能自己这样做。请记住,您必须NvFlexGetParticles(particleBuffer, n)在每个时间步之后调用以获取更新的位置和速度。

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

于 2018-08-27T09:12:36.100 回答