当前位置: 代码迷 >> J2SE >> 问个关于BufferStrategy类和java绘图效率的有关问题
  详细解决方案

问个关于BufferStrategy类和java绘图效率的有关问题

热度:109   发布时间:2016-04-24 01:23:36.0
问个关于BufferStrategy类和java绘图效率的问题
大家好, 我最近在弄个游戏。。。。(好吧我知道java不适合做游戏)
本来是用JFrame来作为窗口的,然后加个JComponent来当画布绘画,但是我随着我绘制的图片的增加,速度也变慢了。。。
于是我想获得BufferStrategy来搞,然后自己弄个线程来绘制,但是却莫名的老出现裂图,我上网搜了下双缓冲,然后试了下也不行 郁闷 希望高手帮忙看看怎么回事 下边贴下代码。。。哎 难道真要放弃java。。。。(不好意思,本人目前只会java。。喜欢swing。。喜欢java的语法。。。笑)
Java code
import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.GraphicsDevice;import java.awt.GraphicsEnvironment;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import java.awt.image.BufferStrategy;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;public class DoRenderMyself implements Runnable {    private Thread loopThread;    private GraphicsDevice screen;    private JFrame frame;    private BufferedImage tile;    private BufferedImage select;    private int tileW;    private int tileH;    private Point screenAnchor = new Point(0, 0);    private Point plotP = new Point(0, 0);    public static void main(String[] args) {        new DoRenderMyself();    }    public DoRenderMyself() {        this.frame = new JFrame("DoRenderMyself");        this.frame.addMouseMotionListener(this.new Mouse());        this.frame.setBounds(150, 100, 900, 600);        this.frame.setIgnoreRepaint(true);        this.frame.setUndecorated(true);        this.frame.setVisible(true);        this.loopThread = new Thread(this);        screen = GraphicsEnvironment.getLocalGraphicsEnvironment()                .getDefaultScreenDevice();        this.loopThread.start();    }    public void run() {        init();        gameLoop();    }    public void init() {        try {            this.tile = ImageIO.read(new File("src/res/tile0.gif"));            this.select = ImageIO.read(new File("src/res/tree0.gif"));        } catch (IOException e) {            e.getStackTrace();        }        this.tileW = tile.getWidth();        this.tileH = tile.getHeight();        this.frame.createBufferStrategy(3);    }    public void gameLoop() {        BufferStrategy buff = this.frame.getBufferStrategy();        Graphics g = buff.getDrawGraphics();        BufferedImage iBuffer = new BufferedImage(this.frame.getWidth(),                this.frame.getHeight(), BufferedImage.TYPE_INT_ARGB);        while (true) {            try {                Thread.sleep(100);            } catch (Exception e) {            }            Graphics2D g2 = (Graphics2D) iBuffer.getGraphics();            paint(g2);            g.drawImage(iBuffer, 0, 0, this.frame);            System.out.println("f");            buff.show();        }    }    public void paint(Graphics2D g2) {        g2.clearRect(0, 0, this.frame.getWidth(), this.frame.getHeight());        g2.scale(2, 2);        for (int r = 0; r < 20; r++) {            for (int c = 0; c < 20; c++) {                map_To_Screen(c, r, plotP);                g2.drawImage(this.tile, plotP.x, plotP.y, null);                g2.setColor(Color.WHITE);                // g2.drawString(r + ", " + c, this.plotP.x + 10,                // this.plotP.y + 10);                if (c % 2 == 0) {                    g2.drawImage(this.select, plotP.x, plotP.y - 40, null);                }            }        }        g2.dispose();    }    public void map_To_Screen(int mapCol, int mapRow, Point p) {        int x = mapCol * (tileW >> 1) - mapRow * (tileW >> 1)                - this.screenAnchor.x;        int y = mapCol * (tileH >> 1) + mapRow * (tileH >> 1)                - this.screenAnchor.y;        p.x = x;        p.y = y;    }    class Mouse extends MouseMotionAdapter {        public void mouseMoved(MouseEvent e) {            int mX = e.getX();            int mY = e.getY();            DoRenderMyself.this.frame.setTitle(mX + ", " + mY);            if (mX < 18) {                DoRenderMyself.this.screenAnchor.x -= 8;            }            if (mY < 18) {                DoRenderMyself.this.screenAnchor.y -= 8;                System.out.println("up");            }            if (mX > DoRenderMyself.this.frame.getWidth() - 8) {                DoRenderMyself.this.screenAnchor.x += 18;            }            if (mY > DoRenderMyself.this.frame.getHeight() - 8) {                DoRenderMyself.this.screenAnchor.y += 18;            }        }    }}
  相关解决方案