Windows 10 on ARM (WoA) ARM64 Support
Viscosity supports 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 the release of WoA, 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, this was not included in .NET 5's release and was pushed back to .NET 6. 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 6 is released, we will should be able to re-target and release Viscosity with all components ARM64 native without further developmental work.
We are watching Microsoft's early releases for .NET closely and will update this article and Viscosity as we get new information.
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 6 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 6 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 6 is available.
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.