[SOLVED] Problem z migotaniem

0

Piszę grę (Lunar lander) i mam problemy z migotaniem. Robię double buffering i jest jeszcze gorzej :/ Teraz, jak zrobić żeby nie było migotania? Kiedy robię to ręcznie to mi się wywala bo przekraczam ilość dostępnej pamięci.
paint w JPanel'u: (bf - BufferStrategy z JFrame'a)

public void paint(Graphics fg) {
    	Graphics g = bf.getDrawGraphics();
        super.paint(g);
        
        RenderingHints rh =
            new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                               RenderingHints.VALUE_ANTIALIAS_ON);

        rh.put(RenderingHints.KEY_RENDERING,
             RenderingHints.VALUE_RENDER_QUALITY);

        ((Graphics2D) g).setRenderingHints(rh);
		
        
        Graphics2D g2d = (Graphics2D)g;

        currentLevel.draw(g2d);

        if (craft.isVisible())
            g2d.drawImage(craft.getImage(), craft.getX(), craft.getY(),
                              this);
        else if (craft.isCrashing())
        	g2d.drawImage(craft.getImage(), craft.getX(), craft.getY(),
                    this);
        
        if (ingame) {
            craft.drawClocks(g2d);
        } else if (timeBuffer < 0){
        	String msg = "Game over";
        	setBackground(Color.BLACK);
            g.setColor(Color.WHITE);
            
            if(craft.isVisible())
            {
            	msg = "Congratulations!";
            	setBackground(Color.WHITE);
                g.setColor(Color.BLACK);
                
            }
        	Font small = new Font("Helvetica", Font.BOLD, 14);
            FontMetrics metr = this.getFontMetrics(small);

            
            g.setFont(small);
            g.drawString(msg, (getWidth() - metr.stringWidth(msg)) / 2,
                         getHeight() / 2);
        }

        g.dispose();
        
        bf.show();
        Toolkit.getDefaultToolkit().sync();
        }
    

pełny kod i binarka na rapidshare:
</url>http://rapidshare.com/files/393975402/landerSrc.zip.html<url>
<url>http://rapidshare.com/files/393975231/lander.zip.html<url></url></url></url>

0

Nie chce mi sie analizowac Twojego kodu, ale ogolnie powinienes to zrobic tak:

  1. Tworzysz w pamieci obiekt Graphics
  2. Rysujesz na nim, co masz narysować
  3. kopiujesz (przerysowujesz) caly ten obiekt na ekran
0

Tyle że kiedy tak robię, to wszystko się chrzani - po prostu odświeżanie jest pogrzane, a migotanie przestaje być białym ekranem na ułamek sekundy, a białym ekranem cały czas z migotliwymi ekranami gry :/ wydaje mi się że z jakiegoś powodu to wszystko wymaga za dużo pamięci...

0

To sprobuj bez antyaliasingu. I zmniejsz czestotliwosc odrysowywania. Poprobuj roznych konfiguracji.

Edit:
Poza tym to powinno byc tak:

  1. zglaszasz oknu, ze powinno sie odswiezyc
  2. wywolywana jest przez okno obsluga malowania (paint)
  3. w tej obsludze odrysowujesz potrzebna czesc okna (byc moze nie musisz odrysowywac calego)
0

Różne konfiguracje niestety nic nie dają. Kiedy robię Image i rysuję na nim, to zaczyna mi brakować pamięci, kiedy robię BufferStrategy to migocze niemożliwie... Czas odświeżania czy aliasing niestety tu nie pomaga :/

[edit]
czy opcja setDoubleBuffered(true) daje mi podwójne buforowanie? włączyłem to, ale wydaje mi się że to jest domyślne...

[EDIT2]
Ok, okazuje się że te wszystkie moje usilne kombinowania tylko pogarszały sprawę - JPanel jest podwójnie buforowany z definicji, więc to ja powodowałem to mruganie. Dzięki wszystkim za pomoc :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.