Windows 10 on ARM (WoA) ARM64 Support
Viscosity 1.8.2 and later support Windows 10 on ARM (WoA) ARM64, offering performance and battery life benefits when compared to x86-only VPN clients running on ARM devices. Most of Viscosity's features, and in particular performance intensive processing, run natively on ARM64.
Why Does Viscosity Appear as x86 on ARM64?
Viscosity itself is a number of components and processes, not a single process, and not all of these will show up as ARM64 when viewed using the Task Manager. Components that utilise Winforms/WPF to render the GUI for example, run in x86 emulated mode, and these include the Viscosity.exe process. This can mistakenly mislead users not familiar with Viscosity's process structure to believe all of Viscosity is running in x86 emulated mode, when this isn't the case.
With version 1.8.2 we restructured much of Viscosity so that important aspects of VPN performance and management all run as native ARM64 code. By necessity, processes that interact with the GUI will still appear as x86 emulated due to a limitation of .NET 4, not a limitation of Viscosity. Because of the way Viscosity has been restructured, these GUI components should not negatively affect VPN performance or even battery life on ARM64 devices.
.NET and Winforms/WPF ARM64 support was originally targeted for late 2019 by Microsoft with .NET 5. Unfortunately, .NET 5 has been delayed, and it is now currently planned for November 2020. We have already optimised much of Viscosity to improve its performance when running on ARM64 devices, even for the components that run x86 emulated. These optimisations mean that when .NET 5 is released, we will should be able to re-target and release Viscosity with all components ARM64 native without further developmental work.
Jan 2021 Update: Unfortunately Microsoft omitted desktop application support for ARM64 from .NET 5.0 just before it's release. Currently we are seeing mixed messages as to whether it will be included in .NET 6.0, or backported to a .NET 5.0 feature update. We are watching this closely and hope to have updates soon.
Viscosity on WoA Going Forward
It is important to us that all components run natively, and so while there are limited further performance gains to be had, we do plan on having the GUI components of Viscosity be ARM64 native as well.
Our current plan is to wait for .NET 5 to enable this, as .NET offers a good compromise between rapid development, system integration, stability and performance, and native compiled languages interoperability. However if .NET 5 looks like it may be delayed further, we will explore the possibility of moving away from .NET for the benefit of ARM64 users. We have already started investigating rewriting Viscosity's GUI natively for ARM64 with a custom build of .NET Core or even low-level Win32. It is important to note this would only be for completeness: there will be no noticeable performance or battery life gains on an ARM64 devices.
We also identified that many of Viscosity’s enterprise users are using libraries (such as PKCS#11 drivers) and tools that do not yet have ARM64 versions. By allowing just the GUI to run as emulated x86, these libraries can continue to be used with Viscosity. We’re hoping most device manufactures offer ARM64 versions of their drivers/tools by the time .NET 5 is available later this year.
Where possible, we will continue to refine Viscosity's ARM64 support going forward. To date we've placed a focus on the performance of the ARM64 components, as well as optimising the emulated x86 GUI processes to have as little impact on the system as possible. We hope to find further performance-gain opportunities as we continue development to keep Viscosity being one of the fastest VPN clients for WoA devices.