opengl - Nvidia Flex 数据传输

标签 opengl cuda nvidia nvidia-flex

因此,我尝试将 NVIDIA 的 Flex API 用于我的游戏引擎(作为核心游戏机制),并且我现在正在安排我的数据结构。我已经阅读了 Flex 手册,但描述相当稀疏。因为我也在使用 CUDA,所以我需要知道 Flex API 调用(例如 flexSetParticles 等)是否也接受设备指针作为输入。另外,如果有人能告诉我,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 缓冲区)

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

最佳答案

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

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

关于opengl - Nvidia Flex 数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36071573/

相关文章:

c - 使用 glTexGen 在 OpenGL 中对球体进行纹理化

c++ - Karatsuba - 使用 CUDA 进行多项式乘法

c++ - 来自tensorrt的 "nvinfer.h"位于哪里?

tensorflow - 原因: image not found tensorflow GPU

c++ - OpenGL库的实现

c++ - OpenGL 变换

python - 使用 PyOpenGL 渲染带纹理的矩形

c++ - 在输出中混合推力和 cuBLAS 意外结果

c++ - 用于主机和设备代码的 CUDA 和 C++

cuda - fmad=false 提供良好的性能