Skip to main content
Skip table of contents

Make performance optimizations

By Optimization we mean the technical and creative steps we can take to adjust, reduce, and streamline our content to help it run faster and hit the desired frame rate target!

Every show and production where Pixotope is being used, needs to run at a given frame rate. Given that Pixotope is a real-time renderer, we need to render each final frame of graphics in the window of time between one frame and the next. In other words - the higher the frame rate of our show, the less time we have to render our graphics.

Render time = 1 / frame rate

Frame rate (fps)

Render time (ms)

24 fps

41.6 ms

25 fps

40.0 ms

29.97/30 fps

33.3 ms

50 fps

20.0 ms

59.94/60 fps

16.7 ms

The show frame rate allots our rendering budget and, as a consequence, the level of optimization needed!

Note that the engine's output resolution also heavily impacts performance — it is much more demanding to render UHD than HD in real time!

The time it takes to render a frame of graphics in Pixotope depends on multiple factors - primarily how complex your graphics are, your video I/O configuration, and whether your hardware is up to spec.

The moment we fail to maintain a stable (or even workable) frame rate, we experience performance issues. This is most commonly caused by a combination of several compounding issues rather than a singular bottleneck.

Prepare for performance testing

Our optimization workflow is simply to try and identify the current biggest resource drains, alleviating them as much as possible before repeating the process over and over again.

The goal is to arrive at being able to comfortably render the content at our target frame rate, including some extra leeway for the sake of show safety.

Test in the right environment

It is very much not ideal, sometimes bordering on meaningless, to profile performance issues on a workstation different from the engines used in the actual show production.

At the very least, you will want to have the same hardware configuration that the live production will utilize. Ideally, you will also have the same video and tracking inputs and outputs, to ensure you are accounting for the video I/O overhead when profiling your render times.

Verify that you are using the correct resolution (if your broadcast is in 1080 and you are rendering at 4K, it will not give you an accurate representation of the frame rate).

Test from the same camera angle, to make sure you get comparable results.

Prioritize

Keep in mind that everything comes at the cost of something else. When it comes to rendering, we have a FIXED BUDGET of milliseconds available to us. Whatever feature or asset you wish to add to your scene, will at some point come at the cost of something else. Identify which features give you the most bang for your buck, and prioritize. 

Faster is harder

A lot of aspects of the Pixotope rendering pipeline has a flat overhead cost (Postprocessing effects, video I/O transfer waiting, etc), taking a flat chunk out of our render time - meaning that higher frame rates require DRASTICALLY more optimized scenes than low frame rate shows!

Use Live Mode

The Pixotope Editor is fast, but there are still significant overhead costs to rendering the UI, as well as having all the working tools loaded. Even though it is fine to do rough estimates and profiling in Play in Editor mode (disable WYSIWYG), for accurate values, please debug when running in standalone Live mode.

Clean your desk

If your workstation is running a bunch of non-essential garbage applications and processed in the background, this can negatively affect your engine’s performance. Remove and close applications you are not using for your show.

Identify performance issues

The easiest way to identify performance issues, is to visually identify that the output video feed is stuttering (dropping frames), or even outright freezing.

Dropped frames can also be caused by bad genlock and/or bad tracking data. If the stutters are very intermittent, it can be an idea to decouple tracking and enable free run, to reduce possible culprits by process of elimination. Occam’s razor is our most trusted tool.

It is also pertinent to keep in mind that the currently rendered graphics might not be the same graphics that cause performance issues - hero events with fireworks and explosions might be the straw that breaks the camel’s back, causing stutters only when active.

When experiencing intermittent stutters, try to identify if a particular camera angle, triggered effect, or combination of these were what caused the issue. Reproduction helps narrow down possible causes!

Pixotope Utilities

There are tons of convenient utilities to help debug this, and the most useful ones are all readily available within the Pixotope "Utilities" window. 

UnitGraph

The first thing you want to do is enable "UnitGraph", and review your frame timings.

If the green "Frame" timer is a steady green line, and the counter shows your target MS, then you are not currently experiencing performance issues.

If the green "Frame" timer is uneven and/or has vertical spikes, we have been, or are, experiencing frame drops!

If we are experiencing frame drops, note the values for Game, Draw and GPU Time. The total rendering time for the final Frame is typically clamped to the highest of these values.

Game

If we are stuck waiting on Game, we are typically CPU bottlenecked, and there is too much happening in terms of blueprint logic or other CPU bound computations.

Draw

If we are stuck waiting on Draw, we are also CPU bottlenecked, but the issue is more likely to be too many draw calls/culling checks, caused by too many individual actors in our scene.

GPU Time

Lastly, if we are stuck on GPU Time, our issue is the GPU workload. This is both the most frequent problem, as well as the one with most possible culprits. Luckily, we also have access to an excellent tool to break down the GPU render process - ProfileGPU!

ProfileGPU

Access the GPU visualizer by

  • clicking ProfileGPU in Pixotope Utilities

  • typing ProfileGPU in the command window

  • typing Ctrl + Shift + Comma

This also works in Live mode!

As seen in the image above, we are rendering our entire scene in less than 3 ms. We can hover our cursor over the colored sections of the "Scene" bar, or expand the "Scene" section in the lower explorer, to see where those 3 ms are spent. 

The bigger green and cyan elements near the middle of the Scene color bar are ShadowDepths and Lights, informing us that we spend about a third of our rendering time simply rendering lights and shadow. A step we could then logically take to reduce our rendering time, would be to either disable shadowcasting from some of our lights, or remove and reduce our total light count! 

There are tons of other advanced profiling tools in the Utilities window, each useful for certain tasks, but ProfileGPU is the most powerful performance overview utility for the average artist.

The usual suspects, and how to address them

CPU bottleneck

CPU below spec

If the CPU is below spec, simply running Unreal alone can be enough to cause stalls.

  • Solved by buying better hardware

Check out our System requirements

Too many draw calls (Individual assets being rendered)

Typical in big, open environments like cityscapes, where they may be hundreds of thousands of instances actors scattered around.

  • Using CullDistanceVolumes, or Hierarchical Instanced Static Meshes (HISMA), is a great way to DRASTICALLY reduce the amount of necessary drawcalls

  • Depending on the issue, → Instance Tool may be a magic bullet here

  • Another solution is to simply go through and delete all the content you are not using. If you simply wish to render a busy city street as a backdrop for a shot - do you really need to render the ENTIRE city?

Too complex, or simply too much blueprint/code logic

Having a single actor doing a few linetraces per tick, is usually not an issue. But having a thousand moving objects doing overlap checks against all nearby actors every tick can immediately stall your engine to single-digit frame rates.

Physics, particles and skeletal meshes

GPU bottleneck

GPU below spec

The GPU is, quite literally, the single most important piece of equipment for performance in Pixotope. As we are using consumer level hardware, it is also a quite affordable upgrade. Never try to cut costs here, and upgrade regularly.

Check out our System requirements

"Too much" content in the scene

This can mean many things, and is rarely an issue by itself, but having hundreds of thousands of individual pieces of foliage, all rendering without culling, will easily start causing GPU performance issues (too many shadow/vertex calculations).

  • A good rule of thumb is to only use geometry that you need. If you are doing a simple ocean view shot, do you really need an entire city scape behind you, if it’s never in view? Could that bought Los Angeles city pack be replaced with a few layered 2D mattes?

  • Nanite generally removes any need to worry about vertex counts, but at the time of this writing, foliage is one of the exceptions.

    • Issue can be resolved by using less poly heavy foliage actors, turning off foliage shadowcasting, or using bigger and more sparsely scattered foliage actors

    • Another solution is to cull foliage more aggressively

Too complex shaders occupying too much screen space

Too complex shaders occupying too much screen space. Parallax with hundreds of layers can make a single cube stall the engine, for instance.

  • Using the shader complexity view (Alt + 8 in the editor) can help identifying the problem area, but might not catch things like parallax. Once you have identified the problem actor(s), inspect the materials, and contemplate using cheaper solutions to achieve similar results, or a new material altogether if you are facing something like a grossly overdimensioned master material when trying to make simple materials.

Overdraw abuse

Overdraw abuse - too many particles, like fog or smoke, causing transparency overdraw. Every additional layer is one more round of processing for each affected pixel, and this quickly adds up. 

  • Try to avoid vast amounts of overdraw. Don’t use massive particle cards that are 90% invisible - it increases cost for no added benefit. Look up using BVC for polygonal cutout optimizations, as well as try to use as few particles as possible for the effect you want to achieve. Fewer, bigger, denser particles are better than many faint overlapping ones!

Shadow costs

Shadow costs. This is one of the BIGGER problems, caused by too many light sources with too much attenuation radius.

  • Spotlights are relatively cheap, area lights and point lights are more performance intensive, and directional lights can be extremely costly. A good rule of thumb is to only have one shadowcasting directional light

Expensive render features

  • Expensive render features - from volumetric fog, to multi-bounce raytracing, to complex post processing, can all take large chunks of time to process.

    • If you can’t afford it, you can’t afford it. Turn off that fancy convolution based bloom. Uncheck "Volumetric" in your exponential height fog. Set your raytracing bounces to 1, or turn it off outright. These are luxuries you treat yourself to, once you’ve trimmed the fat elsewhere in your pipeline.

Video I/O bottleneck

Additional video inputs and outputs

Every additional video input or output in Pixotope is processing that forces the rendering process to wait until the image transfer in the hardware has completed

  • There are some hardware implications here where incorrect system configurations can literally double the time it takes for video frames to transfer. Please refer to the hardware specifications. 

Large amount of SDI inputs

Using a large amount of SDI inputs, or UHD feeds where HD’s would suffice, will incur heavy render penalties

  • Pixotope is great at many things, but it is NOT a video switcher. As an example, rather than setting up multiple media inputs for virtual video wall needs, consider using a single media input with the video switching happening upstream from Pixotope

Also check out Epic’s Performance and Profiling in the Unreal engine
→ https://docs.unrealengine.com/en-US/Engine/Performance

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.