我正在Scala中做一个模拟程序,我试图通过覆盖paintComponent来在JPanel中渲染模拟:
override def paintComponent(g: Graphics2D) = {
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
super.paintComponent(g)
tx1 = g.getTransform()
g.setColor(new Color(0,0,0))
simulator.getVehicles foreach{vehc =>
g.translate(vehc.getPos.x,vehc.getPos.y)
g.draw(new Ellipse2D.Double(-Vehicle.rad, -Vehicle.rad, Vehicle.diam, Vehicle.diam))
g.drawLine(0,0,(Vehicle.rad*vehc.getDir.x).toInt,(Vehicle.rad*vehc.getDir.y).toInt)
g.setTransform(tx1)
}
}
我让模拟本身在不同的线程上运行:
def run{
//logic loop
time = System.currentTimeMillis();
dt = 1000/60
while(loop)
{
getVehicles.foreach{
_.move
}
collider.solvecollisions()
Thread.sleep(dt- (time - System.currentTimeMillis()))
time = System.currentTimeMillis();
}}
GetVehicles 返回所有模拟车辆的 Buffer[Vehicle]。
我的问题是渲染中有抖动。我的意思是,有时某些车辆的渲染时间比其他车辆晚。我认为发生这种情况是因为模拟循环在渲染循环获取位置的同时更新了位置,并且存在一些重叠。即,当在时间步长 n 开始渲染时,一半的车辆被渲染,然后发生时间步长 n+1,其余的车辆进一步渲染一个时间步长。首先,我认为这是一个需要通过双缓冲来解决的问题,但由于paintComponent 已经这样做了,我认为情况并非如此。任何想法如何解决这一问题?我尝试简单地渲染 getVehicles.clone 但这并没有帮助,因为对车辆的引用仍然相同。
谢谢!