我刚在Play商店发布了我的游戏,我的一些朋友抱怨我在一些棒棒糖设备中加载时间超过 1分钟(超过1000帧)(nexus 4, OS 5.0)。通常,即使是采用单核1.0 GHz处理器的设备,也需要 5-10(大约180帧)秒来加载所有资产。
我正在使用资产管理器类加载所有资产。
问题在于加载Mp3声音文件。大约有52个声音,2个音乐文件。
提前致谢
答案 0 :(得分:1)
我从未亲自使用过AssetsManager,但我可以推荐其他各种技巧来帮助你:
资产存储在Android项目的资产目录中,并在部署应用程序时自动与APK一起打包。没有其他应用程序可以访问这些文件。
文件也可以存储在内部存储中,它们是可读写的。每个已安装的应用程序都有专用的内部存储目该目录只能由该应用程序访问。可以将此存储视为应用程序的私有工作区。
我的正常练习是创建不同的处理程序,例如soundHandler,spriteHandler,animationHandler等。您可以均匀地分离调用并从每个类中加载所需的内容。它可能有助于添加启动画面(如果您还没有),那么在运行时资产加载上加载它会非常有用。这将提供资产快速加载的“错觉”,但屏幕只是分层。
示例:
public void create () {
batcher = new SpriteBatch();
SettingsHandler.load();
AssetsHandler.load();
SoundHandler.load();
setScreen(new MainMenuScreen(this));
}
我还建议使用由Texture Packer GUI创建的纹理地图集。您可以从.txt文件而不是图像文件加载图像。这将为您提供spritesheet上的'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);
我会建议关注LibGdx's Advice.并在从SD或Assets文件夹加载时实时操作文件并相应地分配你的内存使用。那不是你能做的全部。
什么会被推荐? How to decrease loading time of all Assets in libgdx提供了一个很好的答案。创建一个启动画面形式,但是对于您的主GUI,使其看起来像Assets已加载,但您所做的只是在运行时为您的资源加载渲染屏幕。强调上面给出的例子,但是有一个完整的代码示例。
我还建议调查编码原则“DRY”(不要重复自己)。如果您希望对关于对象分类的内容感到满意,这是一个很好的原则。加载时间并不总是与您的资产有关。这是关于你如何处理你的代码。 进一步阅读here,here和here
答案 1 :(得分:0)
我也有同样的问题, 有大约10个图像加载(总共3 mb,加载时间约8秒)。 我只需通过压缩图像将总大小减少到2 mb,并保存3-4秒。 还要确保在完成后处置资产。
试试这个并测试结果。