【问题标题】:Screen objects sometimes not rendering屏幕对象有时不渲染
【发布时间】:2018-05-02 08:59:51
【问题描述】:

我是一名经验丰富的程序员,用 Java 创建了多个游戏引擎模板和小型 2d 游戏。我目前正在扩展到 3d 游戏引擎,并正在重写以前的引擎,使其更具适应性和面向对象。

我的问题是,并且一直是周期性的,对象只是有时被渲染。这导致我必须不断地重新运行程序才能显示任何图像。

我没有找到这个问题的任何直接答案,而且似乎没有其他人有同样的问题(即使在观察具有完全相同代码设置的源时)。问题显然在于 render() 方法有时无法在 main 方法调用的线程中正确创建或使用 Graphics 和 BufferStrategy 对象。

这里是'Main'类的一些代码:

public Main() {
    addScreenAndFrame();
}

public static void main(String[] args) {
    main = new Main();
    frame.add(main);    
    thread = new Thread(main);
    running = true;
    thread.start();
}
public void run() {
    while (running) {
        render();
        tick();
    }
}
public void tick() {
    screen.tick();
}
public void render() {
    bs = getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }
    g = bs.getDrawGraphics();
    screen.paintComponent(g);
    g.dispose();
    bs.show();
}

下面是 Screen 类的一些代码:

public Screen(int width, int height) {
    this.width = width;
    this.height = height;
    addEntities();
}
public void paintComponent(Graphics g) {
    p.render(g);
}
public void tick() {
    KeyInput.tick();
    renderInput();
}
public void addEntities() {
    p = new PolygonObject(new double[] {50,200,50}, new double[] {50,200, 200} );
}

最后是 PolygonObject 类:

    public PolygonObject(double x[], double y[]) {
    Screen.polygonSize ++;
    polygon = new Polygon();
    for (int i=0; i < x.length; i++) {
        polygon.addPoint((int)x[i], (int)y[i]);
    }
}
public void render(Graphics g) {
    g.fillPolygon(polygon);
    g.setColor(Color.black);
    g.drawPolygon(polygon);
}

我不知道为什么在线程中调用 render() 会在将图像绘制到屏幕时产生不一致的结果。我见过许多游戏模板和教程的源代码,它们的代码完全相同,没有任何渲染问题。唯一能够始终如一地进行渲染的方法是,当我在线程外部使用 Canvas 类的 paintComponent() 方法绘制图像时,这会限制我的程序功能并且是游戏引擎的糟糕设计。

我想对此进行解释以及任何可能的解决方案。我没有准确的方法来构建游戏引擎而不使用线程来控制基于时间的功能。

【问题讨论】:

    标签: java graphics game-engine bufferstrategy


    【解决方案1】:

    第三个线程调用的run()方法不稳定,有时由于封装问题没有正确构造每个对象。

    我已经删除了额外的线程并重新构建了引擎以在 Screen 类中的 JPanel 的 paintComponent() 方法中执行所有渲染。 Main 类已重新构造,仅创建框架,然后将 Screen 和 KeyInput 对象添加到框架,同时管理游戏逻辑和输入。

    引擎现在可以 100% 成功渲染,所有对象都可以正常工作。

    已于 2017 年 11 月 17 日解决

    【讨论】:

      猜你喜欢
      • 2017-02-12
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      相关资源
      最近更新 更多