我是一名经验丰富的程序员,用 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() 方法绘制图像时,这会限制我的程序功能并且是游戏引擎的糟糕设计。
我想对此进行解释以及任何可能的解决方案。我没有准确的方法来构建游戏引擎而不使用线程来控制基于时间的功能。