Skip to main content

PresentMon: Performance In DirectX, OpenGL, And Vulkan

PresentMon And Our Proprietary Software

The introduction of DirectX 12, Microsoft's Universal Windows Platform, and Vulkan presented us with a problem: we no longer had a reliable tool for measuring performance. Fraps only works up through DirectX 11, and it's not always as reliable as some enthusiasts assume.

Consequently, the timing of Andrew Lauritzen's PresentMon tool, freely available on GitHub, was ideal. It monitors Windows' event tracing stack for present commands and records a bunch of information about them to a CSV file for analysis.

But PresentMon is subject to its own technical limitations, since it operates at the same place in the graphics pipeline as Fraps. Thus, it doesn't completely replace tools like FCAT in our repertoire. But what makes PresentMon so interesting to us is its compatibility with not only DirectX 11, but also DX 12, OpenGL, and Vulkan.

The tool's most significant disadvantage is its command-line interface. It can be time-consuming to figure out the right combination of switches to use in order to generate the information you need. By default, it's not set up to simply spit out the data you'd necessarily expect. And that's what we set out to solve.

Detection Made Easy: The PresentMon GUI

We made the decision to develop an app that would start PresentMon, control its switches, and collect sensor data at the same time as performance was being recorded.

In the screenshot above we have a number of frequently benchmarked games, each with its own profile stored in our tool. PresentMon uses the chosen parameters for each, depending on how it was set up. One test might run for three minutes and then stop, for example, while another is started and stopped with a hotkey.

Data Collection Made Easy

Of course, PresentMon isn't set up to collect sensor data as it records performance information. That capability comes from FinalWire's AIDA64. We tap into the engineering version, synchronously recording a number of host processing and graphics statistics. Do you want to correlate GPU utilization with frame rate at a certain point in a test? That's possible. Latency and overhead are kept to a minimum, as AIDA64's approach is different from tools like HWiNFO that use a DLL for their interface.

In order to minimize the impact of storage I/O, we write this second log file to memory first (it's small enough, after all), and then to disk once PresentMon's log file closes.

Since PresentMon doesn't use a time stamp, unfortunately, we put the beginning of our own records first, then PresentMon's log, and track time between them in parallel. This is necessary for controlling external measurements (like our oscilloscopes).

Analyzing The Data And Processing It For Presentation

All of our recordings result in an enormous pile of data for every benchmark run, which has to be sorted through. To help with this, we use another proprietary piece of software that combines the two log files and applies all of the math needed for our charts. It simply wouldn't be possible to do this manually in Excel due to the complexity and number of steps involved.

With our log file interpreter now in its third generation, we can run the calculations we need quickly, and even add new charts/graphs as needed. We'll get more in-depth on what we evaluate directly with an example using two different graphics cards and a DirectX 12 game.

Our purpose here is to help explain the information we're generating. Without a thorough understanding of what the charts are saying, it's sometimes possible to draw the wrong conclusion. Thus, you'll see us point to this piece in future reviews to ensure our processes and procedures are fully detailed.

The bar chart above conveys minimum, maximum, and average FPS. These are important, but they tell us nothing about the perceived smoothness of a gaming experience, nor do they give us a more granular look into frame consistency. In order to present that information, we need more data.

Two Cards, Two Test Systems, And One Benchmark

This example isn't intended to compare MSI's GeForce GTX 1060 Gaming X 6G to its Radeon RX 480 Gaming X 8G. Rather, we're using results from both cards to explain how we measure and evaluate.

Using a single benchmark simplifies the analysis. So we focus on Hitman, tested on both graphics cards using DirectX 11 and 12, and on two very different platforms.

Enthusiast SystemMainstream PC
CPUIntel Core i7-6950X @ 4.2 GHzAMD FX-8350 @ 4 GHz
CoolingOpen-loop water-coolingbe quiet! Dark Rock Pro 3
Memory16 GB DDR4-340016 GB DDR3-1866
MotherboardMSI X99A Gaming ProMSI Gaming 970
System Storage1TB Intel SSD 530
Operating System:Windows 10 Build 1607 (10.0.14393.51)
Graphics DriverCrimson 16.8.2GeForce 372.54  WHQL

MORE: Best Graphics Cards

MORE: Desktop GPU Performance Hierarchy Table

MORE: All Graphics Content