/OpenPVD

open remake of the closed-source PhysX Visual Debugger

Primary LanguageCMIT LicenseMIT

OpenPVD

NVIDIA ships a visual debugger for their PhysX physics engine, a hugely useful tool for finding quirky bugs or poorly setup physics scenes.

Sadly, whilst PhysX itself is now open-source, PhysX Visual Debugger (PVD) has remained a closed-source component that hasn't seen an update since 2018. Using it with complex physics scenes or with more recent PhysX releases can cause crashes and unsolvable issues.

The last communication from NVIDIA about PVD was here, late 2019.

... We are just starting work on quite a large rewrite of PVD because there are some fundamental problems with the current incarnation that are hard to fix. So while help is on the way it will still take quite some time to arrive -- I don't have a date so far.

So, although it may be eventually be pointless if NVIDIA do suddenly release a new version, here's an attempt to assemble something that can perhaps help out until that rewrite arrives.




The Effort

The source release of PhysX contains a large amount of PVD-related code, however it is all concerned with the "sending to PVD" side of affairs .. there is a surprising hole when it comes to unpacking, decoding or decompressing all that data, a hole that presumably is filled by a lot of custom code that lives in the private PVD codebase.

OpenPVD uses the latest PhysX code as canonical reference to extract any PVD types and structures available to assist with decoding the debug data stream.




Current State

OpenPVD is made up of a collection of tools for working with PVD data and for trying to workaround existing problems.


capture

The capture tool offers a way to write a network PVD connection from a game out to a PXD2 file for later filtering or analysis. Useful if you are working with a game that cannot be asked to write out a PXD2 directly itself.

Simply run opvd-capture - it will emulate a running PVD server so games should connect directly to it. Add -o filename.pxd2 to specify a custom filename to write to.

Options:
  -h,--help                   Print this help message and exit
  -o,--out TEXT               filename to write captured data to
  -p,--port UINT              port to listen on
  -b,--buf UINT               transmission buffer, in KB`

filter

The filter tool can be used to analyse and unpack a PXD2 capture file, producing a readable dump of the internal data structures as well as a summary of the various PhysX classes in use.

Crucially it can also help strip out data too. Currently it supports limiting the amount of triangle meshes that get stored. When the capture contains a lot of complex meshes it can easily crash the original PVD application.

eg. to only allow 2000 mesh objects,

opvd-filter.exe -p input.pxd2 --meshlimit 2000 to_file -o filtered.pxd2

you can also re-stream a PXD2 file out to the official app using to_net - just run the PhysX Visual Debugger and try

opvd-filter.exe -p mm.pxd2 --meshlimit 2000 to_net -o localhost

Options:
  -h,--help                   Print this help message and exit
  -p,--pxd TEXT:FILE          path to a PXD2 capture file to parse
  --meshlimit INT:POSITIVE    limit of trimesh instances to allow

Subcommands:
  to_file
  to_net



Building

  • git submodule init
  • git submodule update
  • run premake.bat in /build
  • load and build vs2019_OpenPVD.sln in /build/_generated

(you will need test PXD2 capture files to load)




The Goals & State

This project is extremely WIP and subject to major changes

Done? Task
premake project setup
stripped-down static build of PhysX 4.1
PXD2 file loading
PVD event stream decoder loop
PVD event stream deserialize to log
PVD event filtering, emit to file or network
Experimental PVD network stream live decode
MemoryEventBuffer stream decompression
Windowing system - GLFW & Imgui
Choose 3D render / scene graph
Decypher type metadata system
Dynamic class & property instance tracking
Property decompose & update using metadata
Data sectioning and playback