GPU Rigid Bodies

Introduction


GPU 刚体是 PhysX 3.4 中引入的一项新功能。它支持整个刚体管线特征集,但目前不支持铰接。GPU 加速刚体的状态可以使用与修改和查询 CPU 刚体完全相同的 API 进行修改和查询。GPU 刚体可以与服装和粒子交互,就像 CPU 刚体可以并且可以轻松地与角色控制器 (CCT) 和车辆结合使用一样。

Using GPU Rigid Bodies


GPU 刚体并不比 CPU 刚体更难使用。GPU 刚体使用与 CPU 刚体完全相同的 API 和类。GPU 刚体加速基于每个场景启用。如果启用,则占据场景的所有刚体都将由 GPU 处理。此功能在 CUDA 中实现,需要 SM3.0(开普勒)或更高版本的兼容 GPU。如果未找到兼容设备,则模拟将回退到 CPU 上,并提供相应的错误消息。

该特征分为两个部分:刚体动力学和宽相。这些是使用PxSceneFlag::eENABLE_GPU_DYNAMICS和将PxSceneDesc::broadphaseType分别设置为PxBroadPhaseType::eGPU来启用的。这些属性是场景的不可变属性。此外,您必须初始化 CUDA 上下文管理器,并在 PxSceneDesc 上设置 GPU 调度程序。这也是使用GPU加速粒子或服装的要求。SnippetHelloGRB 中提供了演示如何启用 GPU 刚体仿真的代码段。下面的代码示例用作简要参考:

PxCudaContextManagerDesc cudaContextManagerDesc;gCudaContextManager = PxCreateCudaContextManager(*gFoundation, cudaContextManagerDesc);PxSceneDesc sceneDesc(gPhysics->getTolerancesScale());
sceneDesc.gravity = PxVec3(0.0f, -9.81f, 0.0f);
gDispatcher = PxDefaultCpuDispatcherCreate(4);
sceneDesc.cpuDispatcher = gDispatcher;
sceneDesc.filterShader  = PxDefaultSimulationFilterShader;
sceneDesc.gpuDispatcher = gCudaContextManager->getGpuDispatcher();sceneDesc.flags |= PxSceneFlag::eENABLE_GPU_DYNAMICS;
sceneDesc.broadPhaseType = PxBroadPhaseType::eGPU;gScene = gPhysics->createScene(sceneDesc);

启用 GPU 刚体动态可启用 GPU 加速的接触生成、形状/主体管理和 GPU 加速的约束求解器。这加速了大部分离散刚体管道。

打开 GPU 宽相位会将 CPU 宽相位替换为 GPU 加速宽相位。

每个都可以独立启用,因此,例如,您可以启用具有 CPU 刚体动态的 GPU 宽相位,具有 GPU 刚体动力学的 CPU 宽相位(SAP 或 MBP),或者将 GPU 宽相位与 GPU 刚体动力学相结合。

What is GPU accelerated?


GPU 刚体功能提供 GPU 加速的实现:

  • Broad Phase
  • Contact generation
  • Shape and body management
  • Constraint solver

所有其他功能都在 CPU 上执行。

GPU 接触生成有几个注意事项。具体如下:

  • GPU 接触生成仅支持箱体、凸壳、三角形网格和高度场。任何球体,胶囊或飞机都将具有涉及在CPU而不是GPU上处理的那些形状的接触生成。
  • 凸壳需要将 PxCookingParam::buildGRBData 设置为 true,以构建在 GPU 上执行接触生成所需的数据。如果使用具有 64 个以上顶点或每个面超过 32 个顶点的船体,则将在 CPU 上对其进行处理。如果在创建凸壳时使用 PxConvexFlag::eGPU_COMPATIBLE 标志,则应用限制以确保生成的壳可以在 GPU 上使用。
  • 三角形网格需要将 PxCookingParam::buildGRBData 设置为 true,以构建在 GPU 上处理网格所需的数据。如果在烹饪过程中未设置此标志,则网格的 GPU 数据将不存在,并且将在 CPU 上处理涉及此网格的任何接触生成。
  • 任何请求触点修改的对都将在 CPU 上进行处理。
  • 必须启用 PxSceneFlag::eENABLE_PCM才能执行 GPU 接触生成。这是在 GPU 上实现的唯一接触生成形式。如果未引发eENABLE_PCM,则将使用非基于距离的传统联系人生成在 CPU 上处理所有对的联系人生成。

无论给定对的触点生成是在 CPU 上还是在 GPU 上处理的,GPU 求解器都将处理所有具有在其筛选器着色器中请求冲突响应的触点的对。

如上所述,GPU 刚体目前不支持关节。如果在场景中启用了eENABLE_GPU_DYNAMICS,则任何向场景添加铰接的尝试都将导致显示错误消息,并且不会将该铰接添加到场景中。

GPU 刚体求解器为接头和触点提供全面支持。但是,使用 D6 接头可以获得最佳性能,因为 GPU 本身支持 D6 接头,即从准备到求解的完整求解器管道在 GPU 上实现。GPU 求解器支持其他关节类型,但它们的联合着色器在 CPU 上运行。与 D6 接头相比,这会产生一些额外的主机端性能开销。

Tuning


与 CPU PhysX 不同,GPU 刚体功能无法动态增大所有缓冲区。因此,有必要为 GPU 刚体功能提供一些固定的缓冲区大小。如果可用内存不足,系统将发出警告并丢弃触点/约束/对,这意味着该行为可能会受到不利影响。以下缓冲区在 PxSceneDesc::gpuDynamicsConfig 中可调:

struct PxgDynamicsMemoryConfig
{PxU32 constraintBufferCapacity; //!< Capacity of constraint buffer allocated in GPU global memoryPxU32 contactBufferCapacity;    //!< Capacity of contact buffer allocated in GPU global memoryPxU32 tempBufferCapacity;       //!< Capacity of temp buffer allocated in pinned host memory.PxU32 contactStreamCapacity;    //!< Capacity of contact stream buffer allocated in pinned host memory. This is double-buffered so total allocation size = 2* contactStreamCapacity.PxU32 patchStreamCapacity;      //!< Capacity of the contact patch stream buffer allocated in pinned host memory. This is double-buffered so total allocation size = 2 * patchStreamCapacity.PxU32 forceStreamCapacity;      //!< Capacity of force buffer allocated in pinned host memory.PxU32 heapCapacity;             //!< Initial capacity of the GPU and pinned host memory heaps. Additional memory will be allocated if more memory is required.PxU32 foundLostPairsCapacity;   //!< Capacity of found and lost buffers allocated in GPU global memory. This is used for the found/lost pair reports in the BP.PxgDynamicsMemoryConfig() :constraintBufferCapacity(32 * 1024 * 1024),contactBufferCapacity(24 * 1024 * 1024),tempBufferCapacity(16 * 1024 * 1024),contactStreamCapacity(6 * 1024 * 1024),patchStreamCapacity(5 * 1024 * 1024),forceStreamCapacity(1 * 1024 * 1024),heapCapacity(64 * 1024 * 1024),foundLostPairsCapacity(256 * 1024){}
};

对于模拟大约 10,000 个刚体的场景,默认值通常已足够。

  • constraintBufferCapacity 定义求解器中的约束可以占用的内存总量。如果需要更多内存,则会发出警告,并且不会创建其他约束。
  • contactBufferCapacity 定义约束求解器中使用的临时接触缓冲区的大小。如果需要更多内存,则会发出警告并丢弃联系人。
  • tempBufferCapacity 定义用于约束求解器中使用的各种瞬态内存分配的缓冲区的大小。
  • contactStreamCapacity 定义用于在联系人流中存储联系人的缓冲区的大小。此数据在固定主机内存中分配,并经过双重缓冲。如果分配的内存不足,将发出警告并删除联系人。
  • patchStreamCapacity 定义用于在联系人流中存储联系人补丁的缓冲区的大小。此数据在固定主机内存中分配,并经过双重缓冲。如果分配的内存不足,将发出警告并删除联系人。
  • forceStreamCapacity 定义了用于向用户报告施加的接触力的缓冲区的大小。此数据在固定主机内存中分配。如果分配的内存不足,将发出警告并删除联系人。
  • 堆容量定义 GPU 和固定主机内存堆的初始大小。如果需要更多内存,将分配额外的内存。物理分配内存的成本可能相对较高,因此使用自定义堆分配器来降低这些成本。
  • foundLostPairsCapacity 定义了 GPU 宽相位在单个帧中可以产生的最大发现或丢失的对数。这不会限制对的总数,而只会限制在单个帧中可以检测到的新对或丢失的对数。如果在帧中检测到或丢失了更多对,则会发出错误,并且大相位会丢弃对。

Performance Considerations


在具有数千个活动刚体的场景中,GPU 刚体可以提供比 CPU 刚体非常大的性能优势。但是,需要考虑一些性能注意事项。

GPU刚体目前仅加速涉及凸壳和盒子的接触生成(针对凸壳,盒子,三角形网格和海格菲尔德)。如果您大量使用其他形状,例如胶囊或球体,则涉及这些形状的接触生成将仅在CPU上处理。

D6 接头在与 GPU 刚体一起使用时将提供最佳性能。其他关节类型将部分GPU加速,但性能优势将小于D6关节所表现出的性能优势。

具有超过 64 个顶点或每个面具有超过 32 个顶点的凸壳将由 CPU 而不是 GPU 处理其触点,因此,如果可能,请将顶点计数保持在这些限制范围内。可以在烹饪中定义顶点限制,以确保煮熟的凸壳不超过这些限制。

如果您的应用程序大量使用触点修改,这可能会限制在 GPU 上执行触点生成的对数。

修改actor的状态会强制将数据重新同步到GPU,例如,如果应用程序调整全局姿势,则必须更新Actor的转换,如果应用程序修改身体的速度,则必须更新速度等。将数据重新同步到GPU的相关成本相对较低,但应予以考虑。

联合投影、CCD 和触发器等功能不是 GPU 加速的,而是在 CPU 上处理的。

PhysX3.4文档(11) -- GPU Rigid Bodies相关推荐

  1. mysql timestamp 插入null报错_读MySQL 5.7文档11.2 Date and Time Data Types总结

    作者:魏新平,知数堂第5期MySQL实战班学员,第10期MySQL优化班学员,现任职助教. 读MySQL5.7文档11.2 Date and Time Data Types MySQL的时间类型分为D ...

  2. PhysX3.4文档(1) -- startup and shutdown

    PhysX3.4文档(1) --startup shutdown startup shutdown introduction 使用physx sdk的第一步是初始化一个全局对象.这些对象会在physx ...

  3. PhysX3.4文档(6) --Rigid Body Dynamics

    Rigid Body Dynamics 在本章中,我们将介绍一些主题,一旦您熟悉了设置基本的刚体模拟世界,这些主题也很重要. Velocity 刚体的运动分为线性和角速度(linear and ang ...

  4. PhysX3.4文档(8) -- Advanced Collision Detection

    Advanced Collision Detection Tuning Shape Collision Behavior 用于产生接触的Shape会影响它们通过contacts(Contact poi ...

  5. PhysX3.4文档(15) -- Vehicles

    Vehicles Introduction PhysX对车辆的支持在3.x中得到了显着的重新设计.为了取代 NxWheelShape 类 2.8.x,已经开发出核心 PhysX SDK 和车辆仿真代码 ...

  6. PhysX3.4文档(2) --Threading

    Threading Introduction 本章介绍了在多线程应用程序中如何使用PhysX.主要有三个方面使用多线程: 如何在不产生竞争的情况下调用PhysX API进行读写 如何使用多线程加速模拟 ...

  7. PhysX3.4文档(9) -- Joints

    Joints Joint Basics 关节(Joints)限制了两个Actor相对于彼此移动的方式.关节的典型用途是模拟门铰链或character的肩膀.关节在 PhysX extensions l ...

  8. PhysX3.4文档(7) -- Simulation

    Simulation Callback Sequence 最简单的模拟回调(simulation callbacks)类型是事件.使用回调,应用程序可以简单地侦听事件并根据需要做出反应,前提是回调遵守 ...

  9. 软件测试评估文档,11软件测试:软件测试评估.ppt

    文档介绍: 软件测试评估 本章教学要点 教学目标: 通过本章学****能针一个系统的测试情况,进行基本的质量评估. 教学重点与难点: 基于测试覆盖的评估:怎样根据测试数据从各个方面对覆盖情况作一个评价 ...

最新文章

  1. [JVM-翻译]揭开java.lang.OutOfMemoryError面纱之一
  2. UVA1587-Box
  3. 网站SEO优化之如何提升访客量?
  4. 成功解决Future Warning: The sklearn.neighbors.dist_metrics module is deprecated in version 0.22 and wil
  5. 在nodejs环境里使用浏览器环境下的document对象
  6. 已知两点坐标拾取怎么操作_已知的操作员学习-第3部分
  7. 鸡啄米vc++2010系列2(项目文件分析)
  8. python免费下载及安装_Python的下载及安装
  9. imgkit分辨率_pythonhtml2image: imgkit 和 wkhtmltoimage的坑
  10. 11,外观模式(Facade Pattern)是为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。...
  11. 补遗篇之volatile
  12. 医疗大数据服务平台技术架构有哪些
  13. 非涉密计算机保密自查表,非涉密计算机检查记录表-保密处-20210711022211.pdf-原创力文档...
  14. SQL Server触发器简单例子
  15. python打开默认浏览器_python 打开浏览器的方法 Python打开默认浏览器
  16. daniel powter
  17. 评分卡实例:一步一步实现评分卡(详细长文)
  18. 读《企业IT架构转型之道》
  19. leafler如何清除地图上的图标点
  20. 常见NoSQL的对比及使用场景(Redis,memcached,mongodb)

热门文章

  1. android .9图片在代码中的设置,Android点九图总结以及在聊天气泡中的使用
  2. 以太坊会带来哪些变化
  3. C语言trg,什么是C ++委托?
  4. Java JNA (五)—— 释放Memory对象分配的内存
  5. mysql的数据结构设计原则,数据库设计的重要性与原则
  6. 合肥耀之阳电商:拼多多店铺权重怎么做
  7. Wikioi 1017 乘积最大
  8. pypy python_[python]pypy优化python性能
  9. Android MVVM探究(一)
  10. Revit—CableTray and Conduit 桥架线管打断