gpt4 book ai didi

android - LibGDX/Android : Playing sound effects makes the game stutter - Sound. play() 在高端设备上需要 4 毫秒

转载 作者:行者123 更新时间:2023-12-04 08:31:49 26 4
gpt4 key购买 nike

每当我在 Android 设备上的 LibGDX 游戏中播放音效时,游戏都会卡顿。我已经在三款三星设备上尝试过这款游戏:

  • 在 Galaxy S7 Edge (2016, Android 8) 和 Galaxy Tab S 10.5 (2014, Android 6.0.1) 上,游戏仍然可以玩,但在播放多个音效时运行不流畅(循环音效不是问题) )。
  • 但是,在 Galaxy S20 Ultra(2020,Android 10)上无法玩游戏:每次调用 Sound.play() 需要 2...4 毫秒并导致“AUDIO_OUTPUT_FLAG_FAST 被服务器拒绝;frameCount 0 -> 54276”错误。 其他设备不会出现此错误,但 Sound.play() 仍然需要 1...2 毫秒,这当然是 16 毫秒帧的相当大一部分。

  • 所以我认为很清楚的是问题出在 Sound.play() 方法中 ,例如并发播放的声音数量(我限制为 8 个,但也尝试了 4 个),或者 Android 设备处理声音的速度太慢(在这种情况下,6 岁的 GT 不应胜过今年的高端S20),或者音效文件太大了(我测试用的本来是3.8kB的WAV)。是的,我正在使用 AssetManager 提前加载声音。
    我现在花了两天时间做研究, 在不同的论坛上找到了大约 15-20 个关于我认为相同或相关问题的主题,并尝试了所有建议的修复,但没有成功:
  • 将音频格式从 WAV 更改为 OGG
  • 不同的采样率:两种格式均为 44.1k、48k、96k(使用 96k,没有卡顿和错误,但也没有声音)
  • 使用上述格式和采样率的所有组合,在声音效果的结尾添加 1 或 2 秒的静音(其本身长度为 41 毫秒)。
  • 有人说在“后台”循环播放无声的声音 fragment 已经解决了问题,但无论如何我还有另一个声音(汽车引擎)在游戏中不断循环,这似乎没有效果。

  • 我也看到建议使用 Music 类而不是 Sound,但它不适合与 Box2D 碰撞音效,因为无法调整音高。
    我发现但尚未尝试的唯一解决方法是在不同的线程上播放声音。我没有尝试过,因为我不熟悉多线程,并且无法找到关于如何(正确)在 LibGDX 中执行此操作的足够全面的指南。我还假设这种方法对于在主线程中的某个 Actor 播放期间可能必须暂停、停止或调整的任何声音都是有问题的。此外,根据 https://github.com/libgdx/libgdx/wiki/Threading , “您永远不应该对与图形或音频相关的任何内容执行多线程操作”。
    因此,在我开始熟悉该主题(多线程)之前,我只想再问一次:真的没有其他解决方案吗?感觉不太对,今年的高端Android设备无法以4毫秒以上的速度开始播放小WAV声音。 Play 商店里有很多声音效果好、游戏流畅的游戏,它们真的都使用多线程吗?

    最佳答案

    我没有完整的答案,但我会在这里分享一些想法。
    我自己的轶事经验是,对于 Android 上的典型渲染线程而言,诸如启动声音播放之类的声音操作往往过于耗时。我尝试了几种不同的方法( AudioTrackSoundPool 等),据我所知,在每种情况下都得到了相似的结果。
    将音频放在不同的线程上似乎是最实用的解决方案。如果您不熟悉多线程,我理解您的犹豫,我认为您保持谨慎是正确的,尤其是在使用第三方库时。然而,对于简单的任务,Android 提供了一些相当简单的工具,比如 HandlerThreadHandler ,这也许可以利用。
    至于 LibGDX 文档说不要对任何音频相关的东西执行多线程操作,我不清楚这是否意味着不要在渲染线程以外的线程上做任何与音频相关的事情,或者它只是意味着保持单个线程上的所有音频,但该线程不必是渲染线程。如果是后者,那么将音频放在单独的线程上可能是一种选择。
    我快速浏览了 LibGDX 源代码。我必须花更多的时间来更好地了解发生了什么,但我看到两者都使用了 AudioTrackSoundPool ,而且我很确定我已经遇到了这两个问题。
    但是,我也看到了一些异步声音功能的迹象。有一些名称中带有“异步”的类使用专用处理程序线程。我不知道此功能是否已记录(我无法立即找到文档)或以其他方式支持,但它似乎确实存在于源代码中。评论说有一些限制,但我并不清楚它们是什么。
    至于渲染线程和音频线程之间的通信,它会增加一些复杂性,但您应该能够使用处理程序或其他类似工具相当简单地完成它。事实上,这就是我查看的 LibGDX 代码所做的 - 它创建了一个 HandlerThread并使用 Handler (自然地)发布到它。这仍然很困难,尤其是在使用第三方库时,您无法控制所有音频操作发生的位置。例如,LibGDX 可能总是在特定线程(例如渲染线程)上设置音频对象,这意味着如果您使用另一个线程,您将在创建它们的线程之外的线程上使用这些对象。我怀疑这会是一个问题,但这取决于技术。 (例如,ExoPlayer 的文档说实例只能从单个线程使用。)
    在我自己的代码中,我自己处理所有音频,因此我可以控制它并且可以将所有内容放在同一线程上。对于 LibGDX,这可能很困难或不可能,但“异步”音频类的存在可能暗示在不同线程上播放音频是安全的。 (也许您可以使用这些类,假设它们是 API 的受支持部分。)

    关于android - LibGDX/Android : Playing sound effects makes the game stutter - Sound. play() 在高端设备上需要 4 毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64987817/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com