BufferStrategy

Billie

Erfahrenes Mitglied
Hallo!

So, in den letzten Tagen hab ich statt Tutorials durchpauken mal ein eigenes Programm geschrieben, eigentlich auch nur um das gelernte mal anzuwenden.

Ich habe eben viel über DoubleBuffer und PageFlipping gelesen und verstehe es vom Prinzip her auch. Was ich nicht weiß, wie man PageFlipping anwendet. Bei Beispielen mit DoubleBuffer ist es leicht ersichtlich, dort wurde dann immer ein Bild definiert, gezeichnet und ausgegeben. Aber bei PageFlipping... da kam dann immer die mysteriöse Klasse BufferStrategy 8)

Wenn man also im Programm eine BufferStrategy definiert, wird dann automatisch je nach Grafikkarte PageFlipping od. DoubleBuffer angewand?

Naja, wie dem auch sei hab ich folgendes Programm geschrieben und möchte wissen ob das so korrekt ist? Also, ob das jetzt ein Beispiel für PageFlipping ist? Und ich habe mal testweise propiert die Frames pro Sekunde anzuzeigen, klappt eigentlich auch... aber stimmt der Wert überhaupt od. wird der anders berechnet?

Für weitere Kommentare und nützliche Tip's bin ich übrigens auch immer aufgeschlossen :)

PHP:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

class Canvas {

 int cnt, fps, fcnt, screenWidth, screenHeight;
 long time;
 boolean active = true;
 Frame frame;
 BufferStrategy bs;
 Color color;

    public static void main(String args[]) {
     Canvas canvas = new Canvas();
     System.exit(0);
    }

    Canvas() {

     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
     GraphicsDevice gd = ge.getDefaultScreenDevice();
     GraphicsConfiguration gc = gd.getDefaultConfiguration();

     BufferCapabilities bc = gc.getBufferCapabilities();

     DisplayMode dm = gd.getDisplayMode();
     screenWidth = dm.getWidth();
     screenHeight = dm.getHeight();

     frame = new Frame("Canvas 1.0", gc);
	 frame.setBackground(Color.white);
	 frame.setResizable(false);
     frame.setLayout(null);
     frame.setIgnoreRepaint(true);
     frame.setUndecorated(true);

     frame.addWindowListener(
         new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
              System.exit(0);
             }
         }
     );

        if(gd.isFullScreenSupported()) {
         gd.setFullScreenWindow(frame);
        } else {
         frame.setSize(screenWidth,screenHeight);
         frame.show();
        }

     frame.createBufferStrategy(2);
     bs = frame.getBufferStrategy();

     color = Color.red;

        while(active) {
         rendering();
        }
    }

    public void rendering() {
        if(!bs.contentsLost()) {
         Graphics g = bs.getDrawGraphics();

         g.setColor(color);
         g.fillRect(0, 0, screenWidth, screenHeight);
         g.setColor(Color.black);
         g.drawString("FPS: " + Integer.toString(fps), 512, 384);
         g.setColor(color);

            if(g.getColor() == Color.red) {
             color = Color.blue;
            } else {
             color = Color.red;
            }

            if(time <= 0) {
             time = System.currentTimeMillis();
            } else {
                if(System.currentTimeMillis() >= (time + 1000)) {
                 time = System.currentTimeMillis();
                 fps = fcnt;
                 fcnt = 0;
                }
            }

         bs.show();
         g.dispose();
         cnt++;
         fcnt++;

            if(cnt >= 400) active = false;
        }
    }
}

hab euch alle lieb, Andy
 

Neue Beiträge

Zurück