two offscreen buffers~
以前dx的时候也都是用2个的~多了也浪费.

解决方案 »

  1.   

    package Render;import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;public class JScreen extends Frame
    {
    // the DisplayMode that the user wanna to use
    final int BufferNumber = 2;

    final static int supportedModes[][] = {
    {640, 480, 32},
    {640, 480, 16},
    {640, 480, 8},
    };

    private boolean isFullScreen = false;   private GraphicsEnvironment ge;
       
    private final GraphicsDevice gd;

    private DisplayMode oldDispMode; 
    private DisplayMode curDispMode;

    public boolean isActive()
    {
    return isFullScreen;
    }

    public boolean isSupportedMode(DisplayMode dm)
    {
    for(int i = 0; i < supportedModes.length; i++)
    {
    if(supportedModes[i][0] == dm.getWidth()
    && supportedModes[i][1] == dm.getHeight()
    && supportedModes[i][2] == dm.getBitDepth() )
    return true;
    }
    return false;
    }

    public GraphicsDevice getScreenGraphicsDevice()
    {
    return gd;
    }

    public void quit()
    {
    setVisible(false);
    isFullScreen = false;
    }

    public void start()
    {
    gd.setFullScreenWindow(this); DisplayMode[] modes = gd.getDisplayModes();

    for(int i = 0; i < modes.length; i++)
    {
    if(isSupportedMode(modes[i])) 
    {
    gd.setDisplayMode(modes[i]);
    curDispMode = modes[i];
    }
    } setVisible(true);
    isFullScreen = true;
    }

    public boolean setDisplayMode(DisplayMode m)
    {
    if( !isSupportedMode(m) ) return false;
     
    DisplayMode[] modes = gd.getDisplayModes();
    for(int i = 0; i < modes.length; i++)
    {
    if(m.equals(modes[i]))
    {
    gd.setDisplayMode(m);
    curDispMode = m;
    return true;
    }
    }
    return false;
    }
    public void printCap()
    {
    BufferCapabilities bc = 
      gd.getDefaultConfiguration().getBufferCapabilities();

    if(!gd.isFullScreenSupported()) 
    System.out.println("FullScreen NOT Supported!");
    else System.out.println("FullScreen Supported!");

    if(bc.isPageFlipping()) 
    System.out.println("PageFlipping Supported!");
    else System.out.println("PageFlipping NOT Supported!"); if(bc.isMultiBufferAvailable()) 
    System.out.println("MultiBuffer Supported!");
    else System.out.println("MultiBuffer NOT Supported!");

    if(bc.isFullScreenRequired()) 
    System.out.println("FullScreen Required for PageFlipping!");
    else System.out.println("FullScreen NOT Required for PageFlipping!");

    BufferCapabilities.FlipContents bcf = bc.getFlipContents();

    if(bcf.equals(bcf.COPIED)) 
    System.out.println("Flipping Type: COPIED");

    if(bcf.equals(bcf.BACKGROUND)) 
    System.out.println("Flipping Type: BACKGROUND");

    if(bcf.equals(bcf.PRIOR)) 
    System.out.println("Flipping Type: PRIOR");

    if(bcf.equals(bcf.UNDEFINED)) 
    System.out.println("Flipping Type: UNDEFINED");
    }

    public JScreen(String name)
    {
    super(name);

    ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    gd = ge.getDefaultScreenDevice();
    oldDispMode = gd.getDisplayMode();

    printCap();

    setBackground(Color.BLACK);
    setUndecorated(true);
    setResizable(false);
    setIgnoreRepaint(true); addKeyListener(new KeyAdapter()
    {
      public void keyReleased(KeyEvent e)  
    {
    if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
    {
    gd.setFullScreenWindow(null);
    System.exit(0);
    }
    if(e.getKeyCode() == KeyEvent.VK_SPACE)
    {
      quit();
    }
    }
    }
    );
    }


    public static void main(String args[])
    {
    JScreen js = new JScreen("Test");
    js.start();
    }
    }
    //////////////////////////////////////////////////////////////
    import Render.*;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;public class FullScreenSample
    {
    Image im;
    JScreen w;

    public FullScreenSample()
    {
    w = new JScreen("FullScreen Exclusive Mode"); loadImage("show.gif");
    w.start();
    render();
    w.quit();
    }
    public void loadImage(String s)
    {
    Toolkit tk = Toolkit.getDefaultToolkit();
    im = tk.getImage(s);

    MediaTracker mt = new MediaTracker(w);
    mt.addImage(im, 0);
    try
    {
    mt.waitForAll();
    }
    catch(InterruptedException e)
    {}
    if( (mt.statusAll(false) & MediaTracker.ERRORED) != 0)
    {
    System.exit(0);
    } }

    public void render()
    {
    w.createBufferStrategy(2);
    BufferStrategy bs = w.getBufferStrategy();
      Graphics g = bs.getDrawGraphics();
    for(int i = 0; i < 5000; i ++)
    {
    g.setColor(Color.RED);
    g.fillRect(0, 0, 640, 480);
    g.drawImage(im, i, 50, w);
    bs.show();
    }
    g.dispose();
    }



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

  2.   

    不好意思,刚才的是老板本,最后那个FullScreenSample现在也添加了引用,排除了垃圾回收的可能,但是还是问题依旧~
      

  3.   

    public class FullScreenSample
    {
    Image im;
    JScreen w;
             /*********************************/
    boolean running=true; 
    int fr=0; 
    BufferStrategy bs=null;
             /********************************/
    public FullScreenSample()
    {
    w = new JScreen("FullScreen Exclusive Mode"); loadImage("show.gif");
    w.start();
                     /******************************************/
    w.createBufferStrategy(2);
    bs = w.getBufferStrategy();
    while(running){
    render();
    try{
    Thread.sleep(50);
    } catch(InterruptedException e){}
    }
                     /****************************************/
    w.quit();
    }
    public void loadImage(String s)
    {
    Toolkit tk = Toolkit.getDefaultToolkit();
    im = tk.getImage(s);

    MediaTracker mt = new MediaTracker(w);
    mt.addImage(im, 0);
    try
    {
    mt.waitForAll();
    }
    catch(InterruptedException e)
    {}
    if( (mt.statusAll(false) & MediaTracker.ERRORED) != 0)
    {
    System.exit(0);
    } }

    public void render()
    {
                     /**********************************/
    if(fr<500)
    fr++;
    else
    running=false;

      Graphics g = bs.getDrawGraphics();
    g.setColor(Color.RED);
    g.fillRect(0, 0, 640, 480);
    g.drawImage(im, fr, 50, null);
    bs.show();
    /****************************/
    g.dispose();
    }



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

  4.   

    还是不行...
    wobelisk()兄这样改的意思是什么呢?
    偶不是很明白。还有想请教,偶这样子这个东东有没有违反线程安全准则?