Android 高资产加载时间

Android 高资产加载时间,android,libgdx,android-5.0-lollipop,nexus-4,Android,Libgdx,Android 5.0 Lollipop,Nexus 4,我刚刚在play store上发布了我的游戏,我的一些朋友抱怨我在一些棒棒糖设备(nexus 4,OS 5.0)中加载时间超过1分钟(超过1000帧)。通常需要5-10(大约180帧)仅需几秒钟即可加载所有资产,甚至是配备单核1.0 GHz处理器的设备 我正在使用asset manager类加载所有资产 问题在于加载Mp3声音文件。大约有52种声音,2个音乐文件 提前感谢我从未亲自使用过AssetManager,但我可以推荐各种其他技术来帮助您: 资产存储在Android项目的资产目录中,并在部

我刚刚在play store上发布了我的游戏,我的一些朋友抱怨我在一些棒棒糖设备(nexus 4,OS 5.0)中加载时间超过1分钟(超过1000帧)。通常需要5-10(大约180帧)仅需几秒钟即可加载所有资产,甚至是配备单核1.0 GHz处理器的设备

我正在使用asset manager类加载所有资产

问题在于加载Mp3声音文件。大约有52种声音,2个音乐文件


提前感谢

我从未亲自使用过AssetManager,但我可以推荐各种其他技术来帮助您:

资产存储在Android项目的资产目录中,并在部署应用程序时自动与APK打包。没有其他应用程序可以访问这些文件

文件也可以存储在内部存储器上,在那里它们是可读写的。每个已安装的应用程序都有一个专用的内部存储目录。此目录同样只能由该应用程序访问。可以将此存储视为应用程序的专用工作区

对我来说,通常的做法是创建不同的处理程序,例如soundHandler、spriteHandler、animationHandler等。您可以将调用平均分开,并从每个类中加载所需的内容。它可能有助于添加一个启动屏幕(如果您还没有启动屏幕的话),在运行时资产加载上加载它会非常有用。这将提供一种“错觉”,即资产正在快速加载,但屏幕只是分层

例如:

    public void create () {
            batcher = new SpriteBatch();
            SettingsHandler.load();
            AssetsHandler.load();
            SoundHandler.load();
            setScreen(new MainMenuScreen(this));
    }
我还将使用由创建的纹理地图集重新命名。您可以从.txt文件而不是图像文件加载图像。这将为您提供spritesheet上的“atlas”,以字符串形式阅读始终是可取的

atlas文件示例:

gui.png
format: RGBA8888
filter: Nearest, Nearest
repeat: none
drone1
  rotate: false
  xy: 274, 2
  size: 176, 66
  orig: 176, 66
  offset: 0, 0
  index: -1
drone2
  rotate: false
  xy: 2, 91
  size: 150, 66
  orig: 150, 66
  offset: 0, 0
  index: -1
纹理地图集的示例实现:

    int droneIndex = 1;
    TextureRegion[] drones = new TextureRegion[1];
    for (int i = 0; i < drones.length; i++) 
    {
        drones[i] = gui.findRegion(("drone" + droneIndex));
    }
    droneFly = new AnimationHandler(0.2f, drones);
int-index=1;
TextureRegion[]无人机=新的TextureRegion[1];
对于(int i=0;i
当从SD或Assets文件夹加载文件时,我会记录并实时操作这些文件,并相应地分配内存使用。这不是你能做的全部

会推荐什么?提供了一个很好的答案。为主GUI创建一个启动屏幕,使其看起来像是加载了资产,但您所做的只是在运行时加载资产时呈现一个屏幕。强调上面给出的示例,但使用完整的代码示例

我还想回顾一下编码原则“干”(不要重复)。这是一个伟大的原则,如果你想充分了解你写的关于物体分类的内容。加载时间并不总是关于你能用你的资产做什么。这是关于你如何处理你的代码。 进一步阅读,我也有同样的问题, 有大约10个图像要加载(总共3MB,加载时间约8秒)。 我只是通过压缩图像将总大小减少到2MB,最多节省3-4秒。 此外,还应确保在完成后处置资产


试一下这个结果并测试结果。

也许只考虑加载你需要的而不是一切。但我们需要更多关于总资产的细节,以便更好地帮助您。我的所有资产占用的内存不足9mb。因此,我认为最好在开始时加载所有资产,并且只在少数设备中加载。我认为压缩图像会大大降低质量。我应该使用什么压缩方法/技术?问题在于声音文件。有什么建议吗?当应用程序在super classes dispose方法中关闭时,您是否正在处理声音?您是否在内部存储您的声音?因此,您正在使用Gdx.files.internal方法调用它们?我正在使用assets manager加载声音,我正在ApplicationLister类的dispose方法中处理assets manager。有没有任何建议我正在使用texture atlas。我不知道为什么仅在少数设备上出现问题..?您需要设置一些断点并记录数据,以了解问题所在问题是。您可以使用spritebatch derative,方法是确定您进行了多少渲染调用(如果太多),然后将其全部合并。问题是mp3声音文件造成的。加载过程需要很多时间。我正在使用assets manager加载声音,我正在处理assets man。在ApplicationLister类的dispose方法中