2012-11-27 14 views
7

Jestem trochę nowy w Javie. Chcę stworzyć grę. Po wielu badań, nie mogę zrozumieć, jak działa bufferstrategy .. Znam podstawy .. to tworzy obraz off-screen, które można później umieścić w oknach Object .. Mam tenZrozumieć BufferStrategy

public class Marco extends JFrame { 
    private static final long serialVersionUID = 1L; 
    BufferStrategy bs; //create an strategy for multi-buffering. 

    public Marco() { 
     basicFunctions(); //just the clasics setSize,setVisible,etc 
     createBufferStrategy(2);//jframe extends windows so i can call this method 
     bs = this.getBufferStrategy();//returns the buffer strategy used by this component 
    } 

    @Override 
    public void paint(Graphics g){ 
     g.drawString("My game",20,40);//some string that I don't know why it does not show 
     //guess is 'couse g2 overwrittes all the frame.. 
     Graphics2D g2=null;//create a child object of Graphics 
     try{ 
     g2 = (Graphics2D) bs.getDrawGraphics();//this new object g2,will get the 
     //buffer of this jframe? 
     drawWhatEver(g2);//whatever I draw in this method will show in jframe, 
     //but why?? 
     }finally{ 
     g2.dispose();//clean memory,but how? it cleans the buffer after 
     //being copied to the jframe?? when did I copy to the jframe?? 
     } 
     bs.show();//I never put anything on bs, so, why do I need to show its content?? 
     //I think it's a reference to g2, but when did I do this reference?? 
    } 

    private void drawWhatEver(Graphics2D g2){ 
     g2.fillRect(20, 50, 20, 20);//now.. this I can show.. 
    } 
    } 

Nie wiem .. Studiowałem to już od dłuższego czasu .. i bez żadnego szczęścia .. Nie wiem .. może to wszystko tam jest, i to jest naprawdę jasne i proste, a ja jestem po prostu zbyt głupi, żeby go zobaczyć ..

Dzięki za wszelką pomoc .. :)

Odpowiedz

18

Oto jak to działa:

  1. Urządzenie JFrame konstruuje BufferStrategy po wywołaniu createBufferStrategy(2);. BufferStrategy wie, że należy do tego konkretnego wystąpienia JFrame. Odzyskujesz go i zapisujesz w polu bs.
  2. Kiedy przychodzi czas na narysowanie twoich rzeczy, pobierasz Graphics2D z bs. Ten obiekt Graphics2D jest powiązany z jednym z wewnętrznych buforów należących do bs. Podczas rysowania wszystko przechodzi do tego bufora.
  3. Gdy w końcu zadzwonisz pod numer bs.show(), bs spowoduje, że bufor, który właśnie narysowałeś, stanie się bieżącym buforem dla JFrame. Wie, jak to zrobić, ponieważ (patrz punkt 1) wie, do czego służy JFrame.

To wszystko, co się dzieje.

W komentarzu do twojego kodu ... powinieneś nieco zmienić swoją procedurę rysowania. Zamiast tego:

try{ 
    g2 = (Graphics2D) bs.getDrawGraphics(); 
    drawWhatEver(g2); 
} finally { 
     g2.dispose(); 
} 
bs.show(); 

trzeba mieć pętlę tak:

do { 
    try{ 
     g2 = (Graphics2D) bs.getDrawGraphics(); 
     drawWhatEver(g2); 
    } finally { 
      g2.dispose(); 
    } 
    bs.show(); 
} while (bs.contentsLost()); 

To będzie chronić przed zgubionych klatek buforowych, które zgodnie z the docs, może zdarzyć się sporadycznie.

+0

Dlaczego musimy pozbyć się() zanim mamy show() bufor? Zakładam, że obiekt graficzny ma tylko funkcje graficzne, ale kiedy nie jest potrzebny, "wypuszczamy narzędzia i zasoby", a następnie pokazujemy nasz buforowany obraz? –

+1

@someFolk - Nie ma _ do zrobienia w tej kolejności; wywołanie 'bs.show()' może zostać przeniesione wewnątrz bloku 'try'. Nie ma jednak żadnego szczególnego powodu, aby to robić i dobrą praktyką jest udostępnianie zasobów systemowych, gdy tylko nie są potrzebne. –