传递对象作为参数时,是否使用了更多内存?

时间:2016-11-19 02:40:17

标签: java

举个例子,我将使用libgdx(游戏引擎),但这是一个关于java如何工作的问题,我找不到。

这是soundControler类:

private final Sound s_0 = Gdx.audio.newSound(Gdx.files.internal("a.mp3"));;
private final Sound s_1 = Gdx.audio.newSound(Gdx.files.internal("a.wav"));
//lot of more variables

public void shoot(short sound){
    if(SOUND_ENDABLED) {

        switch (sound) {
            case 0:
                s_0.play();
                break;
            case 1:
                s_1.play();
                break;
        }
    }
}

所以这基本上是一个加载在内存中的声音库,程序将不断使用它。

另一个例子:

假设我们有一个Animator类,它将为游戏中的每个动画提供大量方法。

这是一个好习惯吗?或者,每当我将soundControler作为参数传递时,我是否会在内存中制作所有声音和方法的新副本?

1 个答案:

答案 0 :(得分:1)

当你将声音控制器作为参数"但是当你实例化一个实例时,我不认为问题是"每次实例化实例时,您都会调用这些方法。有必要吗?

如果你将变量设为静态,那么代码只会在实例化类时执行,即一次运行程序(实际上是为该类加载器执行实例化,但对于大多数用途来说,运行一次)该程序)。如果它们在第一次设置后永远不会改变,那么它们可以是静态的,没有不良影响。

你没有问,但我还是会对此发表评论 - 我不明白为什么你(以及其他许多人)使用案例陈述来代替数组。把声音放在一个数组中(或者一个hashmap,如果你实际上没有方便的整数来索引一个数组);然后使用sound变量简单地索引到该数组中,然后就完成了。您的代码更短,更容易理解,并且运行速度至少一样快。

未编译的示例:

private static Sound[] allSounds;
private static String[] allSoundFiles
  = { "a.mp3", "a.wav" /* ... * };

static
{
  allSounds = new Sound[allSoundFiles.length];
  index = 0;
  for (String s:allSoundFiles)
  {
    allSounds[index] = 
      Gdx.audio.newSound(Gdx.files.internal(s);
  }
}

public void shoot(short sound)
{
  if (SOUND_ENABLED) // or ENDABLED if you prefer
  {
    allSounds[sound].play();
  }
}

唯一增加声音的是文件名列表。这假设您加载的所有声音当然都具有play()功能。