我正在寻找一种在多平台游戏(Android和Windows)中以低开销播放多种快速音效(WAV格式)的方法。
我尝试使用TMediaPlayer组件,但创建多个实例会增加启动和关闭时间的开销。
我研究并发现这个代码提供了一种低开销的方法。可悲的是,代码与Android下的Delphi 10.2(东京)不兼容(windows工作正常)。在Android下,永远不会触发onLoadComplete,导致GLoaded标志保持为false并且应用程序将冻结。 http://www.fmxexpress.com/free-game-audio-manager-wrapper-class-in-delphi-xe6-firemonkey-for-android-ios-windows-and-osx/
有没有人知道替代解决方案或者能够理解为什么GameAudioManager回调函数无法触发?
答案 0 :(得分:0)
编辑:我的初步测试是在柏林完成的,而OP正在使用东京。以下结果适用于柏林。请进一步了解东京。
我很好奇为什么你提供的FMXExpress链接中的代码不起作用,因为我在我的多平台音频类中使用了非常相似的代码。所以我决定下载代码并尝试一下。
演示应用程序查找3个特定文件ding1.wav,ding2.wav和ding3.wav;在Windows上它查找文档文件夹中的文件,在Android上它需要assets \ internal
中的文件对于Windows,我必须将一些音频文件复制到文档文件夹并相应地重命名。你报告的应用程序运行正常。 (Windows 10版本1709)。
对于Android,我首先看一下项目的部署设置。列出了3x音频文件,但本地路径为空。我只是取消选中现有条目并从我的文档文件夹中重新添加它们,并将每个条目的远程路径设置为 assets \ internal 。直接在我连接的设备上编译应用程序,它运行正常。 Android SDK 24.3.3 32位,运行Android 7.0的LG-V522 G-Pad III
编辑 - 东京问题说明:
OP是正确的;使用Tokyo 10.2.3
编译时,链接的示例代码不起作用简单的调试表明永远不会调用回调TOnSpoolLoadCallBack.onLoadComplete
,这是将全局GLoaded
设置为True
所必需的。结果是应用程序在以下代码中无限循环:
<强> TGameAudioManager.AddSound 强>
while not GLoaded do
begin
Sleep(10);
Application.ProcessMessages;
end;
为了使代码工作,(这是一个hack)添加一个限制循环运行时间的计数器。像这样......
procedure TGameAudioManager.AddSound(...)
const
MaxWaitLoop = 10;
var
...
loopCount : integer;
Begin
...
loopCount := 0;
while not GLoaded AND (loopCount < MaxWaitLoop) do
begin
inc(loopCount);
Sleep(10);
Application.ProcessMessages;
end;
...
通过一些防止无限循环的逻辑,应用程序现在可以工作,并且可以在Android设备上听到音频。
备注:强>
Application.ProcessMessages
几乎总是指向坏人
实现。相反,回调应该冒泡到您的主应用程序,例如,您可以启用UI元素答案 1 :(得分:0)
似乎有一个更新版本的'GameAudioManager'单元(现在被称为“AudioManager”)与Delphi Tokyo上的Android兼容。我查看了代码,似乎只是删除了“onload”回调和'loaded'check-loop。
这是更新的代码: https://github.com/Embarcadero/DelphiArcadeGames/blob/master/Full/AlienInvasion/AudioManager.pas