2010-03-03 5 views
1

과제의 일부로 "젤다의 전설"을 재현하고 있습니다.Java 최적화 게임 배경 이미지 페인팅

다음과 같은 문제가 있습니다. 게임 세계는 플레이어의 현재 위치에 필요한 부분을 하위 이미지()로 지정하는 BufferedImage입니다. 게임은 작동하지만 CPU의 80/110 %를 사용합니다. 프로필에 따르면 범인은 이미지의 그림입니다.

그래서 플레이어, JPanel 등과 같은 JPanel에 배경을 넣었습니다. 서로 떨어져서 렌더링하고 (JLayeredPane) 배경 패널을 훨씬 덜 자주 다시 칠하십시오.

하지만 어떻게해야합니까? 한 번에 한 번 x 번, 다른 번으로 한 번 그립니다. 최적화 방법이 있다면 알려주세요.

는 여기이 순간에있어 무엇 :

public class Main extends JFrame 
{ 
    private ZeldaGame game = new ZeldaGame(); 
    private View view = new View(game); 
    private BackgroundView bckView = new BackgroundView(game); 
    private Controller ctl = new Controller(game, view, bckView, this); 

    public Main() 
    { 
     setLayout(null); 

     view.setBounds(0, 0, game.getWidth(), game.getHeight()); 
     bckView.setBounds(0, 0, game.getWidth(), game.getHeight()); 

     JLayeredPane pane = new JLayeredPane(); 
     pane.add(bckView, 1); 
     pane.add(view, 0); 

     setLayeredPane(pane); 

     setSize(game.getWidth(), game.getHeight()); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     new Main(); 
    } 
} 

당신을 감사드립니다.

답변

4

프레임 버퍼가 작동하는 방식 때문에 렌더링 시간을 다르게 할 수 없습니다. 결과는 더러울 정도로 깜박입니다. 필요한 것은 JPanelJLayeredPane 대신 캔버스의 메서드를 무시하거나 bi.getGraphics()을 사용하고 올바른 방법으로이 메서드 중 하나를 사용하여 배경 및 문자를 루프에 blit 할 수 있습니다. 내가 최적화의 모든 지저분한 세부 사항에서 추상됩니다 GTGE 같은 얇은 엔진을 사용하여 조언을 줄. 심각하게 사용하는 이러한 고급 구성 요소는 게임용으로 설계되지 않았으므로이 구성 요소를 전혀 사용하지 않아야합니다.

+0

감사합니다. bi.getGraphics에 대한 귀하의 제안 덕분에 기사를 찾았습니다. 제 대답을 참조하십시오. 그리고 GTGE는 훌륭하게 들리지만 저는 경험을 위해 직접하고 있습니다. 어쨌든 그것의 임무. PS JCanvas는 Java의 일부가 아니므로 Canvas 또는 JCanvas 프로젝트를 의미합니까? – MrHus

+0

GTGE는 이제 오픈 소스이며 내부 (http://code.google.com/p/gtge)에서 살펴 보았습니다. Java2D 게임을위한 효율적인 기법을 많이 배웠고 거기에 근접해 있습니다. 어쨌든 처음부터 그것을한다면 어쨌든 할 것입니다. 그리고 미안 해요, 나는 JCanvas (캔)보다는 Canvas를 의미했습니다. –

0

나는 내 방식의 오류를 발견했습니다. active rendering을 사용해야하는 동안 수동 렌더링을 사용하고있었습니다. 액티브 렌더링은 기본적으로 setIgnoreRepaint (true)를 호출하여 자동 다시 칠을 종료합니다. 프레임에 넣고 루프를 직접하십시오.

추가 보너스로 JPanels를 사용할 필요가 없습니다.

+0

수동 렌더링조차 괜찮습니다. 때로는 더 효율적일 수 있습니다. 기본적으로, 수동 렌더링에서는 Canvas의 paint (Graphics g) 메소드를 오버라이드하여 뷰를 업데이트 할 수 있습니다. 그러나 게임 조직, 구조로 인해 뷰 렌더링 코드를 항상 여기에 포함 할 수있는 것은 아닙니다 (아마도 코드 구조 (Model-View-Controller가 아닐 수도 있음)는 각 업데이트가 끝날 때 렌더링을 제한합니다). 하지만 기본적으로 수동 렌더링을 사용하면 캔버스를 무효화 할 수 있으며 다시 칠할 필요가 있음을 알게됩니다. –