이미지를 사용하여 메모리 사용량을 능률적으로 개선하기 위해 내 게임과의 인터페이싱을위한 실행 가능하고 합리적인 솔루션을 며칠 동안 수색했습니다. 나는 너무 많은 RAM이 필요하다는 것을 알았을 때 2D Turn-based Strategy를 프로파일 링했다. 내 문제는 단순히 총 36MB의 JAR 크기의 게임 리소스를 600-800MB RAM에서 런타임에 예상되는 50MB로 바꾸는 것입니다. MediaTracker를 제거하면 RAM이 크게 줄어들었고 필요하다는 것을 알았습니다. 이미 저장된 이미지를 사용하기 위해이 정적 클래스를 참조하는 것 이외의 다른 이미지로 뒤죽박죽 된 다른 클래스는 없습니다.이미지 검색 및 저장 결과가 너무 많은 RAM 사용
더 이상 고민하지 않고도 쉽게 읽을 수있는 코드를 제공 할 것입니다.
package editor;
import java.awt.Font;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.imageio.ImageIO;
/**
*
* @author Darryl Thomas Idle
*/
public final class ResourceStash {
public static Map<String, Image[]> CHARMAP;
public static Map<String, Image[]> ITEMMAP;
public static Map<String, Sound> SOUNDS;
public static Map<String, Image[]> TILEMAP;
public static Map<String, Image> UIMAP;
public static Map<String, Image> GLARES;
public Font font;
protected EditorEngine engine;
protected MediaTracker media;
public ResourceStash(EditorEngine engine){
CHARMAP = new HashMap<>();
SOUNDS = new HashMap<>();
TILEMAP = new HashMap<>();
ITEMMAP = new HashMap<>();
UIMAP = new HashMap<>();
GLARES = new HashMap<>();
this.engine = engine;
media = new MediaTracker(engine);
try{
font = Font.createFont(Font.TRUETYPE_FONT, this.getClass().getResourceAsStream("fonts/EngineerHand.ttf"));
addSound(SOUNDS, "button_press.wav");
addSound(SOUNDS, "ambience.mp3");
addSound(SOUNDS, "grass_step.mp3");
addAnimation(CHARMAP, CharacterObject.WALKDL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.WALKUL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.WALKUR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.WALKDR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.JUMDDL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.JUMDUL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.JUMDUR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.JUMDDR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.JUMPDL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.JUMPUL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.JUMPUR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.JUMPDR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A1DL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A1DR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A1UL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A1UR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A2DL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A2DR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A2UL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A2UR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A3DL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A3DR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A3UL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A3UR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A4DL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A4DR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A4UL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A4UR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A5DL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A5DR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A5UL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A5UR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A6DL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A6DR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A6UL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.A6UR, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.DEATHDL, CharacterObject.DUSKWITCH, 10);
addAnimation(CHARMAP, CharacterObject.WALKDL, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.WALKUL, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.WALKUR, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.WALKDR, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.JUMDDL, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.JUMDUL, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.JUMDUR, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.JUMDDR, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.JUMPDL, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.JUMPUL, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.JUMPUR, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.JUMPDR, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.A1DL, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.A1DR, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.A1UL, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.A1UR, CharacterObject.TINKERER, 10);
addAnimation(CHARMAP, CharacterObject.WALKDL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.WALKUL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.WALKUR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.WALKDR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.JUMDDL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.JUMDUL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.JUMDUR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.JUMDDR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.JUMPDL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.JUMPUL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.JUMPUR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.JUMPDR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A1DL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A1DR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A1UL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A1UR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A2DL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A2DR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A2UL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A2UR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A3DL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A3DR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A3UL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A3UR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A4DL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A4DR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A4UL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A4UR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A5DL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A5DR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A5UL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A5UR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A6DL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A6DR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A6UL, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.A6UR, CharacterObject.HOPLITE, 10);
addAnimation(CHARMAP, CharacterObject.WALKDL, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.WALKUL, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.WALKUR, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.WALKDR, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.JUMDDL, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.JUMDUL, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.JUMDUR, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.JUMDDR, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.JUMPDL, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.JUMPUL, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.JUMPUR, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.JUMPDR, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.A1DL, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.A1DR, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.A1UL, CharacterObject.SHADOWYCONTENDER, 10);
addAnimation(CHARMAP, CharacterObject.A1UR, CharacterObject.SHADOWYCONTENDER, 10);
addTileImgs(TILEMAP, "AIR", 1);
addTileImgs(TILEMAP, "DIRT", 1);
addTileImgs(TILEMAP, "DIRT_SEL", 1);
addTileImgs(TILEMAP, "COBBLE", 1);
addTileImgs(TILEMAP, "COBBLE_SEL", 1);
addTileImgs(TILEMAP, "FROST", 1);
addTileImgs(TILEMAP, "FROST_SEL", 1);
addTileImgs(TILEMAP, "GRASS", 1);
addTileImgs(TILEMAP, "GRASS_SEL", 1);
addTileImgs(TILEMAP, "SAND", 1);
addTileImgs(TILEMAP, "SCORCHED", 1);
addTileImgs(TILEMAP, "SCORCHED_SEL", 1);
addTileImgs(TILEMAP, "WATER", 30);
addTileImgs(TILEMAP, "WATER_SEL", 30);
addTileImgs(TILEMAP, "LAVA", 30);
addItemImgs(ITEMMAP, "TREE", 1);
addItemImgs(ITEMMAP, "TREE_SEL", 1);
addItemImgs(ITEMMAP, "SPAWN", 1);
addItemImgs(ITEMMAP, "SPAWN_SEL", 1);
addItemImgs(ITEMMAP, "BUSH", 1);
addItemImgs(ITEMMAP, "BUSH_SEL", 1);
addItemImgs(ITEMMAP, "LIGHT", 1);
addItemImgs(ITEMMAP, "LIGHT_SEL", 1);
addUIImage(UIMAP, "mappreview", "leftbutton");
addUIImage(UIMAP, "mappreview", "rightbutton");
addUIImage(UIMAP, "mappreview", "pane");
addUIImage(UIMAP, "layout", "frameui");
addUIImage(UIMAP, "camera", "00");
addUIImage(UIMAP, "portraits", "DUSKWITCH");
addUIImage(UIMAP, "portraits", "HOPLITE");
addUIImage(UIMAP, "portraits", "TINKERER");
addUIImage(UIMAP, "portraits", "SHADOWYCONTENDER");
addUIImage(UIMAP, "portraits", "UNKNOWN");
addUIImage(GLARES, "glares", "00");
int pos = 0;
for(Entry<String, Image[]> imageEntry: CHARMAP.entrySet()){
int i = 0;
for(; i < imageEntry.getValue().length; i++)
media.addImage(imageEntry.getValue()[i], i+pos);
pos += i;
}
for(Entry<String, Image[]> imageEntry: TILEMAP.entrySet()){
int i = 0;
for(; i < imageEntry.getValue().length; i++)
media.addImage(imageEntry.getValue()[i], i+pos);
pos += i;
}
for(Entry<String, Image[]> imageEntry: ITEMMAP.entrySet()){
int i = 0;
for(; i < imageEntry.getValue().length; i++)
media.addImage(imageEntry.getValue()[i], i+pos);
pos += i;
}
for(Entry<String, Image> imageEntry: UIMAP.entrySet())
media.addImage(imageEntry.getValue(), pos++);
media.waitForAll(2000);
}catch(Exception ex){ex.printStackTrace(System.out);}
}
private void addAnimation(Map<String, Image[]> map, String animation, String characterType, int frameCount){
try{
Toolkit tk = Toolkit.getDefaultToolkit();
Image[] returnImgs = new Image[frameCount];
for(int i = 0; i < frameCount; i++){
Image image = null;
//System.out.println(this.getClass().getResource("images/characters/"+characterType+"/"+animation+"/0"+i+".png").getPath());
if(i < 10) image = tk.getImage(this.getClass().getResource("images/characters/"+characterType+"/"+animation+"/0"+i+".png"));
else image = tk.getImage(this.getClass().getResource("images/characters/"+characterType+"/"+animation+"/"+i+".png"));
returnImgs[i] = image;
}
map.put(characterType+animation, returnImgs);
}catch(Exception ex){ex.printStackTrace(System.out);}
}
private void addItemImgs(Map<String, Image[]> map, String itemType, int frameCount){
try{
Toolkit tk = Toolkit.getDefaultToolkit();
Image[] returnImgs = new Image[frameCount];
for(int i = 0; i < frameCount; i++){
Image image = null;
//System.out.println(this.getClass().getProtectionDomain().getCodeSource().getLocation()+"images/items/"+itemType+"/"+"0"+i);
if(i < 10) image = tk.getImage(this.getClass().getResource("images/items/"+itemType+"/"+"0"+i+".png"));
else image = tk.getImage(this.getClass().getResource("images/items/"+itemType+"/"+i+".png"));
returnImgs[i] = image;
}
map.put(itemType, returnImgs);
}catch(Exception ex){ex.printStackTrace(System.out);}
}
private void addSound(Map<String, Sound> sounds, String soundName){
try{
//System.out.println(this.getClass().getResource("sounds/"+soundName).toURI().toString());
Sound sound = new Sound(this.getClass().getResource("sounds/"+soundName).toURI().toString(), false);
sounds.put(soundName, sound);
}catch(Exception ex){ex.printStackTrace(System.out);}
}
private void addTileImgs(Map<String, Image[]> map, String tileType, int frameCount){
try{
Toolkit tk = Toolkit.getDefaultToolkit();
Image[] returnImgs = new Image[frameCount];
for(int i = 0; i < frameCount; i++){
Image image = null;
//System.out.println(this.getClass().getProtectionDomain().getCodeSource().getLocation()+"images/tiles/"+tileType+"/"+"0"+i);
if(i < 10) image = tk.getImage(this.getClass().getResource("images/tiles/"+tileType+"/"+"0"+i+".png"));
else image = tk.getImage(this.getClass().getResource("images/tiles/"+tileType+"/"+i+".png"));
returnImgs[i] = image;
}
map.put(tileType, returnImgs);
}catch(Exception ex){ex.printStackTrace(System.out);}
}
private void addUIImage(Map<String, Image> map, String uiName, String partOfUI) {
try{
//System.out.println(this.getClass().getResource("images/"+uiName+"/"+partOfUI+".png").getPath());
Image image = ImageIO.read(this.getClass().getResource("images/"+uiName+" /"+partOfUI+".png"));
map.put(uiName+partOfUI, image);
}catch(Exception ex){ex.printStackTrace(System.out);}
}
}
어떤 종류의 프로파일 러를 사용했는지, 힙 덤프 (heap dump)와 같은 것을 사용해 어떤 객체가 메모리를 소비하는지 정확히 판단 했습니까? –
예 Netbean의 고급 프로파일 러를 사용했으며 이미지 저장 공간을 만들 때 DataBufferInt []에서 볼륨이 많이 발생 함을 알려줍니다. 나는 그 부분을 추가하는 것을 잊었다. –
http://i.imgur.com/AIDinKd.png?1은 프로파일 러가 기록한 스택 추적 이미지의 링크입니다. –