2016-11-19 35 views
-2

例如,我將使用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

可能相關:[是Java傳遞引用還是傳值](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-值)? – nbrooks

回答

1

我不認爲問題是「當你通過聲音控制器作爲參數」,但是當你實例化一個實例。每當實例被實例化時,你都會調用這些方法。有必要嗎?

如果你讓變量是靜態的,那麼代碼只會在類實例化時執行,也就是說,一次用於程序的運行(實際上是該類加載器的實例化的執行,但對於大多數目的而言,的程序)。如果他們在第一次設置後從不改變,那麼他們可以是靜態的,沒有不良影響。

你沒有問,但我會對此評論 - 我不明白爲什麼你(和許多其他人)使用case語句代替數組。把聲音放在一個數組中(或者一個散列表,如果你實際上沒有方便的整數索引到一個數組中);然後只需使用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()的功能。

+0

將實例化一次,但將其傳遞給許多其他類,所以如果每次都作爲參數傳遞,java會生成一個變量的副本,我將進行僞造 – user5450074

+0

不,初始化變量的代碼僅在實例化時運行;如果你只是實例化一次,那麼代碼只執行一次。如果你想測試一下,你可以調用一個方法,不僅初始化值,而且寫入一些東西給sysout,所以你可以看到只寫了一次。如果你有興趣,一個在程序中只有一個實例的類被稱爲「單例」。 – arcy

相關問題