屏幕对象有时无法渲染



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

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

我还没有找到这个问题的任何直接答案,似乎没有其他人有同样的问题(即使在观察具有完全相同代码设置的源代码时)。问题显然在于render()方法有时不能正确地创建或使用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()方法绘制图像,这限制了我的程序功能,也是游戏引擎的糟糕设计。

我想对此作出解释,并提出任何可能的解决方案。对于我来说,没有一种准确的方法可以在不使用线程的情况下构建游戏引擎,从而实现可控的基于时间的功能。

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

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

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

2017年11月17日解决

最新更新