不同的硬件厂商为Android用户带来了不同尺寸和体验的设备。 因此,我们一直在努力帮助开发者将他们的游戏展示到尽可能多的Android设备上,让开发过程更加高效和轻松。 本文将向您介绍许多新的Android游戏开发工具以及游戏调试、打包和分发技术。 如果您想通过视频了解本文内容,请点击下方:
△Android游戏开发工具大升级
更高效的游戏开发工具
工欲善其事,必先利其器。 我们对开发工具做了很多优化。 游戏引擎主要用C和C++语言编写,大多数Android API被设计为由像Kotlin这样的托管代码调用。 所以我们在Android Studio中实现了同时调试C/C++代码和托管代码的能力,这样就可以如下图分别在Kotlin和C/C++代码中设置断点,然后使用两种编程环境跟踪执行分别地。 您甚至可以在托管代码和本机代码之间跳转以观察执行情况。
△ 演示通过Android Studio同时调试托管代码和C/C++
另一方面,Android Studio可以通过自动代码补全来加快你的代码编写速度,还支持你快速插入JNI函数原型,以便在两种不同的环境下进行编程。 此外,构建过程使用 Cmake 和 Gradle,这使您可以更好地利用可移植构建。
对于使用 Visual Studio 在 Microsoft Windows 操作系统上编写 C/C++ 跨平台游戏的开发者,我们在 2021 年 7 月推出的 Android 游戏开发工具包(Android Game Development Kit)(AGDE,Android Game Development)中提供了 Android 游戏开发扩展扩大)。 它进一步简化了您的开发过程,并帮助您使用一系列支持 C 和 C++ 的调试器和分析工具直接在 Visual Studio 环境中针对 Android 设备进行构建。 并且AGDE可以轻松地与各种构建系统集成,也可以使用虚幻引擎轻松集成到您的工作流程中。 这样,您就不需要单独为桌面设备、游戏机和Android设备使用它。 工具集和构建系统。
配置AGDE的过程也非常简单。 安装扩展后,切换到 Visual Studio 项目并添加 Android APK 模板。 您可以在工具栏上访问各种常用的Android开发工具,例如SDK和NDK管理器、虚拟设备管理器、设备文件管理器、Logcat和性能分析器,如下图所示:
△Visual Studio中的Android工具栏
在项目中配置Android构建目标后,您只需像开发标准桌面Visual Studio目标时一样进行操作即可。 所有与构建、部署和调试相关的操作都是相同的。 您可以轻松地在调试器中设置断点,切换到反汇编代码以查看寄存器和内存块中的值,并通过并行堆栈查看并发性。
△使用Visual Studio调试Android构建目标
此外,你不仅可以在专用的Logcat面板中搜索日志输出并按类型过滤,还可以通过AGDE快速访问Android Studio中原本提供的独立CPU和内存分析器,如下图右侧所示:
△可搜索的Logcat面板(左);
独立 CPU 和内存分析器(右)
我们为这些工具设计了一个新的界面,增强了多项功能,并支持本机内存采样。 Android Studio 和 Android Game Development Extensions 的结合为您提供了一套丰富的工具来高效地开发游戏。
Android 游戏开发套件
俗话说,好马配好鞍。 仅仅拥有这些现成的工具是不够的。 我们还需要将这些工具集成到Android的托管代码API中。 为此,我们在 Android 游戏开发套件 (AGDK) 中提供了新的 C/C++ 库供您使用。
游戏活动
GameActivity 几乎是一个以本机方式(C/C++)实现的 Android 标准 Activity。 它与 Jetpack 库和各种 Android 界面库配合良好。 这允许您完全用 C/C++ 编写游戏循环,同时利用构建在 Jetpack 之上的各种库。 另外,GameActivity会被渲染成SurfaceView,因此你可以轻松混合Android界面元素,例如WebView、MapView、Advertising SDK等各种服务所需的视图。 这样android游戏开发视频,你只需要在托管代码中使用一个简单加载C/C++游戏模块的类就可以完成游戏循环逻辑的集成。 相关代码如下:
△待展示视图
public class MyGameActivity extends GameActivity {
static {
// 加载您的游戏库
System.loadLibrary("game");
}
}
△最少的托管代码
您需要修改 AndroidManifest.xml 文件中的元数据,以告诉 GameActivity 哪个库需要开始执行游戏循环。
△修改AndroidManifest.xml
GameActivity 为您提供了多种与 Android 生命周期事件匹配的原生回调方法。 这些事件回调可以轻松集成到您的游戏循环中。 您可以查看GameActivityCallbacks的使用参考以获取更多信息:
△Android生命周期对应的回调方法
下面是一个非常简单的代码,我们将向您展示一个基于native_app_glue库的案例。 native_app_glue 库提供了一种不寻常的执行模式。
void android_main(struct android_app *app) {
// 您的游戏引擎
NativeEngine *engine = new NativeEngine(app);
// 您的游戏循环
engine->GameLoop();
delete engine;
}
△基于native_app_glue的示例
这里,android_main()函数将在与主线程不同的新线程中被调用。 您可以从与线程关联的 ALooper 获取 Android 生命周期事件,如下所示:
while(1) {
int events;
struct android_poll_source *source;
// 如果没有动画发生,阻塞进程直到捕获某个事件
while ((ALooper_pollAll(IsAnimating() ? 0: -1, Null, &events, (void **) &source)) >= 0) {
// 处理事件
if (source != NULL) {
source->process(mApp, source);
}
}
}
△使用ALooper获取并处理Android生命周期事件
除了捕获生命周期事件之外,您还可以使用此方法来监听文件描述符。
帧调速 API
帧调速API可以帮助开发者解决游戏帧较短造成的卡顿,避免游戏帧较长造成的卡顿。 如果设备支持刷新率选择功能,可以为玩家提供更加灵活、流畅的显示效果。
实现GameActivity后人物立绘,您可以选择使用OpenGL/ES或Vulkan将内容渲染到表面。 无论您选择哪个 API,Android Frame Pacing 库都将帮助您正确处理渲染过程。 它将游戏的逻辑和渲染循环与Android的显示子系统和底层显示相关硬件同步,以实现更流畅的渲染。 。
双簧管API
△双簧管API
一款制作精良的游戏离不开优秀的音效,这就是Oboe音频库所提供的。 您可以在 Android 4.1 及更高版本的系统上使用其 API。 在API级别27的设备上,Obooe将使用AAudio来尽可能协调设备上的软件和硬件,以实现最低的音频延迟。 对于较低版本的设备,Oboe 将使用 OpenSL ES 来尽可能保证兼容性。
虽然 Oboe 引入了许多新功能,例如重采样、格式转换和高性能通道数转换,但它还针对一些已知的音频问题提供了内置解决方案。
游戏输入
Android游戏开发套件还提供了两个可以与GameActivity互操作的库,分别用于处理游戏中的软键盘和处理输入信号。
游戏文字输入
GameTextInput 在底层做了很多复杂的工作。 它将Android系统的软键盘连接到游戏内的文本编辑器,还包括显示和隐藏软键盘的操作。
△游戏中的文字输入逻辑
如果将这个库与GameActivity结合使用,无论是否使用native_app_glueandroid游戏开发视频,系统都可以自动完成相关配置。 查看下面的代码,GameTextInput 库会将输入状态传递给您的游戏,以便您的文本编辑器正确反映 IME 的状态。
/**
* 获取最后收到的文本输入状态
*/
void GameActivity_getTextInputState(
GameActivity *activity,
GameTextInputGetStateCallback callback,
void* context);
△修改AndroidManifest.xml文件
游戏手柄输入
游戏中另一个常见的输入设备是游戏控制器。 您可以通过使用游戏控制器库来充分利用物理游戏控制器。 当控制器连接到设备或从设备断开连接时,此库会向您的游戏发送通知,并提供有关按钮布局、方向轴和其他关键控制器元数据的信息。
底层还封装了 Game Controller 库,让您可以无缝、轻松地连接各种控制器,无需复杂的实现,甚至可以接受鼠标作为输入设备。
支持大屏游戏
在智能电视上玩游戏
如果您的游戏可以使用方向键控制并在横向模式下正常运行,那么它可以在许多电视设备上运行。
△在智能电视上玩游戏
为了支持在智能电视上运行,需要对AndroidManifest.xml文件进行一些修改:
// 您需要在多个 uses-feature 标签内声明这些权限:
android.hardware.touchscreen
android.hardware.faketouch
android.hardware.telephony
android.hardware.camera
android.hardware.nfc
android.hardware.location.gps
android.hardware.microphone
android.hardware.sensor
// 如果有必要的话,请添加 android.required="false"
△修改AndroidManifest.xml文件
您需要在清单中声明不需要这些权限3D交通工具,即required="false"。 这是因为你在AndroidManifest中提到的很多权限和功能并不是必需的,而这些功能在智能电视上往往不支持,比如触摸屏、摄像头、加速度传感器等。你可以声明你的游戏支持使用远程控制作为控制器,添加以下代码: