New Documentation – 12.4.0 3D Sidewalks
We have new documents available for our new 3D sidewalks in X-Plane 12.4.0. Check them out!
Read MoreWe have new documents available for our new 3D sidewalks in X-Plane 12.4.0. Check them out!
Read MoreWorldeditor 2.7-beta 1 is now available. This is mostly a bug-fix release, but there are two new features included, including a refreshed UI!
Read MoreThis is a blog post that I have dreamed of writing for years, in fact ever since I got hired 8 years ago: The glorious multi-core future is now. But, as always, there are strings attached so let me explain what’s in this release and what to expect. First though, if you need a primer on performance in general, you can read all about it here: A very quick performance primer
Let me get this out of the way first: Don’t bother asking what you can expect in terms of performance gains. You could see anything from none, moderate to a lot. Multi-threading inherently only affects the CPU, so if you are GPU-bound, you won’t see any improvements in terms of FPS because the limiting factor is still the GPU. Everything else depends on how you have configured X-Plane, your hardware, what add-ons you are running with etc. The only way to know what, if any, improvements you will see is by installing 12.4 and trying it out yourself.
Also, this isn’t the last multi-threading update. I’m very excited about it, but it’s a small fraction of what we have planned. There is more engine refactoring work to be done, more code to be optimized, but we figured “Why sit on improvements that we have right now when we could get them out to customers to properly battle test them?”
One myth is that X-Plane was not multi-threaded at all, which depending on your point of view is either patently false or somewhat true. X-Plane does a lot of work on background threads, especially scenery loading and texture paging. But those are all long running background tasks, what we lacked so far was true per-frame multi-threading. We had a few small tasks that could run in parallel, but the bulk of the frame was generated on the main thread.
It’s generally assumed that the flight model takes up the most time for X-Plane, but in practice, it’s usually scene graph traversal and rendering that make up the bulk of frame time, sometimes up to 75%. The more demanding your scenery, the more time will be spent on this task. For those not in game dev, scene graph traversal is the process of, well, traversing the scene and figuring out what needs to be rendered and what doesn’t. The second part is processing the data that needs to be rendered and then actually issuing all of the rendering commands, this usually involves sorting the render data in some way to reduce the number of material and state changes. All of this takes time and the more complex the scenery, the more time this takes.
There is one more thing to keep in mind: Shadows. Shadows get rendered by rendering the scene from the suns perspective, which is then used to figure out which parts of the scene the sun can see and which it can’t. By definition, everything that the sun can see is in the light and everything the sun can’t see is in the shadows. But that means that we actually have to traverse the scene twice, once for shadow rendering and once for the main scene, so while the cost isn’t double, shadows aren’t exactly free either.
^ This is a very simplified graphic demonstrating the concept of threading in X-Plane. It is neither a statement of the number of cores used nor the number of jobs created per frame.
Because the scenery traversal process takes up such a large amount of the frame time, it makes for an obvious target for multi-core improvements. And that’s exactly what’s in 12.4. As soon as the camera is resolved and we actually know where the virtual eye is and which direction it’s pointing, we kick off the scene traversal process for shadows and the main scene. It’s actually done in multiple steps across multiple CPU cores, so that we can minimize the time it takes from start to finish.
While this goes on in the background, we are now also running the panels and avionic devices. This lets us effectively hide slower avionic updates, since X-Plane can go wide on crunching the scenery at that time. You will especially notice this with add-on aircraft that have very high panel draw times, but even our Garmin and built-in instruments aren’t totally free either.
Additionally, we try to schedule things in an ideal way. So we aim to get the shadow scenery traversal and preparation done first, so as soon as the panels are done we can start actually encoding the commands for the shadow rendering. While this goes on, the much more expensive main frame scenery traversal can finish up in the background and ideally we can immediately hit go on its rendering command generation once that is ready.
Of course this is the theory, in practice things might not finish in time and then the main thread has to wait for results to come in. It should still be faster because the scene traversal itself is done in parallel, so it should be faster than if only the main thread was working on it by itself. But theory and practice don’t always line up. Again, the only way to know what perf you will see is by testing this yourself.
Additionally, we have also improved the drawing hot path and reduced the number of state changes X-Plane has to make in order to from one object to another. We also moved a lot of the just-in-time calculation for material parameters and data to the background thread so that once we are actually drawing things, we can just emit commands as fast as possible.
However, actual drawing of the scene is still single-threaded! Once the parallel scene traversal has concluded, X-Plane’s main thread will still create one command buffer to encode all of the rendering needed. Likewise, multi-monitor set ups could see a much bigger improvement in theory, but in practice we still have to traverse the scenery of each monitor in sequence.
The obvious two are parallel rendering of the frame and doing multiple monitors in parallel. The less obvious one is that we could also do the shadows and main rendering in parallel and then just submit the work to the GPU in the right order. All of these are on the roadmap, but they require more work to the engine itself. There is still a bunch of shared global state when it comes to actually rendering a scene, which we’ll have to clean up first.
One of the things that makes me really excited is the new job system that has actually been shipped in 12.3 and which is the underlying thing that makes the multi core work possible. Instead of carefully writing C++ that dispatches and joins all work in just the right order, we can now describe the frame as individual jobs and their dependencies and the computer can figure out the optimal way to dispatch them. This is analogous to the render graph system that we introduced in 12.06 which allows us to describe the scene rendering as a series of nodes with carefully defined dependencies and then the computer can figure out how to actually bake the commands and build the resources.
This gives us huge flexibility in terms of being able to re-organize the frame, since it’s no longer a massive monolithic chunk. Besides the obvious grand improvement that is parallel rendering, we also expect to be able to leverage this system to further improve performance by scheduling the frame more efficiently. But now that the initial work is the boring present, all of this is becoming the new glorious future.
There is a lot of misconception about performance that I see floating around the interwebs, so I wanted to just give a general primer on the topic and hopefully clear a few things up. Performance is largely determined by 2 components; Your CPU and your GPU. If you enable the FPS output in X-Plane, you can see detailed information about how performance is coming together.

^ This is a simplified graphic
There are multiple columns here, f-act is the number of frames presented per second. Then there are also frame, cpu and gpu, which are measured in seconds per frame. In this case the CPU column reads 0.0110 which is equal to 11ms (milliseconds), while the GPU column reads 0.0094 or 9.4ms. In this case, the CPU takes longer to produce a single frame and is the bottleneck, although not by very much. The frame column is the actual time taken per frame and includes additional overhead from the driver and operating system and in this case it’s 0.0121 or 12.1ms, an additional 1.1ms of overhead over the CPU time.
You can use these numbers to figure out what settings to reduce to increase FPS. Whichever number is higher, CPU or GPU, is the limiting factor for performance. If you are CPU bound, you can spend any number of dollars on a new GPU and not make a dent in performance. The same is true the other way around as well.
This is true for every game and simulator by the way, not just X-Plane. Too often I see someone online say something like “I bought $(very expensive graphics card) but my performance is still the same”. Before you go out and spend a lot of money, make sure you are spending money on the right part!
Performance is usually measured in frames per second (FPS), but it’s actually not that good of a measure. As developers we prefer to think of performance in terms of time taken per frame, which is the inverse of FPS. You can convert between the two by doing FPS = 1 / frame_time or frame_time = 1 / FPS. At 60 FPS you get 1 / 60 = 0.0166666667, the time being in seconds, gives 16.6ms (milliseconds).
The reason we prefer to talk in terms of time per frame is that FPS doesn’t work as a relative measure. “5 FPS more” or “10 FPS less” doesn’t actually mean anything without some baseline to anchor it to. Let’s pick 3 data points, 30, 60 and 90 FPS and a relative measure of 5 FPS less. Here are the results for this:
(1 / 25) - (1 / 30) = 0.0066666667
(1 / 55) - (1 / 60) = 0.0015151515
(1 / 85) - (1 / 90) = 0.0006535948
If your baseline was 30 FPS, losing 5 FPS is a whopping 6.6ms of additional time taken per frame. At 60 FPS it’s 1.5ms and at 90 FPS it’s 0.6ms. That’s a huge difference! 6.6ms is a lot of additional time per frame and is a real problem, while 0.6ms isn’t all that much. This is why we prefer to talk about time per frame, 1ms is always 1ms.
Hopefully this also demonstrates that this is a “The rich get richer” type of thing. If you start out with very high CPU times, you will have shave off a much larger amount of CPU time in order to get more FPS, while those starting with quite low CPU times already need to move the needle just a little bit to get more. Every doubling of FPS requires a halving of the frame time, and half of 16 is a lot less than half of 33.
For a full breakdown of 12.4.0 and current multi-threading expectations, please see this blogpost: The glorious multi core future is now the boring present
We’ve got a thing that’s called Radar Love
We’ve got a line in the sky
Radar Love!
Ok enough of that… 12.3.0 is finally available as a public release, and we can’t contain our excitement. Let’s recap what is new!

It’s finally here: the weather radar is now available in X-Plane. This is a major enhancement over the pre-existing EFIS radars, which are a rather crude depiction of NEXRAD/Cloud coverage… and not a real-time probe of cloud precipitation (and thus simulating the radar returns.)
Aircraft Authors have a few options when implementing WXR
For more information about implementing a WXR, see this article
https://developer.x-plane.com/article/weather-radar-for-x-plane-12-3-1/
*The Baron 58 in X-Plane uses the RDR-2000, which is actually a plugin and art resources completely separate from our default instruments. To discover custom drawing, you can follow along the code-base here.
https://github.com/X-Plane/RDR-2000
We’ve got a new version of our SDK for developers, which includes the following:
https://developer.x-plane.com/sdk/plugin-sdk-downloads/
Scenery Artists also get a few new improvements. Some of which were also requested by the community. These include…
This now takes our feedback list to…
Ya’ll are gonna love the next batch of assets currently in development… SPOILERS 🙂
(Skips away like a schoolgirl)
Finally, a huge thanks again to our Gateway artists. This time around, we have 405 airport updates/or additions for 12.3.0. (Not every airport is represented; the list is around 98% complete)
X-Plane supports connecting your favorite real-world EFB app like XAvion, WingXPro, ForeFlight and FlyQ. This way, you can use your iPad or tablet just like you would in a real cockpit – display enroute charts, approach plates, with optional weather and traffic overlays.
This worked extremely well with the XAvion app, a Laminar in-house product, but for 12.3 I wanted to improve support for other popular apps.
Foreflight showed me where I was, and also some traffic diamonds around me, but synthetic vision didn’t work, relative motion and tail numbers on the traffic didn’t work, there was no METAR and the NEXRAD didn’t show either.
Getting synthetic vision to work required sending the AHRS data in a way modern EFBs understand. Austin had coded this in 2013 when the ADS-B receiver of choice was a little plastic box called Clarity, that when you pushed the on-off button too hard just collapsed on itself. We’ve had several that lost their on-off button after you turned it off a bit too vigorously.
This was before the Appareo Stratus, uAvionics Sentry and other popular devices existed.
It’s been 12 years since then and X-Plane still pretended to be this falling apart, overheating plastic box… And Foreflight would flat out reject anything that X-Plane tried to tell it.
Luckily, it is easy nowadays to support ADS-B and GDL-90 thanks to an open-source project called Stratux!
I started by turning X-Plane into a simulated Stratux rather than a Clarity. Added the new AHRS messages, support for barometric pressure, etc.
Now, Synthetic Vision on the iPad was working! Traffic had relative motion!
But the weather was still stubbornly refusing to show up, even though all the weather packets were absolutely according to spec, and parsed to readable METARS, etc…
So something was still different.
Time to go wardriving!
I looked up the list of ADS-B towers: http://towers.stratux.me/
And glued my DIY Stratux into the window of my Tesla and went to see a tower!
These towers are optimized for sending data upwards into the sky, so you have to get rather close to them to pick up any signal on the ground.
I found one, parked my car, and started recording:
Unfortunately, the first tower I went to only rebroadcast traffic, but did not send any weather!
So, I had to drive to a different tower, until I found one that gave me the weather:
Picture me, parked outside the airport gate, with this thing in the window with wires coming off of it.
About 10 minutes in, some people from the local helicopter medical airlift service come out and politely ask me if I need help. I convinced them that I had no nefarious intent, was not spying, and merely taking advantage of the good reception under the tower…
Spoiler alert: I did not get arrested that day, despite having what looked like a makeshift detonator in the window.
With a few Megabytes of recorded FIS-B messages, I set up my remote office, and started to analyze what the difference was between the messages X-Plane sent and the messages I recorded from the tower:
Turns out, X-Plane didn’t fill in some header data containing a 80ns timestamp that shows when the packet was received from the tower (not the age of the weather report, simply when the receiver picked up the packet, measured using the GPS clock of the receiver).
Once I added this missing data, the weather is accepted as valid by my real EFB!
And boy does this work now! Look at all this data going into ForeFlight:
Now, you can tap an airport in ForeFlight, and it will show you the METAR of the actual weather in X-Plane at that airport, correctly indicating it came from ADS-B:
These two aircraft are AI aircraft, and the thunderstorm cloud north of Greensboro really was there on that day, but what you are seeing is the weather recorded on our server, replayed by X-Plane, and transmitted onto the iPad by X-Plane, showing what the weather looked like that afternoon!
And here you can see it works great with user-defined weather as well! Frankfurt did NOT have thunderstorms like that. This is simply me starting X-Plane in EDDF and setting the weather preset to nasty weather:


12.2.1 is out now, and the Gateway is now accepting submissions for airports authored in the current update. 12.2.1 represents a massive update dedicated to Gateway & scenery artists everywhere, with a variety of new assets, inspired directly by community feedback.
The art team have done an immense job with this update, and really deserves their flowers for this update…
Now as for “community feedback”, here is a list of collected results. Not everything will be displayed here, neither is this list representative of things we are definitely producing. I think the key takeaway here is “RELAX!” This won’t be the last time we add new art to the simulator (and we’re already underway on more items.)
On with the show…
For 12.2.1, people have constantly been asking for a list of all assets, as they do not have any tool themselves to see the full range of new art.
In fact… you do. You do not need to wait for us to tell you! Simply open WED, and filter the library list to “Newly Released Objects.” You do not need the latest version of WED either to see the full list (although you will for uploading to the Gateway!)
Before we get to the rest of the art assets, we do have to talk about ‘Hangars and Sheds.’ This was one of the items you guys have eagerly requested from our mini-survey a few months ago.
It would seem someone at Laminar locked Petr in his home, and drove him to insanity. Insanity really is the only way to describe the sheer number of hangars in this update. I can’t even show all of the new hangar assets here (about 1/10th of the actual size) but Petr has ensured that each Hangar type comes in multiple sizes + the option to use obj or facade-based hangars. IN ADDITION, he’s also added different sizes and options for Hangar doors, so the customisation for artists is endless (quite literally, the number of permutations is too big to calculate)!
For further documentation on these hangars, I would highly recommend you check out the article below:
Most of these have been brought to you by Justin. These will also play important roles as we slowly re-position ourselves towards next-gen scenery!
Airport lighting options come in multiple sizes and the option for Sodium vs LED.
Some people have asked what a “Size Category F” is….
12.2.1 also includes a new custom Heliport… LSEZ – Zermatt. Expertly crafted by Cristiano and Jan, this scenery holds a trick that may be useful for scenery creators. The glass has a feature we believe is undocumented called…
ATTR_layer_group blended
This helps mitigate some of the draw order issues previously experienced by artists for transparent materials.
Finally a huge thanks again to our Gateway artists. We have 613 airport updates/or additions for 12.2.1. (Not every airport is represented; the list is around 98% complete)
A013 – Bremer Bay
Afghanistan
OAKB – Kabul Intl
Antigua and Barbuda
TAPA – Antigua – V C Bird Intl
XTA0004 – Barbuda Intl
SABE – Jorge Newbery Aeroparque
SADF – San Fernando
SADO – Campo de Mayo
UDYZ – Zvartnots Intl
XUD0002 – Syunik
XY0057 – Deer Park
XY0058 – Avymore
XY0059 – Kindra Falls
XY005A – Upaykal
XY005B – Wynella
XY005C – Lake Marimley
XY005D – Newlands Coal
YBTL – Townsville Intl
YDPO – Devonport
YELI – North Percy
YGTO – George Town
YLIL – Lilydale
YLVY – Varley
YNUB – Nullarbor Motel
YPED – Edinburgh
YPOK – Porepunkah
YPPH – Perth
YRAM – Raymore Station
YREN – Renmark
YSPT – Southport
YSTW – Tamworth
YSWA – [X] Swansea
LOLT – Seitenstetten
LOWL – Linz
UBBB – Heydar Aliyev Intl
LB16 – Targovishte / Buhovtsi
LB17 – Sliven
MYER – Rock Sound
SBLO – Londrina
SBPJ – Brigadeiro Lysias Rodrigues
SBTE – Senador Petronio Portella
SDSV – Fazenda Santa Candida
SDTK – Paraty
SIWJ – Luiz Eduardo Magalhaes
SJIE – Grupo Scheffer
SJSH – Sonhar
SNAT – Aracati Canoa Quebrada
SNAV – Agrovale
SNPA – Para De Minas
SSGY – Guaira
XSB000J – Sobral Rgnl
XSB000Q – Embaixador
XSB000R – Clube CEU
XSB000S – [H] Beto Carrero Word
CAG8 – [S]Pender Harbour SeaPlane Bas
FS5 – Spirit River
XC0045 – [H] Harington Harpour Heliport
XC0046 – [H] St Augustin Heliport
EX4 – Carmacks
CSS3 – Montreal Les Cedres
CST3 – Saint Lazare
CYDQ – Dawson Creek
CYSA – Stratford Muni
CYYC – Calgary Intl
CYYR – Goose Bay
XC000W – Midway
XC0047 – Ile aux Coudres
XC00AW – [H] Delta Heliport
XC00D4 – Eaglesham/Codesa South
XC00D5 – Clairmont/Meyer’s Airstrip
XC00D6 – Beaverlodge/Clanaechan
XC00D8 – Telegraph Creek
XC00D9 – [X] Telegraph Creek
XC00DA – Eaglesham South
XC00DC – Eaglesham/Delta Tango Field
SCEL – Arturo Benítez Intl
XZ0025 – Zhuhai Jiuzhou
XZ003D – Zhoukou Xihua GA
ZLJC – Jinchang Jinchuan
ZLXN – Xining Caojiapu Intl
ZSPD – Shanghai Pudong Intl
ZSSS – Shanghai Hongqiao Intl
ZSYC – Yichun Mingyueshan
ZYYY – Shenyang Dongta
SKPS – Antonio Narino
XMR0006 – Aeropuerto de cobano
LDLO – Losinj
MUGM – Leeward Point Field
MUHA – Havana Jose Marti Intl
LKCB – Cheb
LKER – Erpuzice
LKFR – Frydlant
LKHV – Horovice
LKKL – Kladno
LKLN – Plzen – Line
LKPR – Praha – Ruzyne
LKPS – Plasy
LKRY – Rokycany
LKSA – Stankov
LKST – Strakonice
LKTD – Tachov
LKTO – Touzim
LKUL – Usti nad Labem
LKVO – Praha – Vodochody
XLK0006 – [H] Praha 19 – Kbely
XLK0007 – Plesnice
XLK0008 – Chotesov
XLK000A – Panosi Ujezd
XLK000B – Rabi
XLK000C – Napajedla
XLK000D – Lochousice
EDTE – Eutingen im Gäu
EKCH – Kastrup
MDCR – Cabo Rojo
MDDJ – Dajabon
MDPP – Puerto Plata Gregorio Luperon
EEEI – Ämari AB
EEKA – Kardla
LFBA – Agen La Garenne
LFBO – Toulouse Blagnac
LFHP – Le Puy Loudes
LFLB – Chambéry Aix-Les-Bains
LFLN – Saint Yan
LFOJ – Orléans-Bricy
LFRS – Nantes Atlantique
LFSB – Bale-Mulhouse
France (Mayotte and Réunion)
XFM0004 – Juan de Nova
NTAA – Faaa
FOOK – Makokou
EDAK – Grossenhain
EDAY – Strausberg
EDBM – Magdeburg/City
EDBP – Pinnow
EDCJ – Chemnitz/Jahnsdorf
EDDB – Berlin Brandenburg
EDDC – Dresden
EDDH – Hamburg Fuhlsbuettel
EDDK – Koeln – Bonn
EDDL – Duesseldorf
EDDV – Hannover
EDFA – Neu-Anspach
EDFD – Bad Neustadt/Saale Grasberg
EDFH – Frankfurt-Hahn
EDFR – Rothenburg ob der Tauber
EDGE – Eisenach-Kindel
EDGI – Ingelfingen – Buehlhof
EDGY – Kitzingen
EDHK – Kiel-Holtenau
EDLH – Hamm-Lippewiesen
EDLI – Bielefeld
EDLW – Dortmund – Wickede
EDMB – Biberach a.d. Riss
EDOA – Auerbach
EDPS – Sonnen
EDQD – Bayreuth
EDRK – Koblenz – Winningen
EDRY – Speyer
EDSB – Karlsruhe Baden-Baden
EDTM – Mengen – Hohentengen
EDTW – Winzeln-Schramberg
EDTY – Schwaebisch Hall – Adolf Würth
EDVI – Hoexter-Holzminden
EDVM – Hildesheim
EDWG – Wangerooge
EDWJ – Juist
EDWL – Langeoog
EDWZ – Baltrum
EDXK – Leck
LGKF – Kefallinia
LGMT – Mitilini
LGTL – Kasteli
TGPZ – Carriacou/Lauristo
TFFR – Pointe-a-Pitre Le Raizet
LHBP – Budapest Ferenc Liszt Intl
BIBA – Bakki
BIGJ – Gjogur
BIID – [X] Ingjaldssandur
BIMK – Mulakot
BIMS – Tungubakkar Mosfellsbae
BIRF – Rif
BIRL – Reykjahlid
BISF – Selfoss
BISS – Sandskeid
BIVM – Vestmannaeyjar
VAJB – Jabalpur Dumna
VAPO – Pune Intl
VEBD – Bagdogra
VEJH – Veer Surendra Sai
VIJP – Jaipur
VILK – Chaudhary Charan Singh Intl
XVI000E – Kurnool
XVI000J – Deoghar
WADE – Letkol Wisnu
WARR – Juanda Intl
WATR – Rote/Lekunik
WIII – Jakarta Soekarno-Hatta Intl
WIMN – Silangit Intl
WT81 – Kuala Kurun
WX43 – Binsari
XWI000P – Bolaang Mongondow
XOI0003 – Maku
EICL – Clonbullogue
EINN – Shannon
XEI000E – Crossmolina
LIEA – Alghero
LILO – Sondrio Caiolo
LIME – Bergamo Orio Al Serio
LIQS – Siena Ampugnano
LIRI – Salerno Pontecagnano
XLI001X – Aviosuperficie Pisticci
MKJP – Norman Manley Intl
RJAA – Narita Intl
RJCK – Kushiro
RJCN – Nakashibetsu
RJFG – New Tanegashima
RJFK – Kagoshima
RJFM – Miyazaki
RJFO – Oita
RJFT – Kumamoto
RJFU – Nagasaki
RJGG – Chubu Centrair Intl
RJSF – Fukushima
HKJK – Nairobi Jomo Kanyatta Intl
HKML – Malindi
XHK0007 – Voi
OKBK – Kuwait Intl
UCFM – Manas Intl
XVL0002 – Nongkhang
EVRA – Riga Intl
FXKA – Katse
FXMN – Mantsonyane
FXSH – Sehonghong
FXSM – Semonkong
LMML – Malta Intl
FIMP – Sir Seewoosagur Ramgoolam Intl
MMAA – Acapulco Intl
MMCZ – Cozumel Intl
MMLM – Aeropuerto INTL de los Mochis
MMMM – General Francisco Mujica INTL
MMTJ – Gral. Abelardo L.Rodriguez
XMM000O – Acocotla
XMM000P – Loma Roja
XMM000Q – Moralar
XMM000R – Santa Ana Maloapan
XMM000S – Felipe Terrones Acosta
XMM000T – Los Tuxtlas
FYZR – Zebra River Lodge
VNRC – Ramechhap
EHAM – Schiphol
EHTX – Texel
NZAR – Ardmore Aerodrome
NZCH – Christchurch Intl
ENBJ – [H] Bjornoya
ENVA – Trondheim Vaernes
MXH – Moro
AMG – Amboin
AYBK – Buka
AYHK – Hoskins
AYKT – Aropa
AYKV – Kavieng
AYNZ – Nadzab
AYTA – Tari
AYTK – Tokua
IIS – Nissan Island
KDP – Kandep
TBE – Timbunke
TCK – Tinboli
TOK – Torokina
UBI – Buin
XAY0008 – Mapoda
XAY000A – Kairik
XAY000O – Ambua
XAY001W – Samberigi
XAY001X – Batri
XAY001Y – Puri
XAY001Z – Lalibu
XAY0020 – Kantobo
XAY0021 – Kafa
XAY0022 – Pimaga
XAY0023 – Kar
XAY0026 – Fogomaiu
XAY0027 – Benaria
XAY002U – Kompiam
XAY002V – Yenkis
XAY002W – Iropena
XAY002X – Maramuni
XAY003P – Erave
XAY004J – Haivaro
XAYGB – Gobe
SGES – Guarani Intl
SPGP – Gueppi
XSP000Q – Teniente Belgerie
RPLB – Subic Bay Intl
RPLL – Ninoy Aquino Intl
RPLT – Itbayat
RPMC – Cotabato
RPMD – Francisco Bangoy Intl
RPMG – Dipolog
RPMN – Sanga Sanga
RPMO – Ozamis
RPMP – Pagadian
RPMR – General Santos City
RPMS – Surigao
RPPN – Rancudo
RPSB – Bantayan
RPUT – Tuguegarao
RPUY – Cauayan
RPVE – Godofredo P. Ramos
RPVK – Kalibo
RPVR – Roxas
RPVZ – Siquijor
XRPENI – El Nido
EPGD – Gdansk Lech Walesa
EPOA – [X] Olesnica
EPWA – Warsaw Chopin
LPPR – Francisco Sa Carneiro
U05 – Riddick Field
XU002W – Anastasievskaya
XU002X – Slavyansk-on-Kuban
XU003C – Kuralovo
XU003D – Belevtsy
XU003E – Novomyshastovskaya
XU003G – Potapov
XU003H – Peshkovo
TVSU – Union Island Intl
OEPJ – Pump Station 10
XGO0003 – Thies
LZSV – Spisska Nova Ves
LZZI – Zilina
FACT – Cape Town Intl
FAGG – George
FAMO – Mosselbay Aerodrome
FAPJ – Port St Johns
FASZ – Skukuza
XFA0018 – Nooitgedacht
GCRR – Lanzarote
LEAB – Albacete
LEIR – Air Marugan
LEJR – Jerez de la Frontera
LEMH – Menorca
LEZL – Sevilla San Pablo
XLE001R – A.R.C Sant Cugat
XLE002F – El Membrillar
ESOW – Vasteras
ESSA – Stockholm Arlanda
ESSL – Linkoping Saab
ESSX – Vasteras Johannisberg
XESVE – Stegeborg
LSZB – Bern-Belp
THA Thailand
VTSY – Yala/Betong Intl
VTZ0 – Betong/Yarom Police Station
UTDD – Dushanbe Intl
XHTML – Mahalae
LTAI – Antalya
UKLL – Lviv Intl
XUK0021 – Vinkivtsi
XUK0023 – Andrushivka
XUK0024 – Korostelivka
XUK0025 – Ruzhyn
EGCC – Manchester Intl
EGHF – Lee on Solent
EGLC – London City
EGMC – Southend
EGSR – Earls Colne
EGTU – Dunkeswell
EGCM – Leeds East
XEG0050 – [H] PSNI Maydown
XEG005E – [H] Carr Gate Police
XEI000R – [H] Maydown
43A – Montgomery County
07W – [X] Brickhouse Field
10N – Kobelt
6J5 – [X] Dabbs
N13 – Bloomsburg Muni
N51 – Solberg/Hunterdon
S27 – Kalispell City
T19 – Duval-Freer
USA United States
23Q – Meadowlark Field
33R – Groveton Trinity Co
37R – Freyer Airfield
46T – K Ranch
50D – Iron County
51R – Madisonville Muni
5J9 – Twin City
61Q – Swansboro Country
9R4 – Tanners
M56 – Christmas
T96 – El Campo Airpark
01NC – Topsail Airpark
03NC – Pilots Ridge
04MS – Nicks Flying Svc
05NC – [H] Brunswick Novant Med Ctr
05NJ – [H] Paulus Hook Pier
0NK0 – Berdick Field
0OR6 – Rome Service
0U7 – Hollow Top
0XS1 – [X] Rodgers Roost
0XS6 – Lakeside Beach
10CL – [H] Centerport
1A6 – Middlesboro/Bell County
1F1 – Lake Murray State Park
1LA3 – Goose Island
1MS8 – Columbus AFB Aux Field
1U0 – Bear Trap
1WI1 – [X] Williams
24NC – Mc Gee Field
25A – Mcminn
2CN4 – Wonderful Pistachios & Almonds
2LA0 – Central Industries
2LL5 – Justus
2WN7 – Planeacres
31VA – Aberdeen Field
35NY – [X] Ciszak
36NY – [X] Dew Airpark
3AK4 – Johnson
3C5 – Wheeler
3NK4 – Laska
3NO – North Omaha
3NY5 – [X] Luke
3TN9 – Holenthawall
48I – Braxton County
4B1 – Duanesburg
4D1 – Three Castles Airpark
4GA6 – Chattahoochee Air Park
4IS6 – Hattan Farms
4NA5 – Berg Strip
4OH3 – Bieber Field
4TA3 – Costello Island Inc
4TN2 – Buck Creek Ranch
55NY – Ridgeview
5D5 – Woolsey Meml
5J5 – Holly Hill
5MS1 – Rollang Fld
5N5 – [X] Kirkwood Airpark
5PA6 – Shield Farm
5TA5 – Creasy
63Y – Tyler Muni
64OR – Plum Valley
65KY – [H] Middlesboro ARH Hospital
65NY – Chautauqua Lake Airpark
67TA – Bishop
69TX – Green Lake Ranch
6LA1 – Cottonwood
6N5 – [H] East 34th St
6PA4 – [X] Morgantown
6XS3 – [X] Mullins Landing
70PN – Sanders Personal Use
72TS – Galaxy Ranch
75NY – Reiss Game Farm
77NC – Winnabow
79MU – Dunham – Private
7KS3 – Youvan
7NC1 – Stag Air Park
88D – Hinde
88GA – Beaver Creek
88NY – Zelazny
89MO – Bishops Landing
89NJ – Strawberry Fields
8G3 – Giermek Executive
8NC7 – [X] Winding Creek
90NY – [X] Twin Ponds
91LA – Koch
92A – Chilhowee
93XS – [X] Joseph Ross Scherdin
95MO – Schlemmer
AZ77 – [X] Sunrise Ranch
D22 – [X] Angola
D59 – Gowanda
D79 – Dart
D85 – [X] Randolph
D88 – Pratts Eastern Divide
D89 – South Dayton
HI09 – [H] Frank Fasi Muni Bldg
ID25 – Olmstead Sky Ranch
K68 – Garnett Muni
KACZ – Wallace-Pender
KAFK – Nebraska City Muni
KAND – Anderson Regl
KAPC – Napa Co
KARW – Beaufort Exec
KASN – Talladega Muni
KAVP – Wilkes-Barre/Scranton Intl
KBBP – Marlboro County/H E Avent
KBGR – Bangor Intl
KBZN – Bozeman Yellowstone Intl
KCAK – Akron Canton Rgnl
KCGZ – Casa Grande Muni
KDKK – Chautauqua County/Dunkirk
KDLC – Dillon County
KDTW – Detroit Metro Wayne Co
KEEN – Dillant Hopkins
KEGE – Eagle County Regl
KETC – Tarboro-Edgecombe
KFIT – Fitchburg Muni
KFLG – Flagstaff Pulliam
KFNL – Northern Colorado Rgnl
KGLS – Scholes Intl at Galveston
KGSP – Greenville Spartanburg Intl
KGWO – Greenwood Leflore
KHBI – Asheboro Regl
KIPT – Williamsport Regl
KJFK – John F Kennedy Intl
KJHW – Chautauqua County/Jamestown
KLXT – Lee’s Summit Muni
KMAO – Marion County
KMDW – Chicago Midway Intl
KMHT – Manchester
KMKS – Berkeley County
KMLB – Orlando Melbourne Intl
KMSY – Armstrong New Orleans Intl
KMYR – Myrtle Beach Intl
KNPA – Pensacola NAS
KOFK – Norfolk Rgnl – Stefan Meml
KOMH – Orange County
KONZ – Grosse Ile Muni
KPHH – Robert F Swinnie
KPMV – Plattsmouth Muni
KPOF – Poplar Bluff Muni
KRCR – Fulton County
KRFD – Chicago Rockford Intl
KRNO – Reno Tahoe Intl
KRRT – Warroad Intl Swede Carlson Fld
KSDA – Shenandoah Muni
KSLC – Salt Lake City Intl
KSNA – Orange County – John Wayne
KSPG – Albert Whitted
KSUT – Cape Fear Regl/Howie Franklin
KTOP – Philip Billard Muni
KUTS – Huntsville Muni
MS10 – [X] Turner Field
MS37 – West Bolivar Flying Service
MS42 – Mississippi Petrified Forest
MS71 – Slobovia Outernational
MT23 – [H] St Patrick Hospital
MT92 – [S] Daves Landing
MU62 – Hilltop
N56 – Great Valley
NC13 – Yorks Field
NC43 – Bear Pen
NC48 – Safe Field
NC65 – Yonder
NC94 – [H] Bladen County Hospital
NC95 – Holly Ridge/Topsail Island
NJ44 – [H] Liberty Hall
NK26 – Coles Landing
NK57 – [H] Ross
NK65 – [H] H & H Aviation Service Inc
NY89 – Goose Creek
NY99 – [H] Lakeview Incarceration Ctr
PA11 – Brokenstraw
PA14 – Scandia Air Park
PA33 – Lars/Private
PA97 – [H] Warren General Hospital
PN23 – [H] UPMC Mercy Hospital
PS18 – Pecora Field
SC17 – Russell
SC20 – Harman
SC35 – Ehrhardt
SC37 – Crosswinds-Wilson Private
SC38 – Pocotaligo
SC48 – Byrd Field
SC55 – Broxton Bridge Plantation
SC59 – [H] Palmetto
SC87 – Avinger Field
SC91 – Bells Branch
SN78 – Albright
TA08 – [X] Flying M
TA30 – Old Forker
TE40 – [X] Caselman Ranch
TS94 – Rancho Buena Vista
TX66 – [X] Rebel Field
U46 – Big Southern Butte
U48 – Coxs Well
U99 – Laidlaw Corrals
UT63 – [X] Tashkent Vostochny
WI67 – Bennett Field
WV47 – [X] Rexroad
XK002W – Freefall Oz
KBOK – Brookings
KJRA – [H] West 30th St
KSCR – Siler City Muni
U42 – South Valley Rgnl
XK009T – [H] USBP Eagle Pass
XK009U – [H] Air Evac EMS 57 Base
XK00C4 – [S] Gunflint Lodge SP Base
XK00CR – [H] Bon Secours St Francis
XK00CS – [H] Bamberg County Mem. Hosp
XK00CT – [H] AnMed Downtown
XK00D1 – [H] Fort Duncan Medical Ctr
XK00D3 – [H] Carrsville VFD
XK00D5 – Evans Airways
XK00D6 – [H] Dixie Regl Med Ctr
XK00D7 – [H] Alstar North
XK00D8 – [H] OCFD Northside Park
XK00D9 – [H] Buffalo General Hospital
XK00DA – [H] Oishei Childrens Hospital
XK00DB – Bb Airpark
XK00DD – Southwest Lubbock
XK00DF – Root Hog
XTJ0005 – [H] CDT Guanica
VVTS – Tan Son Nhat Intl
FVWN – Hwange National Park

Hey everyone. We have a new version of X-Plane2Blender available!

For more information on chocks and changes made in 12.2.0, please see the page below!
https://github.com/X-Plane/XPlane2Blender/releases/tag/v4.4.0-rc-1
(You may need to clean install the plugin to avoid errors during the install. Avoid simply trying to overwrite the previous version!)
One of the most well known errors you will encounter in X-Plane is the infamous device loss error. But it’s also one of the least well understood errors and one of the hardest to debug, so in this blog post I want to talk about what device losses are, what we have done to fix them and what you can do to help us investigate these issues. Let’s actually start with the latter because if there is one takeaway from this blog post for anyone, it’s the following:
If you encounter a reliable device loss error, please run X-Plane with --aftermath in the command line options, or run X-Plane via the X-Plane_aftermath.bat script from the Support folder inside of your root X-Plane folder. This flag currently works with both Nvidia, AMD and Intel hardware, but it will come with a bit of a performance hit. It’s best used in cases where you already know you are going to run into a device loss and want to provide additional diagnostics. I would not recommend just running with this flag, in particular because it does not work around device losses in any way – It just gathers additional data to make device loss debugging easier. When running with Aftermath, next time you encounter a device loss, X-Plane will no longer call it that but instead say “Encountered a GPU crash!”. Please submit those crash reports! If you see this message it means that X-Plane was able to gather diagnostic data that can help identify what happened.
Everyone knows that applications can crash. The human species is incapable of writing bug free code and some of these bugs lead to crashes, while others just result in broken logic ranging from mildly entertaining to downright annoyingly broken. But crashes are definitely the worst kind of bug: If you have invested 7 hours into a flight and then suddenly X-Plane crashes, it’s probably one of the worst experiences in flight simming. I know it has put me off from virtual flying for weeks in the past. Luckily, when applications crash, it’s possible to capture the current state of execution and everything that lead up to it. As programmers, we get to see the callstack which tells us not only in which function we are currently in and where, but also what function has called it and in turn which has called that function and so on. We can also see what thread executed it, what the other threads were up to and even the state of the CPUs internal registers that hold part of the current program state. While this isn’t always enough to create a fix, it points in a very specific direction and lets us investigate the code and, together with the log, piece together what happened. Essentially, when you submit a crash report, you send us the black box of your flight. It contains forensic information that can be analyzed to figure out what happened, but we don’t look as cool as NTSB investigators.
Device losses in reality are just crashes as well, but crashes on the GPU. GPUs these days, and really since a long time, are almost fully programmable and just execute arbitrary code. Programs that execute on a GPU are called shaders, a leftover from the olden days when they could exclusively be used to shade vertices. But these days, shaders are just tiny programs that execute on potentially tens of thousands of GPU cores. Shaders are responsible for basically everything that X-Plane puts up on the screen, from mundane tasks like transforming vertex data into screen space, calculating the colour of every single pixel all the way to culling tens of thousands of trees per frame. X-Plane makes use of a lot of shaders because GPUs are incredibly flexible and a lot of workloads lend themselves really well to their highly parallel nature. Counting shaders is surprisingly hard, X-Plane bundles shaders into what we call “modules” which contain variants of similar shaders. But doing a count of just modules, X-Plane 11 shipped with 29, while X-Plane 12.1.3 had 88 modules and 12.2b4 ships with 91. Each shader module contains between a handful to thousands of distinct shader variants, so the real runtime count of compiled shader programs is much higher, somewhere in the mid to high 5 digit range. Quantity is of course not a measure of quality, but X-Plane 12 as well as any modern game wouldn’t be possible without the ability to flexibly run millions of shader invocations every single frame.
While shaders are no doubt one of the greatest additions to computer graphics, they come at a cost: They are incredibly hard, near impossible, to debug properly. On the CPU side you can attach debuggers to your code and then step through the code as it executes while seeing the result of each operation. On the GPU that is not a possibility, you can’t inspect the state of a running shader, only the results of the execution after the fact. And if nothing shows up on screen, then good luck trying to figure out where your triangles went. And if it crashes, you are even more toast because now you only got broken pieces to look at left. There are tools to make this a bit easier and it definitely isn’t as bad as it used to be, which is a big reason why it’s possible to put a lot of shaders into the field now: The tooling around this is has gotten a lot better. But for crashes, the GPU once again turns into a terrible blackbox.
The first hurdle is that the CPU and GPU run asynchronous from each other. The CPU encodes operations for the GPU into a command buffer that is then submitted to the GPU for execution, so right there you already have a source of latency. In practice, the CPU is usually at least a frame ahead of the GPU in terms of what it is computing. Detecting a crash also involves latency, often the OS/driver has to recover the GPU from its current state and put everything back together. Since the GPU is responsible for getting anything onto the screen, the OS and driver are much more interested in getting you back into a state where you can interact with your computer. But eventually, X-Plane will catch up to the fact that the GPU crashed, because at some point a call into Vulkan will produce the infamous error code VK_ERROR_DEVICE_LOST. This is why it will often feel like your computer is glitching out prior to a device loss, everything stops working for a second, the OS and driver recover the GPU, your windows and displays might flicker around for a second and only then will X-Plane go “yeah by the way, stuffs broken, yo”.
This huge latency between cause and effect is one of the big issues with device loss debugging. By the time the CPU side of X-Plane realizes the GPU is dead, it’s too late to gather data anymore: Something we did god knows how long ago crashed and that’s all the information we have. This is also why the log file tends to just not be very useful for device loss triage. This is especially bad when the device loss is hard to reproduce and happens only once every blue moon. My favourite kind of device loss is the one where you can get X-Plane crash really fast and reliable, in those cases it’s possible to start toggling things on and off and compare what happens to zero in on what is the actual cause. I have spent many a day having X-Plane take down my window manager over and over again.
Over the years we’ve fixed a bunch of device losses. 12.06 was probably the biggest release here, cutting device losses by about 75%. 12.1.0 also reduced device losses by a large fraction by working around a bug in the Nvidia driver. But of course new code gets written and new code can always be buggy. Way back in 11.50 we also added support for Aftermath, which is a library from Nvidia that helps gather crash dump data off of the GPU. In 12.2, I have massively reworked Aftermath support and also added support for AMD GPUs. While AMD does not actually use Nvidia’s Aftermath library, for simplicity sake the same command line option is re-used and my hope is to also add support for this for Intel GPUs in the future Edit: It turns out, Intel supports the AMD extension used for this, so Intel GPUs are supported as well.
With 12.2 and Aftermath enabled, X-Plane now injects per draw/dispatch checkpoints into the command stream. In the event of a device loss, these can then be analyzed to recover the GPUs program state. Because it is very fine grained, this data is incredibly valuable and has actually helped fix two device losses already. The downside is that, because it is so fine grained, it also comes with some overhead. After all for every draw or dispatch command, X-Plane has to stash away some data. But the goal was to keep this as lightweight as possible, the current implementation stores just a couple of bytes of data and defers resolving all of it until after a device loss. Under the hood, this is implemented with Aftermath on Nvidia and with buffer markers on AMD, plus logic inside of X-Plane for the post mortem resolving of data.
And now it’s your turn. Got an annoying device loss? Run with Aftermath, submit your crash reports and hopefully in an update coming to your install soon, that device loss is gone. And maybe by this time next year, I can sip Martinis on a tropical island because my work is finally done.
One thing I want to make clear though, device losses and running out of VRAM are two entirely different issues. There is a persistent rumour that low VRAM can cause device losses, but this is not the case. The other thing I also frequently see is the advice to uninstall scenery or plugins. Scenery and/or plugins don’t get access to X-Plane’s Vulkan command stream so they can only very indirectly cause device losses. For example, it’s possible that art controls modified by plugins can cause device losses by enabling shader paths that are not normally taken and thus aren’t fully tested. But in general, it feels like there are a lot of snake oil fixes out there, so please be wary. Neither the log nor the alert box have enough information to triage a device loss to even remotely claim that X is the cause of it. That being said, it never hurts to do some simple A/B testing with things disabled, although this might just mask the problem instead of actually resolving it. A/B testing is particularly useful in the case of a repeatable device loss because you can get a much stronger signal from that test, so you can pass that information along with your bug report and make reproducing the issue much easier for us. For random device losses however it’s near impossible to get a clear signal from such A/B tests.
The X-Plane 12.2.0 beta is finally here! This update has been a labour of love from the team for many months, and we’re excited to see so many users enjoying the changes. The stars of this show go to Daniel, Daniela and Maya for their meticulous commitment to enhancing the atmospherics of the sim. Alas, this is a developer website. So let’s glance at some of the changes relative to our third parties.
Rolling back the time machine, Ben once discussed plugins using private art controls here and here. And that time has come once again because we have changed ALOT.
*As a Brit, it annoys me deeply having to constantly change “colours” to “colors.” So I hope you all appreciate this noble sacrifice 🤣

^ This is X-Plane’s lighting in 12.1.4. Notice how almost uniform the shading appears!

^ And this is 12.2.0. Not only are the color shades “deeper”, but colors also desaturate under direct illumination (like real life.)
The above will be addressed in 12.2.0
In addition, we are also aware of the following
We’ve radically expanded our brake system, with a plethora of different braking options and behaviours now available. Tom has ensured new documentation is available, which can be found here!
We’ve also introduced a new chocks mechanic, which is part of X-Plane’s ground handling. Only a select few default aircraft currently have this feature which includes:
How do I get chocks onto my aircraft?
We will have a new version of X-Plane2Blender out in the near future, along with documentation (and we will let you know) that allows for chock annotation, similar to particles are referenced. X-Plane provides the model for you, and references the position from the OBJ… not Planemaker.
*On the subject of documentation, Tom has been hard at work re-vamping all of our docs. I think many will be pleased at the changes, which we hope to deploy this year!
We’ve included a new Gateway cut in 12.2.0. Thank you to all our Gateway artists! We’ve left a rough list of changed airports below.
Some of you may also remember a recent request-for-comment/poll for WED assets. We’ll have a lot more to talk about after the conclusion of 12.2.0. But the spoiler here is: we listened!

🇦🇫 Afghanistan
🇦🇱 Albania
🇩🇿 Algeria
🇦🇴 Angola
🇦🇷 Argentina
🇦🇺 Australia
🇦🇹 Austria
🇦🇿 Azerbaijan
🇧🇸 Bahamas
🇧🇾 Belarus
🇧🇷 Brazil
🇧🇬 Bulgaria
🇰🇭 Cambodia
🇨🇲 Cameroon
🇨🇦 Canada
🇰🇾 Cayman Islands
🇨🇳 China
🇨🇴 Colombia
🇨🇬 Congo
🇨🇷 Costa Rica
🇭🇷 Croatia
🇨🇺 Cuba
🇨🇿 Czech Republic
🇪🇬 Egypt
🇫🇴 Faroe Islands
🇫🇮 Finland
🇫🇷 France
🇬🇪 Georgia
🇩🇪 Germany
🇬🇮 Gibraltar
🇬🇷 Greece
🇭🇰 Hong Kong
🇮🇸 Iceland
🇮🇳 India
🇮🇩 Indonesia
🇮🇷 Iran
🇮🇪 Ireland
🇮🇹 Italy
🇯🇵 Japan
🇰🇷 Korea, Republic of
🇰🇬 Kyrgyzstan
🇱🇸 Lesotho
🇱🇾 Libya
🇱🇺 Luxembourg
🇲🇬 Madagascar
🇲🇾 Malaysia
🇲🇭 Marshall Islands
🇲🇶 Martinique
🇲🇽 Mexico
🇲🇦 Morocco
🇲🇲 Myanmar
🇳🇵 Nepal
🇳🇱 Netherlands
🇳🇿 New Zealand
🇳🇬 Nigeria
🇳🇴 Norway
🇵🇰 Pakistan
🇵🇦 Panama
🇵🇬 Papua New Guinea
🇵🇾 Paraguay
🇵🇭 Philippines
🇵🇱 Poland
🇵🇹 Portugal
🇷🇴 Romania
🇲🇫 Saint Martin (French part)
🇸🇲 San Marino
🇸🇦 Saudi Arabia
🇸🇬 Singapore
🇸🇰 Slovakia
🇸🇮 Slovenia
🇸🇧 Solomon Islands
🇿🇦 South Africa
🇪🇸 Spain
🇸🇩 Sudan
🇸🇪 Sweden
🇨🇭 Switzerland
🇹🇼 Taiwan
🇹🇿 Tanzania
🇹🇭 Thailand
🇹🇷 Turkey
🇹🇲 Turkmenistan
🇺🇦 Ukraine
🇬🇧 United Kingdom
🇺🇸 United States
🇻🇪 Venezuela
🇻🇳 Vietnam
🇻🇮 Virgin Islands, U.S.
🇿🇼 Zimbabwe