Did you know that macOS has a built-in game performance HUD with a frames per second (FPS) counter, similar using RivaTuner Statistics Server (RTSS) to display a GPU performance overlay in Windows? Here’s how to enable the Metal Performance HUD.
Simply run a game with the environment variable MTL_HUD_ENABLED=1
:
open mygame.app --env MTL_HUD_ENABLED=1
Or set the global environment variable via launchctl
. I use this in my .zhsrc
file to toggle the variable on and off:
alias fps='[[ $(launchctl getenv MTL_HUD_ENABLED) -eq 1 ]]&&launchctl unsetenv MTL_HUD_ENABLED||launchctl setenv MTL_HUD_ENABLED 1'
Apple’s Discover Metal Performance HUD video explains the two types of rendering output:
- Direct: “least buffering and fewest number of refresh intervals”
- Composite: “additional display latency due to system UI limits”
Here are a few screenshots courtesy of two games: Tomb Raider and the open-source *OpenTyrian 2000:
If you use xbar to show script output in the macOS menubar, you could use this metal_hud.1d.sh
:
#!/bin/sh
# <xbar.title>Metal Performance HUD</xbar.title>
# <xbar.author>C.Y. Wong, myByways.com</xbar.author>
# <xbar.abouturl>https://mybyways.com/blog/enabling-the-macos-metal-performance-hud</xbar.abouturl>
[[ $(launchctl getenv MTL_HUD_ENABLED) -eq 1 ]] && echo 📈 || echo 📉
echo ---
echo Enable Metal Performance HUD\|refresh=true\|shell=launchctl\|param1=setenv\|param2=MTL_HUD_ENABLED\|param3=1
echo Disable Metal Performance HUD\|refresh=true\|shell=launchctl\|param1=unsetenv\|param2=MTL_HUD_ENABLED
I’ll post more of my xbar plugins one day!