2016-10-04 8 views
0

저는 타일 기반의 2D 게임을 Java로 작성하고 있습니다. 캐릭터는 게임 로직에 따라 타일에 배치해야합니다. 각 문자는 java.awt.Graphics2D을 사용하여 화면에 그려지는 그림과 연관됩니다. 그러나지도에 각 문자의 인스턴스가 두 개 이상있을 수 있습니다.클래스로 자바로드 이미지 - 가장 효율적인 방법은 무엇입니까?

문자 이미지를 저장하고 액세스하는 데 권장되는 방법은 무엇입니까? 유형 java.awt.image.BufferedImage의 개인 변수를 할당 된 각 문자를 갖는

  1. :

    는 세 가지 내가 생각할 수있는 구현이 있습니다. 객체를 그릴 때마다 이미지에 게터를 사용하여 액세스합니다. 그러나 이로 인해 개체의 크기가 너무 커질 수 있습니까?

  2. 정적 변수에 모든 이미지를 저장하는 또 다른 유틸리티 클래스가 있어야합니다. 캐릭터를 그릴 필요가있을 때마다 유틸리티 클래스의 정적 getter 메서드에 ID/이름을 전달하여 이미지를 호출 할 수 있습니다. 이것이 더 효율적일까요 아니면 이전 방법보다 느린가?
  3. 문자를 그릴 때마다 그림을로드하기 만하면됩니다. 문자를 그릴 필요가있을 때마다 ImageIO.read(new File(character.getImagePath())이 발생합니다. 이게 가장 빠를 수 있니?
+1

옵션 3을 사용하면 안됩니다. 일반적으로 페인트 방법은 * 초당 여러 번 호출됩니다. * 운영 체제의 캐시가 유효하더라도 게임을 크롤링하는 속도가 느린 경우가 종종 있습니다. – VGR

+1

개별 이미지 대신 스프라이트 시트를 사용하십시오. – eldo

답변

1

나는 게임을 최적화하는 방법에 관한 기사를 읽었으며 필요한 자원을 처음에로드하고 나중에 사용하기 위해 저장하는 것이 매우 중요하다는 것을 알았습니다. 가장 긴 연산 중 일부는 파일 I/O 코드에서 발견됩니다. 예외가 발생할 가능성이 있습니다. 예를 들어, 세 번째 옵션에서 ImageIOIOException을 던집니다. 당신은 이미지가 없기 때문에 다른 것을 렌더링해야합니다. 이미지 읽기가 예상보다 오래 걸리면 사용자의 게임 경험이 똑같이 손상 될 수 있습니다. 당신이 그것에 대해 생각하는 경우 1 차 및 2 차 옵션의

// Imports and other stuff... 

// Parameter flocation: resource location 
private BufferedImage preloadImage(String flocation){ 
    BufferedImage bufimg = null; 
    System.out.println("Attempting to load image: '" + flocation + "'"); 

    try { 
     bufimg = ImageIO.read(this.getClass().getResourceAsStream(flocation)); 
    } catch(IOException e){ 
     System.err.println(
       "An error occurred while attempting to load '" + flocation + "'"); 

     return null; 
    } 

    // Now store this somewhere safe! 
    return bufimg; 
} 

는 정말 큰 차이가없는 :

여기 (당신의 .jar에서) 자원을 사전로드에 대한 예제 코드 조각입니다. 첫 번째 문자는 각 문자에 필드를 추가하는 반면, 다른 문자는 모든 문자 이미지를 관리합니다. 개인적으로는 코드 혼란을 줄이고 가독성을 높이기 때문에 첫 번째 옵션을 선호합니다. 물론 테마에 따라 코드를 그룹화 할 수도 있으므로 두 번째 옵션은 완전히 좋습니다.