【问题标题】:Java taking too long to render tiles from a PNG imageJava 从 PNG 图像中渲染图块的时间过长
【发布时间】:2016-12-12 12:22:41
【问题描述】:

我正在尝试通过 PNG 文件在 (600 / 448) 屏幕中渲染关卡 (1600 / 448)。它尝试渲染但没有成功,我认为它会在这样做时停止游戏循环。我认为这是因为有很多瓷砖,但我真的不知道如何绕过它。

 public void loadLevel(BufferedImage image) {
    int width = image.getWidth();
    int height = image.getHeight();

    for (int xx = 0; xx < width; xx++) { //width = 1600
        for (int yy = 0; yy < height; yy++) { //height = 448;
            Color c = new Color(image.getRGB(xx,yy));
            int red = c.getRed();
            int green = c.getGreen();
            int blue = c.getBlue();

            if (red == 225 && blue == 225 & green == 225) {
                objectHandler.add(new GrassRight(xx * 32, yy * 32, ObjectId.GrassRight));
            } else if (red == 129 && blue == 250 & green == 212) {
                objectHandler.add(new Player(xx * 32, yy * 32, objectHandler, ObjectId.Player));
           } else if (red == 0 && blue == 0 && green == 0) {
               objectHandler.add(new Dirt(xx * 32, yy * 32, ObjectId.Dirt));

            } else if (red == 144 && blue == 144 & green == 213) {
                objectHandler.add(new Grass(xx * 32, yy * 32, ObjectId.Grass));

            } else if (red == 38 && blue == 56 & green == 50) {
                objectHandler.add(new GrassLeft(xx * 32, yy * 32, ObjectId.GrassLeft));

            } else if (red == 62 && blue == 35 & green == 39) {
                objectHandler.add(new SlideRight(xx * 32, yy * 32, ObjectId.SlideRight));

            } else if (red == 191 && blue == 12 & green == 54) {
                objectHandler.add(new SlideLeft(xx * 32, yy * 32, ObjectId.SlideLeft));

            } else if (red == 127 && blue == 194 & green == 87) {
                objectHandler.add(new DownSlideLeft(xx * 32, yy * 32, ObjectId.DownSlideLeft));

            } else if (red == 49 && blue == 146 & green == 27) {
                objectHandler.add(new DownSlideRight(xx * 32, yy * 32, ObjectId.DownSlideRight));
            }
        }
    }
}


public void init() {
    System.out.println("Loading...");
    LoadingHandler loadingHandler = new LoadingHandler();
    level = loadingHandler.loadImage("/Level1.png");
    objectHandler = new ObjectHandler();
    cameraHandler = new CameraHandler(0, 0);
    this.addKeyListener(new KeyHandler(objectHandler));
    loadLevel(level);
    System.out.println("Done!");
}

public void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
        this.createBufferStrategy(3);
        return;
    }
    Graphics g = bs.getDrawGraphics();
    Graphics2D g2d = (Graphics2D) g;
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, getWidth(), getHeight());
    g2d.translate(cameraHandler.getX(), cameraHandler.getY());
    System.out.println("Rendering!");
    objectHandler.render(g);
    System.out.println("Rendered!");
    g2d.translate(-cameraHandler.getX(), -cameraHandler.getY());
    g.dispose();
    bs.show();

}

public class ObjectHandler {
public LinkedList<ObjectManager> object = new LinkedList<>();

ObjectManager tempObject;

public void tick() {
    for (int i = 0; i < object.size(); i++) {
        tempObject = object.get(i);
        tempObject.tick(object);
    }
}

public void render(Graphics g) {
    for (int i = 0; i < object.size(); i++) {
        tempObject = object.get(i);
        tempObject.render(g);
    }
}

public void add(ObjectManager object) {
    this.object.add(object);

}

它给出了这个输出:

Loading...
Done!
Rendering!

PNG:

【问题讨论】:

  • 进程是完全运行还是中途停止?
  • @user3437460 它中途停止了事实上它没有打印出“Rendered”
  • 代码不完整……我们可以猜到很多问题。
  • 您给定的代码中有很多缺失的部分。不知道你现在的类是什么,objectHandler是怎么定义的。
  • @JacekCz 是的,我认为这与瓷砖的数量有关,因为如果您将其放置几分钟,它确实会显示“已渲染”,但我仍然会看到白屏

标签: java render tiles


【解决方案1】:

不是为每个像素创建一个对象(即 716'800 个对象),而是为每个矩形区域创建一个对象(15 个对象)。

更新:

在 ObjectManager 类中,添加两个 int 字段:宽度和高度,然后渲染整个矩形而不是单个像素(或 32x32 正方形)。您仍然可以使用 PNG 来初始化对象,但使用更智能的算法,不会为每个像素重新创建新对象。

【讨论】:

  • 能否请你给我一个引导开始因为我不知道我将如何做到这一点
  • 这些对象(GrassRight、Player、SlideLeft 等)是如何渲染的?
  • 在 GrassRight 类中我有一个渲染方法: public void render(Graphics g) { g.setColor(Color.green); g.drawRect((int) x, (int) y, 32, 32); } 然后从 for 循环中读取 ObjectHandler 类:public void render(Graphics g) { for (int i = 0; i
  • 将 tempObject 声明为字段是一个非常糟糕的主意,顺便说一句。在使用它的块中声明:ObjectManager tempObject = object.get(i);
  • 好的,谢谢你建议做什么而不是 tempObject
猜你喜欢
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多