Techniques for Rendering Circular Instruments on Square LCDs in Flight Simulators

I’ve been experimenting with incorporating square LCD modules into DIY flight simulator cockpit panels, and I wanted to share some observations and gather feedback from the community.

One challenge when simulating aircraft instrument panels is the mapping of circular gauges onto displays. Traditional rectangular displays can waste screen space or require complex rendering. A 6.22-inch 720×720 square LCD module for flight simulator applications naturally accommodates circular instruments like altimeters, airspeed indicators, and artificial horizons.

From a software perspective, LVGL can be used to:

Render circular gauges and instrument dials with minimal redraw overhead.
Handle dynamic data updates efficiently, which is critical for flight simulators to maintain a responsive cockpit experience.
Implement touch interactions if you want multifunction display (MFD) functionality in a small form factor.

For reference, a concrete example of a module with the right form factor and resolution is the 6.22-inch 720×720 Square LCD Module for Flight Simulator

I’m curious how others approach hardware selection and LVGL rendering for cockpit instruments:

How do you optimize updates when simulating multiple analog instruments?
Are there common techniques for anti-aliasing or smoothing circular gauges on square displays?
Any experience integrating multiple small modules into a single cockpit panel while maintaining synchronization?

Sharing experiences and techniques could help streamline the development of compact, high-fidelity flight simulator panels for hobbyists and educators alike.

The best way to handle custom gauges of this type is to use the canvas widget and custom render the gauge. I would set up double buffering with the canvas widget so you don’t have an anomalies show up. How you do this is you create the canvas widget and then hide it. create an image widget that you pass the buffer to that you want to have displayed. Render to the other buffer using the canvas widget and when you are done then swap out the buffer in the image widget…

Depending on the gauge you are rendering you might be able to use static images for it. an example would be the horizon gauge. Think of the old school analog gauge that used to be used. It was basically a weighted ball inside of a round glass container that was filled with a fluid. Imagine peeling the outside layer of the ball off and laying it flat. That is the image you want to create. Between positioning and rotation you can handle the horizon gauge. any text that changes you would have label widgets positioned where you want and set the background opacity to 0. this will look like an overlay. set the text according to whatever it is you need. Make the gauge widget round by setting the rounded corner values accordingly.

Easy Peazy…

The hard part is getting the inputs converted correctly to set the position of the image and the rotation of the image.

best results would be to create an empty object and make it round and then create an image widget that is a child of that object and have the image widget size be the same as the image it is holding. then position and rotate the image widget as needed. What you are doing when you do this is you are using the parent of the image widget to clip the image widget so you get a round gauge

Your question lacks priority info. MCU and speed ? Next is hw accel graphics ?

Primary is irelevant if display is square or round…

The MCU being used does play a role but I think the most important bit of information is what needs to be displayed. There are lots of different gauges seen in the cockpit of a plane. sometimes multiple gauges are joined together in a single gauge and sometimes they are not. I believe what plays a role in that decision is available space on the dash of the plane.

Seeing as how this is for a simulator you are not limited as to what is possible because the gauge doesn’t need to be made to FAA standards. You are also not dealing with the environment of a plane or the space constraints of a plane. You could use a single computer to drive many displays (gauges). I have achieved frame rates eclipsing 180FPS using a single core on a PC and that frame rate was updating > 50% of the screen doing mostly alpha blending work and rotation math. not light work to do. It would easily be able to handle 4 or 5 connected screens (gauges) on each core. LVGL does have the capability of handling multiple displays like that.