X-Plane 12.06 Is Full of Many Things

X-Plane 12.06 beta 1 is here! And it contains a lot of changes. Here’s a few of the bigger things we changed, and a few notes about the beta process.

Clouds and Weather

Since X-Plane 12.0 shipped, we’ve been working on the clouds and the weather system to improve performance, accuracy and quality. 12.06 ships the first two steps in this multi-step process:

  • The cloud shaders are now faster and have fewer artifacts. Daniel rewrote the way clouds are marched, fixing zebra stripes and generally making things less pixelated and ugly.
  • The cloud shaders also contain a dedicated path for cirrus clouds that should look better than what we had in 12.0 (“really thin stratus clouds up high”).
  • Alex and I rebuilt the noise functions that build each weather type to get better looking clouds of all types.

While there are a few real weather fixes included, we have not tried to comprehensively update real weather; my thinking was that without proper rendering, it would be impossible to tell if real weather was actually getting better.

Coming soon: “Minecraft clouds” (e.g. square cubic clouds, especially with real weather) should be fixed in beta 2, so enjoy them while they last. Thick prism-shaped cirrus clouds should also be fixed, and we’ll be tuning up the presets and METAR parsing.

The future: we are looking at putting a 2-d “cloud shell” behind the 3-d clouds to handle orbital view and make the planet look less silly, and we’ll be going over real weather with a fine tooth comb.


X-Plane 12.06 fixes some constants for sky colors but is not a lighting update. We have a bunch of lighting fixes internally, but the plan is to measure twice and cut once, e.g. make one patch to update lighting once we have all of the changes.

Improving dark cockpits is high on our todo list, but we also don’t want to tweak the light levels in the cockpit over and over and over, thrashing third party developers each time we do it.

My expectation is that when we recalibrate cockpit lighting, minor aircraft updates will be needed, but third parties who have chosen to “fix” cockpit brightness themselves (by adding extra light or hacking materials) may have to undo their hacks. I’ll try to provide clear guidance and early builds when we get to this point, but lighting is still “in development”.

Rendering and VRAM

The biggest change to X-Plane 12.06 is not one you can see: we’ve converted the main rendering pipeline from 12.0 (which was hand coded) into a rendering node graph.

Rendering graphs are all the rage today; if you’re curious about this you can look at something like AMD’s Render Pipeline Shaders. But here’s the why behind this change:

The render graph allows us to double-book VRAM used to render the main frame. X-Plane 12 has a lot more stages and processing in its pipeline than X-Plane 11, and that was consuming VRAM.

In 12.06 we treat VRAM more like an AirBnB and less like a second home – at different times in the frame different parts of the pipeline are using the same chunk of VRAM, which means we need less VRAM in total for effects. This change wasn’t possible in X-Plane 11 – you can’t double-book VRAM with OpenGL.

But it also would have been too tedious to hand code aliasing – the rendering node graph automates most of this and prevents bugs.

Coming soon: we have a performance optimization for beta 2 that should help CPU-limited users.

The future: in the future the rendering node graph will also let us render different parts of the frame using different CPU cores, for better CPU utilization and higher FPS for CPU-bound users. We still have a lot of work to do on this front, but once again the rendering node graph makes it possible.

ATC and AI Aircraft

12.06 has a lot of ATC improvements – months of Jim’s work went out in beta 1. I’ll try to get Jim to write up a detailed blog post on the details.

One big improvement to ATC: Austin fixed a lot of problems with the AI pilot. This affects ATC because the AI aircraft fly more reliably and are less likely to crash and bring airport operations to a halt. We’re expecting stability improvements because numeric instability from AI aircraft crashing into mountains would sometimes crash the entire simulator.

The future: Jim has more ATC fixes coming and is working on SID/STAR support.

What Comes Next In the Development Pipeline

X-Plane development works as a pipeline: as I type this…

  • 12.05 is shipping
  • 12.06b1 is in public beta
  • 12.06b2 is being internally tested before going public
  • 12.06b3 is in development – about half of the beta 3 bugs are fixed and we’re working on the rest.
  • 12.07 development is almost finished – a mix of development and testing are going on right now.
  • We’re working on features for 12.08 and beyond.

Third parties: I believe all of the known third party compatibility bugs are scheduled to be fixed in beta 3, and most of them are fixed already. But these fixes missed the cutoff to get into beta 2, which was a few days ago. We’re hoping to get beta 3 out early next week.

We try to not hold up a beta for fixes that are almost ready – if we did the betas would never ship because there’s always one more fix that’s almost ready.

The future: Pawel’s been working quite a bit on the networking stack, and his first changes will ship in 12.07, primarily targeting pro-level customers. We also have more graphics changes coming, and some of Austin’s flight model improvement are in test right now.

Posted in News by | 66 Comments

Addressing Plugin Flickering

X-Plane 12.04b3 ships with a new feature called “Zink”, which we hope is going to alleviate a lot of the long standing issues that many users, especially with AMD GPUs have suffered from. This hopefully provides a work around for both flickering plugin drawing, eg. EFIS screens that either flicker or are missing altogether, but also potential improvements in performance by decreasing driver overhead.

If this sounds like you, you are welcome to give this a try right now by upgrading to 12.04b3, going into the Graphics settings and checking the “Use Zink plugin bridge” check box. Restart X-Plane and if everything goes to plan, X-Plane should look exactly the way you are used to but most importantly your plugins should look right and your performance might be better too. Because Zink is built on top of Vulkan, it’s only available to Windows and Linux users and is not applicable to macOS and Metal.

If you only take one thing away from this blog post, I hope it’s this image showing the difference between native Vulkan/OpenGL interop as well as Zink interop gives you an idea of why we are excited about this:

Now that I hopefully have your attention, let me elaborate how we got here and what this means for both users and developers. First of, Zink is actually a graphics driver that sits between plugins and X-Plane and translates plugin OpenGL rendering into native Vulkan commands that get executed by the same Vulkan device that X-Plane is using for rendering. Of course, X-Plane itself no longer uses OpenGL, but it’s is still very important for plugin development. A long time ago, when X-Plane was still OpenGL based and the plugin SDK was first made, it seemed like an absolute no-brainer to just expose the X-Plane OpenGL context to plugins directly and let them handle all their drawing needs themselves. It gives the most flexibility and control over everything, and it also makes it easy for the SDK because there is no need to make fancy drawing routines to be used by plugins.

Fast forward to the Vulkan and Metal port and we suddenly have an issue: Neither Vulkan nor Metal is OpenGL, but there are now hundreds of plugins out there that all assume X-Plane uses OpenGL and the OpenGL context is there. Killing OpenGL for plugins would mean countless plugins would stop working, requiring potentially lengthy update processes or maybe they’ll just never work at all again because the author lost interest in X-Plane or developing the plugin. This is how we ended up with the OpenGL Bridge in X-Plane 11.50: We create a real OpenGL context, share some memory from within Vulkan to that OpenGL context, then let plugins continue to draw how they used to do. X-Plane takes care of all of the heavy synchronization and resource creation rules under the hood and everyone is happy. Everyone? Well, no, not quite…

The problem with Vulkan/OpenGL interop

The big problem with Vulkan/OpenGL interop is that it relies on the driver to support this properly. As it turns out, driver support for this is flaky at best, if you own an AMD card you can probably tell long stories about issues. The most prominent one is flickering or altogether missing rendering, in which case plugin drawing is either completely missing or flickering in and out of existence making it basically impossible to use plugins. The other issue is performance, captured in the screenshot above, where the OpenGL bridge adds almost 10ms per frame, although I have seen numbers as bad as 30ms per frame. For reference, 33ms is the time one frame can take at most to reach 30 FPS! This wasn’t always the case, it used to run much better, but driver regressions are a real thing and this isn’t really something the hardware vendors test. Not that I can be too mad about this, X-Plane is one of the very few applications that uses this feature at all. Despite having filed numerous bug reports with the vendors, unfortunately the problems were never completely fixed, so even during the 11.50 days we started thinking about alternatives. During the X-Plane 11 days it was at least somewhat easy to tell users to switch back to OpenGL to avoid the flickering, even though that usually meant a hit in performance because the Vulkan backend was just so much faster.

There are of course other open source OpenGL drivers out there that aren’t Zink. The most well known one is probably Angle, a implementation of OpenGL ES by Google. None of them work for us however, because of another terrible decision made many years ago: X-Plane has always used a compatibility profile OpenGL context. What that means doesn’t matter, but the end result is that X-Plane and by extension plugins, rely on the existence of OpenGL commands from the 90s! Most modern implementations of OpenGL will happily ignore everything from the compatibility profile because it’s a nightmare to implement and doesn’t map very nicely to modern hardware at all. But a lot of plugins make use of these old features and rely on the fixed function pipeline. Which, by the way, is also the reason we didn’t just expose Vulkan or Metal to developers. Writing either a Vulkan or Metal renderer requires a ton of overhead, is deeply complicated and error prone. Writing correct code requires testing on different hardware, reading a few thousand pages of specification text and having a good understanding of the underlying hardware. Most plugin developers don’t venture past the fixed function pipeline, it would be absolutely unreasonable to expect them to spend the time and effort involved in this.

What’s a Zink?

Luckily we don’t have to throw any developers into the deep end because there is Zink. Zink is part of the Mesa open source project and is a backend for the Gallium driver, which is the OpenGL frontend provided by Mesa. Okay, lots of big words here, let’s simplify this a bit: Gallium implements OpenGL 1.0 to OpenGL 4.6, which basically means “all of OpenGL”. But it doesn’t actually do anything with it, it just does all of the heavy lifting required to make OpenGL work. Backends are what actually turn the intermediate data that Gallium produces into real commands to be executed by a GPU. There are a lot of these backends: For example there are multiple software renderers that just use the CPU, there are implementations that talk to AMD GPUs, Nvidia GPUs, Intel GPUs, things I never even heard about, it’s all there. But among all of those backends there is also Zink. Zink just takes what Gallium produces and builds Vulkan commands out of it to be executed by any Vulkan capable hardware. This is what makes Zink so great for us, it’s a real OpenGL implementation that includes all of the hard and complicated bits we need to make plugins work.

Of course I’ve made it sound easier than it really is, “just” writing a Gallium backend that magically speaks Vulkan is a lot of hard work. The unsung hero of all this is Mike Blumenkrantz, head honcho and lead developer of Zink. He’s spent years getting Zink to the point it is at and is contentiously working on improving it, both in terms of supported features as well as performance. He’s also an absolute legend and none of this Zink interop X-Plane stuff would exist if it wasn’t for his help, not just in getting Zink to where it is but also answering tons of our questions during the integration. Big shout out to Mike! While I’m doing shout outs, it would be unfair of me to not also mention AMD. While they are partially the reason we are here today, they also provided us with help and driver updates to make Zink work together with X-Plane and every engineer of theirs that I have met along this journey has been nothing but kind and helpful.

I’m a user, how does this affect me?

If you are on X-Plane 12.04b3, open your graphics settings and enable the Zink backend. By default we run with the native OpenGL backend for compatibility reasons, although the long term goal is to switch to Zink exclusively, but not anytime soon. There is a chance some or all of your plugins will explode, we’ve done testing with third party developers on this, but the area touched by this immense and we can’t test every plugin out there. If it breaks, no worries, please file a bug report and let us know, fall back to the native OpenGL backend and try again in the future. The idea behind Zink is to make it as much a “it just works” thing as possible, but it’s the first step and if it isn’t perfect right out of the gate, I hope you have some patience with us. I’m saying this because like I said, the surface area touched is immense here and shipping a whole graphics driver with an application isn’t really something super common and, as I have found out, sometimes breaks stuff.

The good news is that Zink is open source and we are building it ourselves, which means that for the first time we can actually see under the hood when things explode. I have very high hopes that this will help us track down issues much faster than usually. Normally drivers come with all debug data stripped, so a few times I have seen bugs that just end somewhere in the driver with no way to tell what even happened or how to reproduce it. Sometimes we don’t even have any information at all because it got so thoroughly muddied.

I’m a developer, how does this affect me?

Well, same as above: Test your plugins, file bugs, be patient. But also, there are a few things you might want to be aware of in general:

First, X-Plane now finally lets you enable a debug GL context. If you run X-Plane with --debug_gl, X-Plane will make a debug GL context for you and then wire up the necessary callbacks. By default it’ll print all messages into stdout and errors get a big in sim pop up. But you can always redirect it to something of your choosing by calling glDebugMessageCallbackARB() with your own callback. Please don’t ship plugins with a handler enabled though, because it might lead to other developers not being able to set their own callback as there can only be one. The debug GL context is available when running through Zink and also the native GL driver.

Gotcha wise, there are two that I’m aware of:

  • In theory you can make a shared GL context for background GL processing, but it might not be 100% stable. I’m still trying to track down an issue somewhere in the stack that leads to resources being incorrectly deleted, so if you run into issues with a shared GL context, this might be it. Please try it though!
  • Don’t disable and/or enable GL_FRAMEBUFFER_SRGB, this will lead to all subsequent rendering to disappear. This bug I have tracked down further into Mesa and the problem is that the driver will create a copy of the image to add or remove the sRGB bit, but it never ends up copying the result back over. In theory this should be handled by just a view on the same image without any copies, but either way this is currently broken.

If you want to test Zink as part of some CI solution, you can also run X-Plane with --zink or --no_zink through the command line and it’ll override whatever was set in the graphics settings.

I’m on macOS and I feel left out

First of all, I’m sorry to hear that. 12.04 has great things for macOS users as well that I’m sure you’ll love. Long term, we are having ideas of running Zink on macOS too, just this time on top of Metal. GL on macOS is already emulated through Metal, it’s just done by Apple without visibility or ways to tap into that. We have a bit of a pipe dream of running plugins on top of Zink on top of MoltenVK on top of Metal, but this is purely in the ideas bin right now and no code for this has been written. There would be two advantages for this approach though: First, Apple has deprecated OpenGL already in macOS and while I do believe they will continue to support it, lest their pro users will climb on their roof and shout bloody murder, they clearly have no interest in expanding OpenGL support any further. Secondly, if we get OpenGL bridging down to just Zink on all platforms, it’d be a boon for developers because they can target just one OpenGL implementation and cover all platforms in one go. It’d also finally bring OpenGL 4.6 support to macOS, which is currently held back to OpenGL 2.1.

Posted in Development, News, Plugins by | 20 Comments

Altitude Management: A Tale of Ups and Downs in the ATC System

Deciding what altitude a particular flight segment needs shouldn’t be tricky, right? You take off from somewhere near ground level, you climb to whatever you chose for cruise altitude, you start to descend when you get near the destination and eventually end up on the ground again. What could possibly go wrong?

Why, I’m glad you asked! Make yourselves comfortable, this might take some time.

A bug report arrived from someone saying they’d been vectored into a hillside on approach. That’s something that has had a lot of attention given to it for X-Plane 12, so I jumped on it and reproduced the flight. Happily the person reporting had included the correct logfile (not everyone does, we get loads where the log shows the sim sitting at the main menu!) and given the flightplan details; nothing complicated, a simple direct flight between two airports about 35 miles apart, cruising at 6000 feet.

I set it up and let the AI fly. Takeoff was fine, and then it was told to climb to 8000 feet – above the requested cruise altitude. Checking the map, okay, there was a mountain ridge in the way so that makes sense. Then the problems started. Descend to 7000, then descend to 5500, then climb to 7000, then an endless loop of climb/descend to what looked like random choices of 5000, 6000, 7000 and 8000 feet.

All of the “normal” – and a lot of the unusual – situations for approach and landing are covered in automated tests and they’d last passed the previous day, so I knew that this wasn’t a common problem but it would still be damned annoying if it happened to you.

Digging in a bit, the first thing I found was a good old-fashioned bug. Before X-Plane 12, the ATC system was pretty much exclusively written for airliners and an old bit of code had a problem where, if you were below a normal cruising altitude for an airliner, you might be told to climb slightly before starting the descent. This was kicking in because, when the AI was handed off from tower to the next level controller, it was already close enough to the destination airfield to be seen as an incoming arrival.

If you think about it, this completely breaks the simple altitude model already. The Cessna 172 climbs slowly, so it was approaching the whole “descend, approach, land” sequence from below. X-Plane 12 is wise to this though, so it shouldn’t have been a problem.

So, we’ve got one inappropriate climb instruction sorted. Re-test.

As expected, much the same as before; total indecision on the part of the controller. The next problem soon comes to light: terrain avoidance.

On the face of it, terrain avoidance should also be simple: If hill then climb. Most of the time, it is. Where that falls down is where you’re deliberately trying to get close to the ground like, say, during approach and landing.

If you’re familiar with aviation charts, you’ll know the acronym MSA – Minimum Safe Altitude. Basically the chart is divided into large squares and, in each square, there’s an MSA given. If you fly through that square, you’ll be guaranteed not to hit the ground if you stay above that altitude. It’s simple, it works, and X-Plane does pretty much exactly the same. The terrain elevation data is reduced so that a single pixel gives the MSA for whatever area that pixel covers, and this makes it relatively quick and easy to check.

This flight had a couple of steep ridges going from sea-level to about 6,200 feet which ended just inside one MSA square, and the flight was going just along the top of it at about 90 degrees to the ridges. A few hundred meters difference in location when the terrain samples were taken were enough to change the MSA between about 50 feet and 6,200 feet.

Checking a little to either side of the route can make this problem more or less go away, and that’s done in some places, but it can’t be used during approach because you’re actively trying to get close to the ground. If you went wide on the terrain checking, you’d never be allowed to land at any airport in a valley or just generally mountainous terrain.

So, back to the problem. The terrain avoidance systems were getting two very different readings depending on both exact timing and position because they were just clipping the edge of the MSA squares and one of those squares covered high ridges which finished at sea level just inside the square’s boundary. One moment it would think you had 5,000 feet of clear air beneath you, the next it was asking the poor, confused AI to climb to avoid terrain.

This problem can’t really be fixed as such, but it can be improved by reducing the sample distance and using full-resolution elevation data instead of the MSA-square summary. The problem with that is that it’s more expensive in CPU terms so it can’t be done all the time. Think of a flight from London to Delhi; checking that for every 30 meters along the route is going to take a long time, and not all of the high-res data is even in memory at once. However, high-res data is already used in some cases, notably for short legs close to the MSA or for known approach legs, but this was happening on a longer cross-country leg which happened to be the one before the actual approach started. Still, easy enough to adjust for that so let’s do that and see what happens.

The next flights were much, much better. Yay! Go for a celebratory coffee, but something nags at the back of my mind.

Coffee over, check the exact routes on the map (anyone can do this – it’s on the Developer menu as “Toggle Air Traffic Paths”). Yep. The wind had changed – I had real weather enabled – and the cross-country leg was starting a couple of miles further north, which meant that all the nonsense with clipping corners in the terrain avoidance code had simply stopped being an issue. 


Set manual weather, re-test, and… well, it’s better, but still bouncing between two different altitudes even though the MSA’s now more or less stable.

If you remember, this is all happening during approach. When these segments are created, the terrain clearance for each one is checked and the overall approach profile is modified so that you’re not told to descend to the normal altitude, then climb again for terrain avoidance for a later part of the approach. For this flight, the destination airport was on the plains near the coast but surrounded by high mountains to the south, so this system was kicking in and keeping the approach altitudes much higher than they would normally be. However, there’s one more waypoint involved; this is created somewhere between you and the airport and used as a kind of gateway between cruise and approach. The segment after this waypoint was also being terrain-checked, but if any terrain-related adjustments were made to the subsequent approach segments, they weren’t being pushed backwards onto this pre-approach leg. Normally, this wouldn’t happen and even if the approach were modified to clear terrain, it would have to be a very unusual, large adjustment to kick the approach legs higher than the pre-approach waypoint. 

Yep, you guessed it.

Still, at least that’s a simple one to fix. Do that, re-test.

This fix is good and the next set of altitudes is… oddly low. So low, in fact, that the “oh shit” mode of the terrain avoidance kicks in. This ignores the route entirely and just uses the plane’s recent movements to predict a near-future location and checks that. This means that the MSA is being ignored somewhere, and there’s now a missing climb instruction.

More testing and this turns out to be caused by a check, during approach, which tries to avoid unnecessary climb instructions. If you’re already at low altitude and call in to an airport to land – i.e. a typical small-plane flight – you don’t want to be told to climb thousands of feet only to descend back to pretty much the altitude you’re already at. So, the controller tries to be nice and lowers parts of the approach if you’re already underneath it. That’s all fine, but… not… if… the approach has been raised to avoid terrain!

Fix that, re-test.

All is well for the first half of the flight. I know, from watching the code as it runs, that from here on in the MSA should be in the region of 5,200 to 7,200 feet depending on the exact timing. High resolution elevation data is being used now, the two mountain ridges are steep from left to right and fairly narrow back to front in relation to the flight direction, so the MSA can vary quite quickly. The expected climb instruction comes in: “Climb to FL080”. Wait; eight thousand?

This was a flight-level though. Checking the transition altitude (the point where it stops using “feet” for altitude and starts using “flight level” and a specific set of rules for choosing them) for the approach controller shows that it’s set at 6000 feet. Yet again, tiny changes in both timing and position were affecting the MSA, but this time it was because the high-resolution elevation data was being used. For the low end, a simple “add some wiggle room and round up to the next 500 feet” was coming up with either 5500 or 6000 feet. At the high end, it was being rounded up into flight-level territory and, because of the direction of flight, punted upwards to either FL070 or FL080. This was only happening because the requested altitude in the plan was exactly on the transition altitude!

Okay, so this one’s probably confusing, but not technically wrong – certainly within the limits of the system.

So the original, simple “Let the AI fly a route and see if it starts tunnelling” check has now taken three days to properly resolve, between investigation, code changes, many re-tests, and then validating the changes on a larger scale using the existing automated tests. On the plus side, it’s been an absolute torture-test for a number of systems which worked just fine in most circumstances, and has brought out problems that were able to be either fixed or at least explained. On the down-side… yeesh!

For a normal flight, none of this would have been a problem. You’d be way above the terrain, descending onto the approach from above. This flight was short, so the slow-climbing Cessna 172 was still on climbout when the approach vectors were issued for altitudes higher than it was currently at. In between the two airports there were ridges which just clipped terrain-altitude data squares so MSA checks returned altitudes which varied significantly with tiny variations in both position and timing. The destination airport had no flows defined, so X-Plane was auto-generating them, but this doesn’t look at terrain so thanks to the airport being in a steep valley, the MSA of the approach vectors unusually remained at 4,500 feet all the way in to final for an airport close to sea-level. Finally, the planned altitude was exactly the controller’s transition altitude, magnifying small differences which would normally be rounded away.

If either airport had been a few miles north or south, or further apart; if the ridges had stopped a few miles further south; if the coast had been a few miles north or south; if the aircraft in use had been able to climb to cruise altitude faster; if the plan had requested an altitude which was above the controller’s transition altitude; if the terrain MSAs hadn’t also straddled the transition altitude; if the airport had defined flows which prevented landings from the south; if the wind had been different. If any of these things had not been exactly as they were, little or none of this would have happened.

So, my – er – thanks to the person that filed this bug report! Completely by accident, you sent several systems beyond what they were able to do and, by filing the report and actually attaching the log from the same flight, allowed me to dig into the system and get rid of a good number of rough edges. It’s also given a fantastic example of “Pssh, how hard can it be?” for the obvious assumption of “well, you climb, then you descend, job done”.

Plus a couple of sleepless nights, but hey.

Oh, the “vectored into a hill” problem? Couldn’t reproduce it.

Posted in Air Traffic Control, News by | 18 Comments

Testing 12.01, 12.02, 12.03

Hello there!

Well, this is embarrassing. I’ve been meaning to post to the dev blog for months now; all sorts of new features, important bug fixes, and interesting tech has gone by. As you can imagine, it’s been really, really busy with the release of X-Plane 12 and subsequent updates, plus a number of us spend time in the dev lobby trying to help third parties and sharing pre-release experimental code.

So this post will be a quick overview of some of what has been going on and what is coming.

Move Fast and Fix Things (Hopefully)

Since we shipped X-Plane 12.00, we’ve been aiming for a fast tempo for updates and patches; more frequent, smaller patches so we can get key bug fixes to the entire community quickly. X-Plane 11 had one or two updates a year, and each update would take three months in beta because it was crammed to the gills with features. We’re targeting less than a month with these patches.

Here’s what we have shipped so far:

12.01 – lots and lots of bug fixes, new weather datarefs, and new OBJ features to help aircraft authors move to X-Plane 12.

12.02 – fixed memory leaks.

12.03 – scenery fixes, approach light fixes, and library elements to unlock the X-Plane Scenery Gateway

12.04 – in beta now! New plugin APIs (dataref introspection, sound APIs, weather APIs), weather fixes.

If there’s a theme here, it’s sanding down the rough edges of 12.0 and making sure third parties can create add-ons for v12.

Some Details: Sound

In X-Plane 11, we moved to FMOD as our sound engine; in X-Plane 12, X-Plane does not use OpenAL at all. Add-on developers have two choices:

  • You can still use OpenAL, but you have to include it in your add-on yourself.
  • Use FMOD! The X-Plane SDK has a new XPLMSound API that provides basic sound capabilities and a bridge to FMOD for advanced use.

Using FMOD lets your add-on create sound within X-Plane’s 3-d environment.

Another way to add sound: in X-Plane 12, objects added by plugins via the XPLMInstance API can include .snd files and attached sounds, just like aircraft. We use this on our ground trucks, and you can use it too.

Some Details: Approach Lights

In getting the scenery system ready for Gateway authors to create airports, we fixed a few long-standing problems for approach lights:

  • Approach lights will now appear over water even if you use a pier. So you can model the piers for approach lights (e.g. at KBOS, KSFO) while using the built in approach lights.
  • Approach lights can sit on top of gantries when they need more height, like you’d see at KBWI (see runway 10) or Dallas Love Field.
  • The scenery has the approach lights and approach path cut out from the autogen so you can see the lights and make it to the runway. You don’t need to use exclusion zones – the cut DSFs are more precise.

Always use the built-in approach lights – you cannot create the ‘rabbit’ strobe in an approach sequence by hand-placing the lights, so we wanted to make the built-in ones work.

What’s Coming Next

There’s a lot more we’re working on, which I’ll discuss in a future post, but here are a few hilights:

  • The airbus FMC is close to being ready to show – there’s a ton of new tech there.
  • We are rewriting a piece of the rendering engine to use VRAM much more efficiently. This should help fix blurry textures.
  • Lots of bug fixes and improvements to cloud rendering, including performance optimizations.
  • Bug fixes and improvements for physics and systems.

Several features are down-stream of improving VRAM efficiency:

  • We’re not happy with how orthophotos and the new water system interact, but we need the more efficient VRAM system to fix this. I’ll post about orthophoto authoring as soon as we have more information.
  • We have improved bloom, also dependent on the new VRAM system.
  • We may bring back a lighter version of exposure fusion – this will be up to the art team to decide if or how they want to use it.
Posted in News by | 52 Comments

X-Plane 12.00b6 Out Now

Beta 6 of X-Plane 12 Early Access is available on Steam & through the Laminar Research installer. You should be prompted to auto update the next time you launch the sim, if you haven’t already. Here is a link to Early Access release notes.

This version should fix the problems launching via Steam on Linux. It also has more fixes for magenta NaNs, so hopefully there is more or widespread relief on that front.

We’ve heard multiple reports about external visual networking being broken since beta 4, and we are currently investigating.

Finally, X-Plane 12.00 beta 6 includes internal changes to support the .ktx2 texture format. We are working on tools and documentation to go with these engine changes, and will post detailed information on how to use .ktx2 once the specs and tools are complete.

Posted in News by | 22 Comments

X-Plane 12.00b5 Released

Beta 5 of X-Plane 12 Early Access is available on Steam & through the Laminar Research installer. You should be prompted to auto update the next time you launch the sim, if you haven’t already. Here is a link to Early Access release notes.

This build contains a fix for the crash at start many of you reported in beta 4. So again, if you are still seeing it, let us know by filing or re-filing a bug. Windows users should include their email in the crash report so we can find your specific crash. Mac users should send the Apple crash log with their report. We are actively working on restoring auto crash reporting on Linux.

We’ve heard a lot of reports that Steam users on Linux have been unable to launch the sim since beta 4, and beta 5 is no different unfortunately. We are investigating with Steam now.

Posted in News by | 10 Comments

X-Plane 12.00b4 – Magenta Relief?

Beta 4 of X-Plane 12 Early Access is available on Steam & through the Laminar Research installer. You should be prompted to auto update the next time you launch the sim, if you haven’t already. Here is a link to Early Access release notes.

This build contains multiple crash fixes, as well as our first go at fixing the magenta (aka pink or purple) sadness. X-Plane renders magenta when it hits a numeric error (a NaN value) inside the rendering engine. There may be multiple causes of NaNs – it’s not all one bug because magenta is a symptom, not a cause, and each bug has to be squashed one by one.

Don’t be surprised if some users see less magenta in the this beta and others do not. If you still see it, please file (or re-file) a bug that includes a screenshot or two of where you see it, and any steps needed to reproduce it.

Posted in News by | 17 Comments

X-Plane 12 Early Access Notes for Aircraft Developers

We’ll start with the wings, which I’ve found to be very important:

The entire flight model is based on a new type of memory-access that is fast for the product you get, but slower and constantly self-checking for the internal builds we run for testing. We now have vectors of props, wings, and bodies… and access those vectors by accessors that hop right through to the memory for speed in the delivered sim, but do bounds-checking first to make sure no illegal accesses are even REQUESTED in our internal self-check builds. This entire new architecture, coded by me in the first month or so of the virus – when I could not even leave my house – sets us up with a platform that is flexible, fast, and bullet-proof to use. This new architecture allows for up to 16 engines and props, which is useful for the new generation of eVTOLs, many of which have more than 8 motors and props!

Now, for these wings and prop blades, we now allow THREE airfoil files per wing, not two like we used to, so you can have root, middle, and tip airfoils, which is especially useful for propellers! Well-modeled props have thick airfoil files at the root, mid airfoil files at the mid-span, and then go to a very thin foil right out at the tip to delay shock-wave formation at high speed. We now allow all the Reynolds numbers you like for each foil, so the way to get variation with Reynolds numbers is to put them in the airfoil files in Airfoil-Maker.. we don’t have multiple slots for different Reynolds numbers in Plane-Maker any more: that was always limited and awkward: It’s much better to save all your data for different Reynolds numbers for your airfoils in Airfoil-Maker, so that’s what we do now.

So everything you are about to read about is based on a new, high-speed, self-checking memory-layout that allows 16 engines and props, and 3 airfoils per flying surface.

First off: Wing sweep improvements. As air approaches a wing, it has to SPEED UP to get out of the way of the metal. It has to speed up to go around the wing! As a wing approaches the speed of sound, therefore, the air near the wing (still speeding up!) must EXCEED the speed of sound to get out of the way of the wing fast enough! In other words, the air around the wing goes supersonic even when the wing itself is still below the speed of sound. This causes shock waves, huge drag, and even loss of lift. The thicker the wing, the more the air has to accelerate to get around it, and the greater this effect. Nobody wants all this extra drag as they fly at airliner speeds (which DO approach the speed of sound) so in World War 2 the Germans came up with a way to cheat: Sweep the wing!

When the wing is swept back, the airfoil SEEMS THINNER to the air. That means that the air is in less of a rush to get out of the way: That localized supersonic flow, and shock waves and drag that result, are delayed! You can go faster before you run into these shock waves. But here’s the thing: You can only cheat so much! No matter how swept the wing is, once your airplane is going Mach 1.00, you have fully supersonic flow over every bit of that wing: You can’t escape supersonic flow with wing sweep! Wing sweep only makes the wing seem THINNER, letting the air accelerate LESS get around it, letting you get CLOSER to Mach 1.0 before you see supersonic flow over the wing! The thinnest, most highly-swept wing in the world will not AVOID supersonic flow, it will just let you get much CLOSER to Mach 1.0 before you get supersonic flow, and drag. X-Plane 12 now understands all of this, and invokes transonic drag at the right time based on wing-sweep, and transitions to fully supersonic flow by the time the aircraft Mach Number hits 1.0. It’s a nice interpolation from the subsonic to supersonic flow models as the flow goes from transonic to fully sonic on the wing! Back in X-Plane 11, the simulator delayed supersonic flow based on wing sweep until some value PAST Mach 1.0, which was erroneous! Forget that! So here is what version 11 did wrong: X-Plane 11 simply imagined that the effective airflow over the wing was multiplied by the cosine of the wing sweep. In other words, X-Plane 11 though that if you had wing sweep, that meant that you got out of challenging the air head-on, and it reduced the effective airspeed over the wing since the wing was getting out of a direct confrontation with the air by sliding through it sideways. This was so close, but not as good as it could have been.

To REALLY get it right, we need to understand that as you approach Mach 1, we do NOT imply REDUCE THE SPEED over the wing by the cosine of the wing sweep: Instead, we are making the AIRFOIL THINNER by the cosine of the wing sweep. Mach-1 flow hitting the wing is still Mach-1 flow over the wing! Wing sweep only makes the wing appear thinner to the arriving airflow.. it does not actually reduce the speed over the wing. This is really subtle, but matters a lot for transonic drag (drag from the formation of shock waves as we APPROACH Mach 1), so we will see more accurate formation of shock waves and resulting rise in transonic drag in X-Plane 12 than we did in version 11: Make sure your wing sweep is entered correctly, make sure you airfoil thickness is entered correctly in Plane-Maker, and expect drag rise as you approach Mach 1. Thinner, more-swept airfoils will be called for, the closer you get to Mach 1. The real Citation X (and the simulated Citation X in X-Plane, of course) are perfect examples of how important these two factors are in approaching Mach 1: The wing of that airplane is very very thin and very highly swept.

New tire rolling coefficient of friction data:

Observe these charts:

As you see above, rolling coeffs go from about 0.006 to 0.01 for high-pressure tires,
and 0.01 to 0.02 for more medium pressure tires.

So your planes should probably use 0.008 for the airliners and fighters,
And about 0.016 for the general aviation airplanes,
And about 0.040 for the piper.

Everyone that enters airplanes themselves should go to Plane-Maker and set tire coefficient of fric to about 0.008 for airliners to 0.01 for lower pressure airliners to 0.02 for light planes to 0.04 for very low pressure tires like the tundra tires on the Piper Cub.

Hydroplane speed more accurate, and on-wet friction a bit higher.

Water: Improved floatplane dynamics!

I’ve been working with Bridger Aerospace to get their fire-fighting seaplanes simulated, and the result is really incredible.
It took about FIFTY different alpha builds, each one with further-refined water dynamics, but we finally have the parasite drag, wave drag, plowing, step-taxiing, running on the step, wave interaction, and even drag from the scoops on the firefighters that grab water all simulated properly for Bridger to train their next generation of pilots! So the float-plane dynamics in X-Plane 12 are now professional-grade, for people that fly float-planes to put out fires for a living!

In addition to the dynamics of the floats themselves, we have better rendered wake, wind and wave correlation, and even docking with hard docks!

One subtlety is the new wave height paradigm:

Enter the wind and stuff, and look at the wave height slider: You see the range of heights as a little tip at the bottom, so you can drag the wave height slider accordingly for the conditions you want to fly…
Then, at right you see the little tip on the wavelength and speed that results from the height entered
We are doing first-principles with wave length and speed, and they match up with your chart pretty close, so I think we are good there.

For real-weather, the wave height is auto-set to the SHELTERED case, based on the lowest-alt winds
So I think that has us where we want to be, with plenty of little notes there in the UI to show us what is going on… and give instructors the ability to set conditions as desired.. with the notes on the defaults available to them of course


OK I like this paradigm a lot: Total flexibility, with super-easy normal-case references available at-a-glance.

Corrected spoiler dynamics, very noticeable on airliners and the F-14!

This is big: The spoiler effects were TOO WEAK in version 11.
This meant that in the sim, all the planes that used roll spoilers, which certainly includes airliners, rolled too slowly!

As a result, many people over-sized their spoilers to get the desired roll-rate… and got too much DRAG from those over-sized spoilers as a result!


This has now been fixed for X-Plane 12!

NOTE: Aircraft designers should now go into their aircraft and make sure that they have entered the correct sizes for their spoilers.. they should now get more-accurate results!

Posted in News by | 2 Comments

X-Plane 12.00b3

Just a quick note that beta 3 of X-Plane 12 Early Access is available. You should be prompted to auto update the next time you launch the sim, if you haven’t already. Here is a link to Early Access release notes.

Beta 4 is currently in the works, going through test so we can release it next week. We expect to have our first go at fixing the magenta (aka pink or purple) sadness in that release, so please hold off on filing any further bug reports on this until you can try beta 4.

And this just in: X-Plane 12 for Steam is now available!

Posted in News by | 15 Comments

X-Plane 12 Early Access Is Here

Hello there!

Well, this has been a crazy couple of weeks. X-Plane 12.00 is now available for Early Access – in other words, everyone can get X-Plane 12. Over the next few weeks we will post more about ongoing development and get into some of the new features in depth – there’s a ton to talk about in X-Plane 12. For today, here are just a few notes on some issues that have come up over the last few days.

Early Access

X-Plane 12 has been in a private alpha test program with third parties since December (!) – almost nine months. During that time we built 38 (!) official alpha builds, recut the global scenery five times, and committed over 4000 checkins to X-Plane’s source code (plus more to the aircraft, scenery tools and art libraries). The alpha program included completion of major features, lots of debugging, and changing the product in response to early alpha feedback.

So why Early Access now? Not because X-Plane 12.0 is done – we still have over two hundred open bugs and a lot of things we want to do. X-Plane 12 is in Early Access so that the entire X-Plane community can be involved in X-Plane 12’s growth, not just a limited number of testers.

With X-Plane 12.0 in early access, we don’t have to say ‘no’ to users and devs who want to get started with 12, and third parties can get their entire teams using the new sim and run their own test programs.

(We can also finally open up our developer relations program to a wider audience.)

Major Areas of Work

Here are some of the major areas of work ahead of us:

  • Clouds – we are working on the shaping and quality of clouds, improving resolution, fixing artifacts, and improving performance. Clouds are probably the single most expensive part of the renderer, so they are a constant tug-of-war between quality and speed.
  • Lighting – there are quite a few lighting and atmospheric scattering bugs that affect the sim, as well as work to do improving auto-exposure and tone mapping.
  • Philipp is working on an airbus MCDU, which we expect to ship during early access.
  • Third party interfaces – we have a few new SDK and authoring features that are mostly completed that will ship during early access. The elephant in the room is third party access to the weather system.

That’s One Blurry Airbus

X-Plane 12 moves some work that used to be on the CPU to the GPU (looking at you, ocean waves!), and virtually all new computing work in X-Plane 12 is on the GPU. When we discussed this before Early Access, there was a lot of teeth gnashing. “You’re gonna use more GPU power? I can’t buy a 3080, I’d have to sell my kidney!”

We still have a lot of GPU optimization left to do, but we also spent some time before beta 1 working on performance, particularly at intermediate settings. User with high end hardware have been pleasantly surprised to see production-level FPS in beta 1, and a common request is “I have 60 fps and blurry clouds, can I get a higher max setting.”

(I do suspect there is a huge gulf between the haves and have-nots for GPU power – because there’s a huge range of hardware performance amongst our users. We will keep optimizing.)

What we didn’t optimize was VRAM use, and this is why blurry textures is a common problem with the first beta. X-Plane 12 uses Vulkan/Metal as its renderer, always, so it uses our Vulkan/Metal memory management strategy: we dynamically bring the resolution of textures down to fit within your available VRAM, with some guessing as to which textures are most important.

The texture slider in the UI sets the maximum texture resolution X-Plane will attempt – if you have a card without a lot of VRAM, setting this lower can help avoid “thrash” as X-Plane tries to fit 4 GB of textures into 2 GB of VRAM. But X-Plane will further lower res until it fits – X-Plane will not use system memory as backup texture memory, nor will it slow the framerate and stutter by shuffling textures between vRAM and system memory on the fly.

I’m afraid I don’t have any useful information about how much VRAM will get you a better experience – we’re going to do an optimization pass and see what we can tighten up.

I suspect the big driver of VRAM is memory used for effects – X-Plane 12 has HDR always on, but also has extra VRAM reserved for screen space reflections, 3-d water, dynamic weather effects, clouds, etc.

One thing that can help (and I know no one wants to hear this) is to run at a lower resolution. The sim has to internally use VRAM proportional to the size of the winddow or monitor res you fly at. Jumping from 1080p to 4K doubles the resolution in each dimension (making each pixel half as big) but uses 4x the VRAM for surfaces. Full screen anti-aliasing increases VRAM by its factor (4x MSAA = 4x VRAM) for some of those textures, so it’s more efficient than higher res.

What’s All This Magenta

X-Plane renders magenta when it hits a numeric error (a NaN value) inside the rendering engine. Right now there are multiple causes of NaNs – it’s not all one bug because magenta is a symptom, not a cause. A few we know about:

  • We believe there’s some kind of problem specific to the GeForce 900 series. Sidney bought one on eBay so we can debug this.
  • I’ve seen NaNs caused by the traffic debugging lines for ATC – I suspect that particular shader has a bug.
  • We can sometimes get NaNs from the past frame – they get “reflected” by SSR and propagate from one part of the frame to the other.

There’s no easy answer here – each bug has to be squashed one by one. These are high priority bugs and we’re working on them now – hopefully each fix will make things a bit better, but don’t be surprised if some users see less magenta in the next beta and others do not.

Fuzzy Scuzzy Rendering

FSR stands for FidelityFX™ Super Resolution. FSR is AMD’s free open source up-scaling technology. The idea of up-scalers is:

  • Lots of people have 4K monitors.
  • Not as many people have GPUs that can run games and simulators at 4K – they’re expensive.
  • Upscaling a 2K image with a little bit of smarts uses a little bit of GPU and looks a lot better than just running the monitor at low resolution.

When you move the FSR slider to the left, X-Plane renders its 3-d image at a lower resolution and then upscales it to the monitor. This saves GPU time and VRAM at a cost of image quality. The image should look better than running at low resolution but not as good as running at high resolution.

Should you use FSR? I would only recommend using FSR if you want to/need to run at 4K and your GPU is struggling. Support has had a number of complaints about blurry rendering from users with FSR on – FSR is resulting in a less detailed image on purpose just like reducing resolution does. If you are going to use FSR, use full screen anti-aliasing – it helps.

We are still undecided about the future of FSR in the simulator. We added the option of up-scaling based on user requests, and if we didn’t ask for it, we’d probably be asked for it. But we’ve also had lots of “I set this slider low and now everything looks terrible.”

(Why don’t we use FSR2 or DLSS? Both of these upscalers require motion vectors as inputs from the rendering engine, something X-Plane does not provide. We may support them in the future, but adding motion vector generation is not trivial.)

Beta 3 Coming Soon

Over the past weekend part of the team met in person to do planning and roadmapping; beta 3 should be available shortly, with some of the bug fixes we’ve already coded. X-Plane 12 for Steam is in review — hopefully it will be available Real Soon Now™.

Posted in News by | 149 Comments