巧用 G5g 畅游 Android 流媒体游戏

API
Amazon EC2
游戏
0
0
<!--StartFragment--> ### 概览 [Amazon EC2](https://aws.amazon.com/cn/ec2/?trk=cndc-detail) G5g 实例由 AWS Graviton2 处理器提供支持,并配备 NVIDIA T4G Tensor Core GPU,可为 Android 游戏流媒体等图形工作负载提供 [Amazon EC2](https://aws.amazon.com/cn/ec2/?trk=cndc-detail) 中最佳的性价比。它们是中第一个具有 GPU 加速功能的基于 Arm 的实例。 借助 G5g 实例,游戏流媒体客户可以在基于 Arm 的实例上本地运行 Android 游戏,对渲染的图形进行编码,并通过网络将游戏流式传输到移动设备。 在这篇博客中,我们将在 G5g 实例上通过 Anbox Cloud Appliance 设置 Android 环境,通过 Anbox Cloud API 构建 Android 流媒体游戏应用程序,最后在我们的手机上通过 Firefox 浏览器玩游戏! <!--EndFragment--> <!--StartFragment--> ### 架构解析 ![image.png](https://dev-media.amazoncloud.cn/4313b9d47dc245768e7d49d81fef3a50_image.png "image.png") <!--EndFragment--> <!--StartFragment--> 从上图中,我们可以看到此博客中设置的演示示例架构。该架构可以简单分为两部分,左边是客户端:手机上支持 WebRTC 的任何浏览器,右边是基于 G5g 实例的服务器。让我们在服务器中了解更多细节,我们首先需要在 G5g 实例上通过 Anbox Cloud Appliance 设置 Android 环境,然后我们需要设置一个 Web 服务器处理来自客户端的请求,之后配置 Android 应用程序并通过 Anbox Cloud 启动应用程序接口。当 Web 服务器接受客户端的请求时,它会将请求转发给应用服务器,应用服务器将与 Anbox 流网关和Anbox Cloud API 通信以启动 Android 容器,Android 应用程序将托管在容器中并将游戏流传回给客户。 <!--EndFragment--> <!--StartFragment--> ### 动手实践 #### Step 1 在 G5g 实例上启动 Anbox Cloud Appliance 首先,您需要一个 Ubuntu SSO 帐户。如果您还没有,请在此处[创建](https://login.ubuntu.com/?trk=cndc-detail)。 我们可以通过 AWS Marketplace 安装 Anbox Cloud Appliance。前往 AWS Marketplace 然后购买 Anbox Cloud Appliance 的订阅,因为我们计划将其安装在基于 Graviton 处理器的 G5g 实例上,请前往选择 Arm 变体。 ![image.png](https://dev-media.amazoncloud.cn/353e6e5b8d0c46e0af4c463cfd47d1af_image.png "image.png") <!--EndFragment--> <!--StartFragment--> 在这篇博客中,我们在 Instance type 部分选择 G5g.8xlarge,选择密钥对,将网络设置保留为默认设置,如下添加存储, 1. 至少 50 GB 的根磁盘(必需) 2. 至少100GB的额外EBS卷(强烈推荐) 我们推荐至少 100 GB 的原因是我选择作为博客演示的游戏是 Genshin Impact,它有一个相当大的游戏包,几乎在 50GB 左右。 最后,启动实例并等待它变为运行状态,然后我们可以 SSH 到实例并配置 Android 环境。 <!--EndFragment--> <!--StartFragment--> #### Step 2 在 G5g 上搭建 Android 环境 为了最好地确保我们的 RPM 和 Debian 软件包存储库的安全性和可靠性,我们首先更新了 CUDA Linux GPG 存储库密钥 ``` \$ sudo apt-key del 7fa2af80 \$ wget https\\://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/sbsa/cuda-keyring\\_1.0-1\\_all.deb \$ sudo dpkg -i cuda-keyring\\_1.0-1\\_all.deb ``` <!--EndFragment--> <!--StartFragment--> 由于 Anbox Cloud 中的 Android 环境运行在 LXD 容器环境中,因此在设置 Android 之前,将 LXD 刷新到最新版本。 `\$ sudo snap refresh --channel=5.0/stable lxd` 通过输入以下命令调用 Anbox 云设备的初始化过程: `\$ sudo anbox-cloud-appliance init` <!--StartFragment--> 只需保留几个问题作为默认答案,最后,您可以在 https\://$(ec2\_public_DNS_name?trk=cndc-detail) 查看状态网页以获取进度信息。 ![image.png](https://dev-media.amazoncloud.cn/127a7bfd34314d63895524c7d799c003_image.png "image.png") <!--EndFragment--> <!--EndFragment--> <!--StartFragment--> 等待初始化过程完成,然后注册之前创建的 Ubuntu SSO 帐户,输出将显示 Android 环境仪表板地址。 `\$ anbox-cloud-appliance dashboard register <your Ubuntu SSO email address>` <!--EndFragment--> <!--StartFragment--> #### Step 3 通过 Anbox Cloud API 构建 Android 流媒体游戏应用程序 我们参考 Anbox Cloud 存储库来构建游戏。首先,下载源代码: `\$ git clone https://github.com/anbox-cloud/cloud-gaming-demo.git` 构建游戏门户的 Web UI,Web UI 是用 Flutter 构建的,所以我们需要安装 Flutter 然后部署它。 ``` \$ sudo snap install flutter --classic \$ cd ui && flutter build web \$ mkdir -p backend/service/static \$ cp -av ui/build/web/\\* backend/service/static ``` <!--EndFragment--> <!--StartFragment--> 接下来是构建后端服务,用于服务 Web UI 请求并与 Anbox Stream Gateway 交互以通过 Anbox Cloud API 创建游戏应用程序。从安装依赖项开始: ``` \$ sudo apt-get install python3-pip \$ sudo pip3 install virtualenv \$ cd backend && virtualenv venv ``` <!--EndFragment--> <!--StartFragment--> 然后我们需要准备后端服务访问 Anbox Stream Gateway 的配置文件,配置文件中有两个参数,gateway-URL 和gateway-token。可以从以下命令获取网关令牌: `\$ anbox-cloud-appliance gateway account create <account-name>` 创建一个名为 config.yaml 的文件,其中包含这两个配置项: ``` gateway-url: https\\:// \\<EC2 public DNS name> gateway-token: \\<gateway_token> ``` <!--EndFragment--> <!--StartFragment--> 然后将以下行添加到 backend/venv/bin/ 目录中的 activate hook,以便后端服务可以在其启动时读取 config.yaml: `\$ export CONFIG_PATH=<path_to_config_yaml>` 现在我们可以启动将在 TCP 端口 8002 提供服务的后端服务: `\$ cd backend && ./run.sh` <!--EndFragment--> <!--StartFragment--> 在接下来的步骤中,我们将从互联网上下载一个免费的游戏来演示,并通过 Anbox Cloud API 构建它,我们需要一个可用的 Android APK 和一个配置文件。 在 HOME 目录下创建文件夹,并在文件夹中创建 manifest.yaml 文件。在本博客中,我们选择将以下内容添加到文件中,您可以参考此[链接](https://anbox-cloud.io/docs/ref/application-manifest?trk=cndc-detail)了解更多详细信息. ``` name: genshin instance-type: g10.3 resources: cpus: 10 memory: 25GB disk-size: 50GB gpu-slots: 15 features: \\["enable_virtual_keyboard"] ``` <!--EndFragment--> <!--StartFragment--> 我们还需要准备一个 Android APK,记得选择 Graviton 原生支持的 arm64-v8a 架构的 APK。在这篇博客中,我们从网上下载了一款免费的安卓游戏,名为《原神》,一款由米哈游开发发行的动作角色扮演游戏。将 APK 下载到文件夹中并将其重命名为 app.apk。总体而言,游戏文件夹的最终布局应如下所示: ``` . ├── app.apk └── manifest.yaml ``` <!--EndFragment--> <!--StartFragment--> 从文件夹中运行以下命令以创建应用程序 `\$ amc application create  .` 通过使用以下命令监视应用程序创建的状态,等待应用程序更改为就绪状态: `\$ amc application ls` 然后我们可以继续编辑和重建 web UI 以显示游戏如下: <!--StartFragment--> 1. 更新 ui/lib/homepage.dart 文件中定义的 gameids 变量以包含游戏名称(如清单文件中所声明)。 3. 向 lib/api/application.dart 文件中定义的静态 appNameMap 和 appDesMap 变量插入新的 key/value 对 5. 提供游戏截图(jpeg格式),重命名为 \<game-name>.jpeg,放入 ui/lib/assets 目录。 现在您可以重建网页界面,将 ui/build/web 文件夹中的内容复制到 backend/service/static 目录,然后刷新网页即可获得您的游戏! <!--EndFragment--> <!--EndFragment--> <!--StartFragment--> #### Step 4 启动游戏 拿出你的手机,打开 Firefox 浏览器或任何支持 webRTC 的浏览器,输入 G5g 实例的 8002 端口的公共 DNS 名称,然后你会看到游戏入口是这样的: ![image.png](https://dev-media.amazoncloud.cn/f095563e5acd44239d92d91c2dc922bc_image.png "image.png") <!--EndFragment--> <!--StartFragment--> 点击立即开始游戏按钮,稍等片刻在服务器端进行应用程序设置,然后开始游戏吧! ![image.png](https://dev-media.amazoncloud.cn/42ec2dde6fdf451c8f388811826d247c_image.png "image.png") <!--EndFragment--> <!--StartFragment--> ### 结论 G5g 是首个在大型云端采用 GPU 加速的基于 Arm 的实例,在 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)中为 Android 游戏流式传输提供最佳性价比。利用 G5g 实例,Android 游戏开发人员可以原生运行基于 Arm 的 GPU 实例,编码渲染的图形,通过网络将游戏流式传输到移动设备。这样可以帮助简化开发工作,降低每个流每小时成本高达 30%。在这篇博客中,我们在原生支持 Arm64 架构的 G5g 实例上构建了一个 Android 游戏的演示,借助 GPU 加速功能,我们可以尝试更多需要大规模图形渲染需求的游戏,让 Android 流媒体游戏的普及成为可能。 <!--EndFragment-->
0
目录
关闭