绘制tilemap会减慢我在java中的线程

时间:2014-12-23 21:16:37

标签: java

我有这个非常奇怪的问题,当我绘制我的tilemap时,线程会大幅减慢。

这是瓦片地图代码:

public class TileMap {
    Tile[][] map;
    int x = 30, y = 0;

    public TileMap(String map) {
        String sCurrentLine;
        try {
            List<String> list = new ArrayList<String>();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/" + map)));

            while (true) {
                /** Starts reading the buffered line **/
                String line = bufferedReader.readLine();

                /** Closes the loop if there is no line to read **/
                if (line == null) {
                    bufferedReader.close();
                    break;
                }

                /** Adds a line to the list if it is not commented **/
                if (!line.startsWith("#")) {
                    list.add(line);
                }
            }

            readClass(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void readClass(List<String> stringList){
        int x = 0;
        int y = 0;

        map = new Tile[stringList.get(0).length()][stringList.size()];

        for(String s : stringList){
            int i = 0;
            while (i < s.length()){
                char c = s.charAt(i);

              //  if(c == 'A'){
                    map[x][y] = new Tile();
              //  }

                i++;
                x++;
            }

            x = 0;
            y++;
        }
    }

    public void draw(Graphics g){
        for (int x = 0; x < map.length; x++) {
            for (int y = 0; y < map[0].length; y++) {
                g.drawImage(map[x][y].getImage(),  (x * 20), (y * 20), null);
            }
        }
    }
}

现在这里是我的主类的代码,它基本检查绘制我的角色的方法并在角色之前绘制tilemap(注意:当我更改等待速度时,当tilemap减慢游戏速度时,没有任何反应):

public class GamePane extends JPanel implements Runnable {
    public static GameStateHandler gameStateHandler = new GameStateHandler();
    private static final long serialVersionUID = 1L;
    public static int WIDTH, HEIGHT;
    public static boolean running;
    Graphics graphics;
    Thread thread;

    public GamePane(Graphics g) {
        thread = new Thread(this);
        this.graphics = g;
        init();
        thread.start();
        setFocusable(true);
        requestFocusInWindow();
        addKeyListener(new GameKeyListener(this));
    }

    public void init() {
        WIDTH = 800;
        HEIGHT = 600;
        setPreferredSize(new Dimension(WIDTH, HEIGHT));

        running = true;
    }

    public void run() {
        while (running) {
            try {
                Thread.sleep(10);
                gameStateHandler.update();
                Main.drawOffScreen();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void keyPress(int keyCode) {
        gameStateHandler.keyPressed(keyCode);
    }

    public void keyReleased(int keyCode){
        gameStateHandler.keyReleased(keyCode);
    }
}

如果您还有其他需要,请告诉我!提前谢谢!

1 个答案:

答案 0 :(得分:0)

你可以发布Tile类的代码吗?我最好的猜测是问题可能出在Tile的getImage例程中。对于初学者来说,除了你为Tiles打电话之外,我什么都没看到,你在设置他们正在使用的图像吗? getImage是否将图像预先读入内存,或者每次调用getImage时是否从硬盘驱动器中提取图像(这可能需要很长时间,特别是如果您每帧尝试多次)? / p>

另外,您是否可以发布您正在为地图阅读的文件?它中有多少个字符?如果它有一个完整的“世界”地图,那么你每帧都会有效地重新绘制整个世界。通常情况下,游戏只会绘制当前可以看到的东西和一些超出视觉范围的边界,这大大缩短了大型世界的抽奖时间。