游戏开发者教程- Windows on Arm64
1 Arm64 上的 Windows 开发入门
1.1 简介
在过去几年中,Arm 芯片已经实现了从为消费类手机供电到笔记本电脑的飞跃。 Arm 功能强大、重量轻且始终保持连接,为用户可以随身携带的个人计算设备带来了新的未来。市场上有许多来自微软、联想和三星等制造商的 Windows 10 Arm 设备。用户可以在仿真中运行他们喜爱的程序的 32 位 x86 版本,但这需要牺牲性能。 64 位 x86-64 程序根本无法运行。随着安装基础的增长,对可以在该硬件上本机运行并充分利用其提供的所有功能的应用程序和游戏的需求不断增加。开发人员希望软件可供尽可能多的潜在用户使用,并且该软件能够在不受影响的情况下运行。然而,额外的平台通常会带来大量的额外工作。本通用开发指南介绍了 Microsoft 和 Qualcomm® 之间的工作和协作,以尽可能简化将软件移植到 Arm 上的 Windows 10 的过程。以下部分将引导用户在当前的 x86-64 开发环境中轻松完成这些流程和功能:
- Visual Studio 的必要设置
- 将 Arm64 作为构建目标添加到项目中
- 如何在 Arm 设备上启用远程调试以评估 Arm64 上的性能和问题
- Arm64 区别于 x86-64 和 x86 系统的关键平台细节,在开发过程中需要重点考虑
注意:
本指南假定你具备软件开发方面的知识和经验、基本熟悉 Visual Studio 和相关工具,并且了解 x86/x86-64 系统。它还假设开发工作将在 x86-64 Windows 10 设备上执行。截至撰写本文时(2020 年 5 月),Visual Studio 和 Unreal Engine Editor 等开发工具并未在 Arm64 上本机运行,但可以针对 Arm64 目标构建应用程序和游戏。
1.2 Visual Studio 入门
本节提供在 Visual Studio 中启用 Arm64 开发的必要步骤。 Visual Studio 2017 和 Visual Studio 2019 的配置类似。本指南中提供的示例使用 Visual Studio 2017。
1.2.1 前提条件
- 运行 Windows 10 的 64 位主机开发系统。你将在其中进行开发和大量调试。
- 运行 Windows 10 Arm64 的目标系统。这是你最终运行和测试软件的地方。
1.2.2 在开发主机上安装和配置 Visual Studio
1. 运行最新版本的 Visual Studio 安装程序。
2. 安装具有以下工作负载的 Visual Studio:
- 使用 C++ 进行桌面开发
- 通用Windows平台开发
- 使用 C++ 进行游戏开发(仅适用于游戏开发)
- 安装以下各个组件:
- 适用于 Arm 的 Visual C++ 编译器和库
- 适用于 Arm64 的 Visual C++ 编译器和库
- 适用于 UWP 的 Visual C++ 运行时
- 适用于 Arm64 的 C++ 通用 Windows 平台工具
- Windows 10 SDK(v10.0.18362 或更高版本)
1.2.3 安装和配置 Arm64 目标设备
注意:
在配置 Arm64 目标设备之前,请确保安装最新的 Windows 更新。
-
从以下位置下载 Windows 10 SDK(v10.0.18362 或更高版本):https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk/
-
在安装过程中,选择Windows 调试工具。
-
将 Arm64 平台添加到 Visual Studio 项目中:
a. 在 Visual Studio 中,单击生成>打开配置管理器。
b. 在活动解决方案平台列表中,选择<新建…>。
c. 在新建解决方案平台对话框中,选择以下值:- 键入或选择新平台列表:Arm64 – 从列表复制设置:x64
d. 点击OK。
- 键入或选择新平台列表:Arm64 – 从列表复制设置:x64
-
通过在“解决方案资源管理器”窗口中右键单击项目或从“视图”菜单中打开项目的属性页。
-
将 Windows SDK 版本更新到 10.0.18362.0 或更高版本。
1.3 调试
设备上调试和远程调试都是调试应用程序的有效选项。本指南重点介绍远程调试,以便用户可以继续在舒适的开发环境中工作。
有关 Windows 10 Arm64 上设备上调试的更多信息,请参阅:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-arm64
如果您想尝试设备上调试,Microsoft 编写了一份在 Windows 10 Arm 64 上进行调试的通用入门指南。
1.3.1 使用 Visual Studio 进行远程调试
远程调试允许用户直接从开发主机上的 Visual Studio 调试应用程序。这使得用户即使没有本机 Arm64 等效工具也可以轻松访问自己喜欢的工具。
前提条件
确保开发主机和 Arm64 目标设备位于同一网络(域、专用或公共)。
安装
-
下载并安装 Arm64 或 x64 版本的远程工具:
-
打开远程调试器。如果您没有目标设备的管理员权限,请右键单击远程调试器并选择以管理员身份运行。
a. 首次运行时,在远程调试配置对话框中执行以下操作:- 选择至少一种与远程工具一起使用的网络类型
- 安装 Windows Web 服务 API(如果尚未安装)
-
单击配置远程调试以设置适当的防火墙规则并启动远程调试器。
当远程调试器窗口出现时,配置完成。目标设备将准备好并侦听连接。
注意:
从开发计算机上的 Visual Studio 连接需要服务器名称和端口号 (MJO-DL:4022)。
1.3.2 从 Visual Studio 连接到远程调试器
一旦远程调试器在 Arm64 设备上运行,用户就可以直接从 x86-64 开发计算机上的 Visual Studio 连接到它。 】
- 启动 Visual Studio 项目。
- 单击调试并选择 < 项目名称> 属性。
a. 从配置属性列表中,选择调试。
b. 在要启动的调试器列表中,选择远程 Windows 调试器。
c. 在远程服务器名称字段中,输入 Arm64 设备上远程调试器的服务器名称。
d. 点击OK。 - 通过更改 Visual Studio 窗口顶部的目标,将调试中的应用程序直接启动到远程设备。
1.3.3 分发应用程序
Visual Studio 编译的应用程序依赖于 Visual Studio 运行时的库。安装 Windows 10 SDK 和远程调试工具时,这些库已安装在 Arm64 开发目标上。
分发应用程序时,用户必须确保安装程序或所使用的分发平台正在安装 Visual Studio 可再发行组件。
安装程序可从 Microsoft 下载:https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
1.3.4 不可再分发的调试运行时
要运行或远程调试在调试配置中编译的 Arm64 可执行文件,必须在 Arm64 系统上安装调试版本的运行时库。这些库不是由 Visual Studio 运行时可再发行组件提供的(请参阅分发应用程序)。
这些库位于 Visual Studio 安装 (Program Files (x86)Microsoft Visual Studio) 的 Debug_NonRedist 文件夹中。
此过程还需要 Windows SDK 中的通用 C 运行时的调试版本 ucrtbased.dll (C:Program Files (x86)Windows Kits10binarm64ucrt)。
下图显示了在调试配置中为 Arm64 构建的 DirectX12 示例及其依赖的调试库。
1.3.5 Visual Studio 性能分析器
要在 Arm64 目标机上使用连接到远程进程的 Visual Studio 性能分析器:
- 单击调试 > 性能分析器。
- 单击 CPU 使用情况选项卡并选择记录 CPU 配置文件。
3. 在当前视图列表中,选择带有计时数据的调用者/被调用者或调用树。
1.3.6 使用 PIX 进行 CPU 和 GPU 分析
CPU/GPU 分析器对于特定的开发至关重要,因为它有助于识别游戏在系统上可能遇到的任何潜在瓶颈。
PIX 是 Microsoft 的 CPU 和 GPU 调试器/分析器,适用于 Windows 上的 DirectX 12 游戏,最近进行了更新,支持在 Arm64 设备上进行远程分析。
有关高级 PIX 使用的教程和文章,请参阅 Microsoft 的 Windows 上的 PIX。
1.3.7 DirectX 12
Arm64 硬件平台和驱动程序针对 DirectX 12 进行了优化。为了确保游戏中的最佳性能和可靠性,请尽可能使用 DirectX 12 渲染路径而不是 DirectX 11。
1.3.8 在开发机器上设置
安装最新版本的 PIX (https://devblogs.microsoft.com/pix/download/)。
1.3.9 Arm64 目标设备上的设置
-
在设备上启用开发者模式:
a. 打开开始菜单。搜索并选择开发者设置。
b. 在使用开发人员功能组下,单击开发人员模式。当出现“开发者模式包已安装”时,安装完成。
-
将最新安装的 PIX 版本的全部内容从开发计算机(即 C:Program FilesMicrosoft PIX)复制到 Arm64 目标设备。
a. 右键单击 WinPixRemoteMonitorUI.exe 并选择以管理员身份运行。
b. [如果您未仅连接到域] 从连接列表中,选择不安全。
3. 查找 Arm64 目标设备的 IP 地址。
- 打开命令提示符。
- 输入“ipconfig”并按 Enter 键。
- 找到当前活动网络连接(有线或无线)的条目并记下 IPv4 地址。
1.3.10 连接到远程 PIX 调试器
两台机器上的设置完成后:
- 连接到远程 PIX 调试器
- 单击主页选项卡,然后单击连接>计算机>添加。
a. 在主机名或 IP 地址字段中输入在 Arm64 设备上设置 PIX 时记录的 IP 地址(请参阅在 Arm64 目标设备上设置部分的步骤 3c)。
b. 在别名字段中输入连接的名称。
c. 单击连接。
从开发计算机上的 PIX,用户可以直接在 Arm64 目标设备上启动可执行文件,或附加到当前正在运行的应用程序以开始分析和调试游戏。
常见的路径是启动游戏以从 Visual Studio 到 Arm64 目标设备进行远程调试。然后,PIX 连接到游戏并选择调试游戏当前正在运行的进程。
有关PIX的更多信息,请参考微软的工具文档:https://devblogs.microsoft.com/pix/documentation/
1.4 示例
1.4.1 在 Arm64 目标上启动 GPU 捕获
GPU 捕获(适用于 Arm64 的虚幻引擎 4.25)
在此示例中,引擎在 WinPixEventRuntime 库的帮助下将 PIX 事件插入 GPU 命令流中。这有助于跟踪帧渲染操作。
1.4.2 启动 CPU 捕获
CPU捕获
此示例显示了 UE4 4.25 的单个渲染帧的 CPU 捕获。报告 CPU 和 GPU 捕获的 PIX 事件。核心利用率 4 到 7 是更快的黄金核心。
1.4.3 PIX 故障排除
- 如果计算机不在域中,WinPixRemoteMonitorUI.exe 在启动期间会发出警告,指出它无法在安全连接上运行。要继续,请在 UI 中将连接模式切换为不安全。
- 如果 GPU 分析不起作用,请确保您以管理员身份运行 WinPixRemoteMonitorUI.exe。
1.5 平台详情
1.5.1 Snapdragon 8cx
Snapdragon 8cx SoC 具有以下组件:
- 四个Silver Kryo 495 Cortex-A76 Armv8.2-A 内核 (1.80 GHz)
- 四个 Gold Kryo 495 Cortex-A76 Armv8.2-A 内核 (2.84 GHz)
- Adreno 680 GPU (1842.5 GFLOPs)
- 8 通道低功耗 DDR SDRAM,频率为 2133 MHz (68.26 GB/s)
Gold核心提供更高的性能,而银核心则具有更好的热和功率特性。这些内核之间的性能差异是由于频率和架构差异造成的。
将高性能应用程序移植到 8cx 时,必须在 Gold 和 Silver 核心之间配置线程亲和性以平衡性能和功耗。
有关此异构处理架构的更多详细信息,请参阅 Arm big.LITTLE。
1.5.2 内存模型
Armv8 架构采用弱有序内存模型。为了优化性能,对中央存储器的读取和写入可能以与程序指令规定的顺序不同的顺序发生。
其他架构(例如 amd64)也使用弱序内存。如果您使用高级线程 API,这些问题都会为您解决。但是,移植自己的低级多线程代码实现的用户必须使用适当的内存屏障和硬件平台的其他配置。
有关详细信息,请参阅《Armv8-A 程序员指南》的“内存排序”一章。
1.5.3 Neon SIMD
如果您的软件使用 SIMD 进行并行数据处理,则必须将 SSE 代码移植到 Neon 指令集。有关更多信息,请参阅 Armv8-A 的 Neon 程序员指南。
Visual Studio 支持 Neon 内在函数。新的 Neon 代码可以与现有的 SSE 代码并行编写,并在编译时启用以进行移植。还值得注意的是,Arm 计算库可用,并提供常用算法的 Neon 优化实现。
Visual Studio 还支持源代码的自动矢量化。这是由 /arch 选项控制的。
1.5.4 Adreno 和桌面 GPU 之间的主要区别
Qualcomm® Snapdragon™ 8cx 计算平台中的 Adreno 680 是一款基于区块的 GPU,经过优化,可提供高性能和低功耗。
基于分块的渲染是一种渲染管道架构,它将屏幕分割成多个图块并连续渲染每个图块。与较旧的桌面GPU技术所青睐的直接渲染模型相比,这大大减少了内存带宽,从而降低了功耗并提高了性能。
虽然这项技术是在移动设备上首创的,但主要供应商的现代和独立桌面 GPU 也都使用平铺渲染。
如果您从较旧的渲染架构移植,请确保渲染管道针对平铺渲染器进行了优化。从立即模式 GPU 迁移到平铺 GPU 时,使用延迟渲染器并减少着色器数量将带来最佳的性能改进。
Adreno 680 还受益于 Snapdragon 8cx SoC 的统一内存架构。与独立桌面 GPU 相比,操作系统内存和 GPU 内存之间没有区别,因此可以实现以下功能: - 根据 CPU 或 GPU 密集型任务更好地利用资源 - 中央内存和 GPU 内存之间无需传输 - 总体功耗更低
有关更多详细信息,请参阅开发人员指南的各个部分。
1.5.5 参考
高通技术公司
骁龙开发者工具 https://developer.qualcomm.com/solutions/snapdragon-developer-tools
Windows
Arm 上的 Windows 10 文档 https://docs.microsoft.com/en-us/windows/arm/
平台详情
Armv8-A 程序员指南 https://developer.arm.com/docs/den0024/a
- 内存排序 https://developer.arm.com/docs/den0024/a/memory-ordering
- Neon SIMD https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/neon-programmers-guide-for-armv8-a/introducing-neon-for-armv8-a
- Windows on Arm – 汇编语言入门 https://www.codemachine.com/article_armasm.html
2 适用于 Arm64 上 Windows 的虚幻引擎
2.1 开始之前
注意:
所有开发工作和虚幻编辑器中的工作都必须在 Windows x64 系统上进行。
以下说明可帮助用户生成可在 Windows 10 Arm 设备上运行的项目构建: 1. 按照 Epic Games 提供的步骤访问 GitHub 上的虚幻引擎源代码。 2. 按照 Unreal Engine 4.25 拉取请求中的说明创建引擎的自定义构建,以添加 Arm 对 Windows 10 的支持。 https://github.com/EpicGames/UnrealEngine/pull/6975 一旦拉取请求被 Epic 接受到主引擎项目中,这些指令将变得基本上没有必要。
2.2 技术前提
2.2.1 开发机器
- Git
- Visual Studio 2019
- 工作任务
- 使用 C++ 进行桌面开发
- 通用 Windows 平台开发工作负载
- 单独的组件
- .NET框架4.6.x
- 适用于 Arm 和 Arm64 的 Visual C++ 编译器和库
- 适用于 UWP 的 Visual C++ 运行时
- Windows 10 SDK 10.0.18362.0
- 工作任务
2.2.2 目标 Arm64 Windows 10 机器
适用于 Arm64 的 Visual Studio 可再发行版
2.3 从源代码构建 Unreal Engine 以启用 Windows Arm 交叉编译
要在 EngineBinariesWin64 中生成 UE4Editor-Debug.exe 以便为项目运行:
-
从 4.25 分支克隆最新版本的虚幻引擎 4.25 源代码。
https://github.com/EpicGames/UnrealEngine/tree/4.25 -
合并来自 Arm Support Pull 请求的更改。
https://github.com/EpicGames/UnrealEngine/pull/6975a. 运行Setup.bat。
b. 运行GenerateProjectFiles.bat。 -
在 Visual Studio 2019 中打开 UE4.sln。
a. 在解决方案资源管理器中,右键单击 UE4 并选择Set as Startup Project。
b. 右键点击UE4 > Properties。
c. 从Configuration列表中,选择Active (Development)。
d. 在“配置属性”下,单击 NMake 并将“-Architecture=arm64”附加到以下条目:- 构建命令行
- 重建所有命令行
- 清除命令行
e. 点击 Apply。
- 在解决方案资源管理器中右键单击 UE4,然后选择Build。
2.4 生成构建
- 在上一节中构建的编辑器中打开 UE4 游戏项目。
如果项目是在不同的编辑器版本中创建的,建议打开项目的副本。 - 要创建打包版本,请转到File>Package Project>Windows (Snapdragon)
2.5 补充说明
2.5.1 远程调试
可以使用 Visual Studio 进行远程调试,如 Microsoft 远程调试中所述。工程样例上必须安装并启动Visual Studio 2019和Arm64平台的远程调试工具。
远程调试配置示例可以在 https://gyazo.com/a1218849ba30d13a839a90a42703d11b 中找到。
2.5.2 构建优化
此版本针对 Microsoft SQ1 Arm 处理器进行了优化,特别适用于 Surface Pro X 平板电脑。线程关联设置针对 SQ1 上的 DX12 RHI 进行了优化,并利用了更快的“大核心”。有关更多详细信息,请查看 Engine/Source/Runtime/Core/Public/Windows/WindowsPlatformAffinity.h 的添加内容。
2.5.3 第三方库
已针对 Windows 10 Arm64 重新编译了多个第三方库以支持这项工作。这通常是在虚幻引擎 4 源代码树之外使用每个库的构建系统完成的。请参阅 README-arm64.txt 文件,了解有关如何配置和编译库的说明以及有关所使用的源版本的详细信息:
- Engine/Source/ThirdParty/PhysX3/README-arm64.txt
- Engine/Source/ThirdParty/Vorbis/README-arm64.txt
2.6 参考
- 虚幻引擎源代码 https://www.unrealengine.com/en-US/ue4-on-github?sessionInvalidated=true
- 适用于 Arm64 的 Visual Studio Redistributable https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
- 微软远程调试 https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging?view=vs-2019