【问题标题】:LibGDX: How to optimize asset handling in an Android game?LibGDX:如何优化 Android 游戏中的资产处理?
【发布时间】:2014-01-10 13:01:16
【问题描述】:
Assets{
       static Assets instance;
       AssetGamePlay play;
       class AssetGamePlay{
           AtlasRegion block2;
           -----code-----
       }
}

这是我班级的简化外观。

我通过Assets.instance.play.block2调用变量block2

我在一秒钟内调用了很多这样的变量大约 40-60 次(渲染函数)。

所以我的问题是(Android 游戏):

  1. 这是一种非常昂贵的方法吗?如果是,那我该如何改进?
  2. 我的课程流程实际上是节省了一点 RAM,所以我实现了。

【问题讨论】:

  • 请问您具体遇到什么问题?我无法想象这种对资产的处理可能会导致任何类型的性能瓶颈。您应该根据需要进行编程,然后运行它。当它运行正常时,离开它,当它运行不正常时,您进行分析并仅更改导致问题的部分。您不应该从无论如何都不会注意到的微优化开始。
  • @noone 我知道先生,这是一个微优化。但是为 LDPI 制作游戏我必须考虑到这样的优化。不管怎样,我发现我的方法非常有效。谢谢你们……

标签: java android optimization libgdx assets


【解决方案1】:

您不应该这样做,而是使用AssetManager,它已经以这种方式提供访问权限,而且还提供更多功能。

我通常这样做:

public class YourGame {

    public static AssetManager assets = new AssetManager();

    // load all necessary assets via the manager in advance

    // use the manager like this anywhere in your code:
    YourGame.assets.get("block2", Texture.class);

}

【讨论】:

  • 我正在制作 AssetManager .Sry,我在这里勉强提到了(认为它很明显)。感谢您的帮助...
【解决方案2】:

我看不出在 Assets 中创建内部类的意义。为什么不直接做,所以这样:

Assets.instance.play.block2;

变成这样:

Assets.instance.block2;

如果您将资产按逻辑用途(播放、菜单等)划分,则使用方法加载/卸载它们(使用 Assetmanager,如 noone suggests)。

另外,如果您使用的是单例,您可能希望有一个获取实例的方法,如果它不存在,则创建它。

public static Assets getInstance(){
    if(instance==null) instance = new Assets();
    return instance;
}

所以你可以这样使用它:

Assets.getInstance().block2;

不必担心静态实例因任何原因而丢失。

最后:

这是一种非常昂贵的方法吗?

不,不是。我一直都是这样处理的。

【讨论】:

  • 先生,我创建了 getinstance(),但在这里发布我只是做了最少的行。那是我的错,对不起。
  • 我正在制作内部类以使我的 Assest 类更加隔离 .n m 也在做 DYNAMIC LOADING 。所以会在用户点击播放 btn 时创建 AssetGAMEPLAY 对象,并在用户返回主菜单时释放该对象。
  • 那你很好。不用担心性能,这不会对@Vineet 造成太大影响
  • 即使我为 loadGAMEPLAYASSETS() 和 unloadGAMEPLAYASSETS() 制定了方法。我将能够仅卸载资产而不是用于保存它们的变量。(即在我的示例 AtlasRegion 块 2 中)。这个块 2 将占用我的内存,直到我不破坏这个资产类(如果我在资产类中声明它)。
  • 感谢先生的帮助... :)
【解决方案3】:

如果这是 Java,外部类 (Assets) 将只能访问内部 (AssetGamePlay) 的静态成员。 但是,如果您有一个实例并且该属性在内部是公共的,您可以执行如下 getter 方法:

Assets{
    static Assets instance;
    AssetGamePlay play;
    class AssetGamePlay{
        AtlasRegion block2;
        //-----code-----

    public AtlasRegion getBlock2(){
        return Assets.instance.play.block2;
    }
}

【讨论】:

  • 我不明白这是如何在这里添加任何有用的东西。你基本上只是重复了他在问题中已经说过的话。
  • 我更正了,有一个}。而不是使用Assets.instance.play.block2,他将使用Assests.getBlock2()
  • 他说“这是我班级的简化外观。”。他的问题不是如何访问他的字段,而是关于通过 libgdx 在 android 上处理资产。你的回答对他没有帮助。
  • @lauksas 先生,您和我做的一样,而且您的方式比我的贵。
  • 由于使用率高,我希望 JVM 将此方法编译为本机代码。我猜 Adroid JVM 不像 Oracle 那样工作。没关系...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2017-09-09
  • 1970-01-01
  • 2016-06-11
  • 2015-02-24
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多