Я хочу, чтобы эта программа повторялась каждые 15 мс, и она работает, но если я попробую ее на более медленном компьютере, рендеринг перестанет работать правильно и отобразится только половина экрана. Я измерил время, необходимое для выполнения одного цикла, и обычно его прохождение занимает 0–3 мс, поэтому у него должно быть достаточно времени, чтобы сделать все, и даже большую часть времени ждать, чтобы наверстать упущенное, если что-то работает медленнее. Я попробовал thread.sleep и подождал, но у обоих одна и та же проблема. Я понятия не имею, почему при меньшем времени ожидания он работает иначе.
Код: Выделить всё
synchronized (this) {
LoadMap(LoadedMap);
//wait(500);
OldFrame = System.currentTimeMillis();
while (c.running) {
Objects.RunPhysics();
Objects.Render();
if (!Objects.Alive) {
Objects = Objects.Next;
}
renderer.FinishRender();
//System.out.print(System.currentTimeMillis() - OldFrame + " ");
if (System.currentTimeMillis() - OldFrame < 15) {
//Thread.sleep(15 - System.currentTimeMillis() + OldFrame);
//System.out.print(System.currentTimeMillis() - OldFrame + " ");
wait(15 - System.currentTimeMillis() + OldFrame);
} else {
//System.out.print(System.currentTimeMillis() - OldFrame + " ");
wait(100);
//Thread.sleep(200);
}
OldFrame = System.currentTimeMillis();
}
}
Код: Выделить всё
public void Render(double posX, double posY, BufferedImage i) {
image[index] = i;
ObjectPosX[index] = posX;
ObjectPosY[index] = posY;
index++;
image[index] = null;
}
public void FinishRender() {
//frame.removeAll();
//frame.revalidate();
frame.repaint();
frame.add(this);
frame.setVisible(true);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image[0], 0, 0, (int) Math.round(screenSize.getWidth()), (int) Math.round(screenSize.getHeight()), null);
for(index = 1; index < image.length - 1 && image[index] != null; index++)
{
if(ObjectPosX[index] >= 0){
g.drawImage(image[index], (int) Math.round((ObjectPosX[index] - 2) * ScreenWidth), (int) Math.round((ActScreenHeight - ((ObjectPosY[index] - 1) * ScreenHeight))), (int) ScreenWidth, (int) ScreenHeight, null);
} else {
g.drawImage(image[index], (int) -Math.round((ObjectPosX[index] + 1) * ScreenWidth), (int) Math.round((ActScreenHeight - ((ObjectPosY[index] - 1) * ScreenHeight))), (int) -Math.round(ScreenWidth), (int) Math.round(ScreenHeight), null);
}
}
index = lowestIndex;
}
Источник: https://stackoverflow.com/questions/781 ... erformance
Мобильная версия