0

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

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

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

这是“主要”类的一些代码:

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() 方法绘制图像时,这会限制我的程序功能并且是游戏引擎的糟糕设计。

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

4

1 回答 1

0

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

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

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

2017 年 11 月 17 日已解决

于 2018-05-19T06:37:42.090 回答