Программа работает по-разному в зависимости от времени сна/производительности компьютера.JAVA

Программисты JAVA общаются здесь
Ответить
Гость
 Программа работает по-разному в зависимости от времени сна/производительности компьютера.

Сообщение Гость »


Я хочу, чтобы эта программа повторялась каждые 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();
}
}
вот методы рендеринга, которые я использую. Я добавляю объекты и сопоставляю их в массив и сохраняю позиции x и y в другом массиве в методе рендеринга, а затем, когда я хочу показать это на экране, я вызываю метод Finishrender, который рисует все в массиве на экране.

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»