Godot 3D 物理测试套件深度解析:功能回归、跨引擎对比与性能基准实测
示例工程【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址https://gitcode.com/GitHub_Trending/go/godot-demo-projects点击查看免费下载导读3d/physics_tests 是 godot-demo-projects 仓库中用于系统性检验 Godot 3D 物理引擎的演示项目它把 11 个功能测试与 3 个性能测试打包成一套可视化、可交互的测试框架。通过本文你将掌握该项目的运行方式、测试目录结构与基类设计、命令行参数与全局物理参数物理 tick 率、时间缩放、求解器迭代数等的调优方法并理解如何借助它进行物理引擎回归验证和不同引擎如 Godot 原生物理与 Jolt Physics之间的行为与性能对比。项目定位一套面向 3D 物理引擎的回归与基准测试框架官方 README 明确给出了该项目的定位它包含一系列针对3D 物理引擎的测试并可用于两种目的功能测试Functional tests检查物理引擎是否存在回归regression并对比不同物理引擎之间的行为差异性能测试Performance tests评估并对比不同物理引擎之间的性能表现。项目采用GDScript编写README 注明 Renderer 为 Forward而当前仓库的 project.godot 实际配置为gl_compatibility渲染并开启 MSAA 3D 2x因此也能在较低端硬件上流畅运行。从 project.godot 可以看到项目的基本骨架config/name3D Physics Tests标签为3d, demo, official, physics主场景为res://main.tscn两个全局单例AutoloadLog日志系统与System全局快捷键与引擎识别物理引擎默认配置为Jolt Physics并设定了 Jolt 的内存上限参数max_bodies262144、max_body_pairs262144、max_contact_constraints524288、temporary_memory_buffer_size448开启common/physics_interpolationtrue物理插值。目录结构与测试清单测试场景按“功能”与“性能”两类组织在tests/目录下公共工具类集中在utils/目录目录内容tests/functional11 个功能测试场景.tscn与脚本.gdtests/performance3 个性能测试场景与脚本tests/static_scene.tscn、tests/static_scene_plane.tscn静态测试环境utils相机环绕、物理体工具、HUD 标签、日志面板、参数调节控件等 16 个 GDScript测试的完整清单注册在 tests.gd 中通过path指向对应场景id 使用Functional Tests/...与Performance Tests/...两级路径这也是菜单自动生成子菜单的依据类型测试项场景文件功能Shapestest_shapes.tscn功能Compound Shapestest_compound_shapes.tscn功能Frictiontest_friction.tscn功能Box Stacktest_stack.tscn功能Box Pyramidtest_pyramid.tscn功能Collision Pairstest_collision_pairs.tscn功能Jointstest_joints.tscn功能Raycastingtest_raycasting.tscn功能RigidBody Impacttest_rigidbody_impact.tscn功能RigidBody Ground Checktest_rigidbody_ground_check.tscn功能Moving Platformtest_moving_platform.tscn性能Broadphasetest_perf_broadphase.tscn性能Contactstest_perf_contacts.tscn性能Contact Islandstest_perf_contact_islands.tscn测试菜单由 tests_menu.gd 配合基类 option_menu.gd 实现OptionMenu.add_menu_item()会把Functional Tests/Shapes这类a/b/c路径自动拆解为多级 PopupMenu 子菜单选中后通过_start_test()实例化对应场景并挂到场景树根部索引 0同时把测试名写入左下角的LabelTest标签。运行与命令行参数交互式运行用 Godot 4.x 打开 project.godotfeatures 标记为4.7直接运行主场景即可。启动后左上角Tests菜单选择任意测试右上角参数面板可实时调节物理模拟参数底部日志面板会输出测试进度与计时数据。命令行直接启动指定测试tests.gd 会解析OS.get_cmdline_user_args()即--之后的参数因此可以在终端中跳过菜单直接进入指定测试godot --path 3d/physics_tests -- --test-sceneres://tests/performance/test_perf_broadphase.tscn支持的参数及其作用如下对应 tests.gd 的解析逻辑参数默认值说明--ticks-per-second60设置Engine.physics_ticks_per_second即每秒物理步数--time-scale1.0设置Engine.time_scale时间缩放注意本项目会自动将物理 tick 率乘以该值--max-steps-per-frame8设置Engine.max_physics_steps_per_frame单帧最多执行的物理步数上限--solver-iterations16通过PhysicsServer3D.space_set_param(SPACE_PARAM_SOLVER_ITERATIONS, ...)设置空间求解迭代数--contact-bias0.8设置SPACE_PARAM_CONTACT_DEFAULT_BIAS接触默认偏差--physics-interpolationon取true/on时开启get_tree().physics_interpolation--test-scene-直接启动指定路径的测试场景全局快捷键与 HUD 统计主场景 main.tscn 顶部提示了全部快捷键对应 project.godot 中定义的 input actions以及 system.gd 中的处理逻辑P: Toggle Pause | L: Step Once | R: Restart | C: Toggle Collision | F: Toggle Fullscreen | ESC: QuitPtoggle_pause切换get_tree().pausedLstep_once单步推进一帧物理暂停状态下先解除暂停、执行一次物理步后再次暂停见 system.gd 的_physics_processRrestart_test重新加载当前测试场景Ctoggle_debug_collision切换get_tree().debug_collisions_hint碰撞形状可视化Ftoggle_full_screen切换全屏ESCexit退出应用。左下角 HUD 由多个独立标签控件组成全部以%Name方式在 main.tscn 中挂载脚本LabelTestlabel_test.gd当前测试名LabelVersionlabel_version.gdGodot 版本号LabelEnginelabel_engine.gd当前物理引擎名LabelFPSlabel_fps.gd帧率与每帧毫秒数LabelFrameslabel_frames.gd帧计数器只统计未暂停的帧暂停时 UI 仍存活LabelPauselabel_pause.gd暂停时显示黄色 Paused 提示。右下角为日志面板PanelLog由 container_log.gd 与 scroll_log.gd 实现提供Automatic Scrolling开关与Clear按钮日志内容来自Log单例system_log.gd它把print()/push_error()同时转发到控制台与 UI 面板。功能测试覆盖关键物理行为的回归验证所有功能测试都继承自基类 test.gd它提供了一组可复用的测试工具方法add_sphere(pos, radius, color)程序化创建无光照着色unshaded的球体 Mesh常用于标记接触点add_shape(shape, transform, color)利用shape.get_debug_mesh()绘制碰撞形状的线框create_rigidbody(shape, pickable, transform)/create_rigidbody_box(size, ...)创建带CollisionShape3D的刚体pickable为 true 时会附加 rigidbody_pick.gd 使其可被鼠标抓取start_timer(timeout)/cancel_timer()/is_timer_canceled()可取消的计时器用于按阶段推进测试wait_for_physics_ticks(tick_count)等待指定数量的物理 tick 后发出wait_done信号保证物理模拟稳定后再进入下一阶段。Box Pyramid方块金字塔由 test_pyramid.gd 驱动以逐层递减的方式堆叠方块刚体检验引擎在堆叠约束下的稳定性。截图中的黄/蓝色线框正是该测试的运行画面黄色为刚体碰撞体蓝色为地面静态碰撞体。Box Stack箱子堆叠test_stack.gd 暴露了height、width、depth范围 1–100默认 10×1×1、box_size与box_spacing导出参数。实现上先创建一个模板刚体可拾取再用duplicate()复制到每一层每层用一个Node3DRow%02d组织——这是一种避免重复构造资源、同时保持场景树清晰的高效做法。Collision Pairs碰撞配对检测test_collision_pairs.gd 用于验证PhysicsDirectSpaceState3D.collide_shape()的命中结果。它支持两种交互方式数字键1–5切换被查询的碰撞类型Box / Sphere / Capsule / Cylinder / Convex Polygon菜单勾选启用/禁用场景中的 5 种形状Box / Sphere / Capsule / Cylinder / Convex / Concave Polygon。查询逻辑使用PhysicsShapeQueryParameters3D将形状缩小到 0.5 倍后逐一与各刚体求交命中则查询形状以绿色线框绘制并输出HIT未命中则为暗白色所有接触点位置用红色小球半径 0.05标记并写入日志。RigidBody Ground Check刚体落地检测该测试由 test_rigidbody_ground_check.gd 与工具脚本 rigidbody_ground_check.gd 配合完成刚体沿 z 轴往返移动速度 100、加速度 22每个物理步用get_rest_info()向下探测碰撞collision_mask 2。落地检测结果的呈现非常直观——悬空时碰撞体显示为红色着地瞬间变为白色。场景菜单还允许切换地面类型Big/Small与碰撞形状Concave / Convex / Box用于验证不同形状组合下的接地判断。其余功能测试还包括test_shapes.tscn基础形状碰撞、test_compound_shapes.tscn复合形状、test_friction.tscn摩擦力、test_joints.tscn关节约束脚本在 test_joints.gd、test_raycasting.tscn射线投射、test_rigidbody_impact.tscn刚体撞击、test_moving_platform.tscn移动平台共同覆盖了 3D 物理中最常出问题的行为面。性能测试分阶段计时与 tick 级测量Broadphase广相阶段test_perf_broadphase.gd 是典型的压力测试默认row/column/depth各为 20即生成8000 个0.8×0.8×0.8 的方块间距 1.0gravity_scale0避免倒塌并把整个生命周期拆成四个可量化的阶段每阶段用Time.get_ticks_usec()计时并以毫秒写入日志Creating objects逐个构造刚体与形状注释特别说明每个物体单独创建 shape以避免大量刚体共享同一 shape 时带来的关联开销Adding objects把对象批量add_child到场景Moving objects批量平移所有对象触发广相更新Removing objects逆序移除注释指出逆序可避免父节点子索引重排的开销。同时_physics_process会在测试进行期间持续输出每个物理 tick 的耗时Physics Tick: X.XXX ms (total X.XXX ms)从而把“帧率”之外的真实物理步成本也纳入度量。row_size/column_size/depth_size均为export_range(1, 1000)可在编辑器中调高压力上限。Contacts 与 Contact Islandstest_perf_contacts.gd 侧重密集接触对的求解开销test_perf_contact_islands.tscn则验证接触孤岛island的合并与求解效率——这两类场景与 Broadphase 一起构成从“碰撞对筛选”到“约束求解”的完整性能链路。全局物理参数面板从 UI 到底层设置的对应关系主场景右上角的 Options 面板提供了 6 个实时可调的物理参数全部通过 main.tscn 的信号连接与 tests.gd 的回调写入引擎底层参数默认值取值范围底层设置Ticks per Second6010–240步长 10Engine.physics_ticks_per_secondTime Scale1.0×最大 5.0步长 0.5下限钳制 0.1Engine.time_scale且自动联动 tick 率Max Steps per Frame81–20Engine.max_physics_steps_per_frameSolver Iterations161–200PhysicsServer3D.space_set_param(SPACE_PARAM_SOLVER_ITERATIONS, ...)Contact Bias0.800–1步长 0.05PhysicsServer3D.space_set_param(SPACE_PARAM_CONTACT_DEFAULT_BIAS, ...)Physics Interpolation开开关get_tree().physics_interpolation面板 tooltip 给出了这些参数的实际影响值得注意的细节包括Ticks per Second数值越高物理越精确、CPU 占用越高数值过低会导致物体相互穿透tunnelingTime Scale本项目中物理 tick 率会自动乘以 Time Scale见 tests.gd 与 time_scale.gd从而保证无论时间缩放如何模拟精度都不失真Max Steps per Frame当单帧需要执行的物理步数超过该上限时物理会“慢动作”运行而不是跳过Physics Interpolation纯视觉效果平滑渲染而不影响物理模拟本身physics_interpolation.gd 中的_on_check_button_toggled直接写入get_tree().physics_interpolation。启动时 tests.gd 的_get_default_options()会从引擎真实状态回填面板值如从PhysicsServer3D.space_get_param读取当前的接触偏差与求解迭代数保证 UI 与引擎状态始终一致。物理引擎切换与对比项目默认启用Jolt Physics见 project.godot 的physics/3d/physics_engineJolt Physics但测试套件的设计目标之一就是跨引擎对比。system.gd 中的PhysicsEngine枚举GODOT_PHYSICS / JOLT_PHYSICS / OTHER会在_enter_tree()时读取ProjectSettings.get_setting(physics/3d/physics_engine)并识别当前引擎match engine_string: DEFAULT: _engine PhysicsEngine.GODOT_PHYSICS GodotPhysics3D: _engine PhysicsEngine.GODOT_PHYSICS Jolt Physics: _engine PhysicsEngine.JOLT_PHYSICS _: _engine PhysicsEngine.OTHER识别结果由 label_engine.gd 显示在左下角截图中可见 Physics engine: Jolt Physics。要对比另一引擎只需在Project Settings → Physics → 3D → Physics Engine中切换到GodotPhysics3D或DEFAULT后重新运行即可在完全相同的测试场景、参数与操作序列下观察行为差异与性能差异。此外system.gd 会在启动时自动开启get_tree().debug_collisions_hint true等价于编辑器 Debug 菜单的 Visible Collision Shapes使所有碰撞体默认以线框显示方便直接目测不同引擎的接触、穿透与堆叠表现。扩展与二次开发建议该套件的基类设计使其易于扩充新增测试只需在tests/functional/或tests/performance/下创建场景让根节点脚本继承Test然后在 tests.gd 的_tests数组中登记{ id: ..., path: ... }即可自动出现在菜单中。写功能测试时可组合start_timer()/wait_for_physics_ticks()控制节奏用add_shape()/add_sphere()直观可视化查询结果写性能测试时则参考 Broadphase 的分阶段Time.get_ticks_usec()计时模式把创建、添加、移动、移除与逐 tick 耗时一并输出到日志面板形成可复现、可对比的基准数据。最终这套项目既是引擎回归测试的工具箱也是理解 Godot 3D 物理架构空间查询、碰撞配对、求解器参数、物理插值的活教材——无论你是要在引擎版本升级后验证物理行为还是要评估切换物理引擎的收益都可以从 tests.gd、test.gd 与各测试脚本入手快速建立自己的验证流程。赞分享示例工程【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址https://gitcode.com/GitHub_Trending/go/godot-demo-projects点击查看免费下载相关推荐Hermes 基准测试框架 bench-runner 完全指南跨引擎性能对比与回归分析实战Hermes 基准测试框架 bench runner 完全指南跨引擎性能对比与回归分析实战 导读 bench runner 是 Hermes 仓库内置的一套基语言运行时编译器移动开发Godot物理引擎深度解析2D与3D物理系统对比Godot物理引擎深度解析2D与3D物理系统对比 引言为什么需要理解物理系统差异 在游戏开发中物理引擎是实现真实感交互的核心组件。Godot Engin文档教程游戏开发gitui基准测试标准化测试套件与性能回归检测gitui基准测试标准化测试套件与性能回归检测 引言为什么需要专业的基准测试 在终端Git工具领域性能往往是决定用户体验的关键因素。当面对包含数十万提交开发工具版本控制CLI上一篇Node.js 11.2.0 发布解析实验性 llhttp 解析器落地与 Windows 平台体验改进下一篇tanstack/svelte-form 版本演进全解析从 1.21 到 1.33 的 API 迭代、性能优化与 SSR 修复创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →