Мне не нравится публиковать подобные проблемы. Но на этот раз я действительно не знаю, что случилось.
Я написал этот код на P C, и он работал нормально. Однако на моем Macbook это не работает. Это застревает во второй л oop это похоже? Есть ли способ предотвратить это? Macbook недостаточно быстр?
Код:
package com.mittspel;
public class Handler implements Runnable {
Thread thread;
boolean running = true;
boolean render = false;
int UPDATE_TIME = 1/60;
Handler() {
thread = new Thread(this);
thread.run();
}
public void run() {
double startTime = System.nanoTime() / Math.pow(10, 9);
double endTime = 0;
double passedTime = 0;
double notProcessedTime = 0; //So we dont skip frames.
double frameTime = 0;
int frames = 0;
int fps = 0;
while(running) {
render = false;
endTime = System.nanoTime() / Math.pow(10, 9);
passedTime = endTime - startTime;
frameTime += passedTime;
notProcessedTime += passedTime;
System.out.println("First loop");
do {
notProcessedTime -= UPDATE_TIME;
render = true;
frames++;
if(frameTime == 1.0) {
fps = frames;
System.out.println(fps);
frames = 0;
frameTime = 0;
fps = 0;
}
System.out.println("Second Loop");
}
while(notProcessedTime >= UPDATE_TIME);
if(render) {
//TODO: Render stuff
}
}
}
public void start() {
}
public static void main(String[] args) {
Handler handler = new Handler();
handler.start();
}
}
В чем проблема? Приведенный выше код должен быть "началом" «Игре-л oop. Первый l oop запускается, когда игра «запускается», а второй l oop - для случая, когда «notProcessedTime» превышает 1/60. Почему? Потому что я хочу, чтобы код там обновлялся в 60fps. В то время как l oop я также удаляю UPDATE_TIME из notProcessedTime, что означает, что я не хочу, чтобы код пропускал кадры. Позже во второй л oop я хочу напечатать fps. Который должен быть 60fps, если он работает правильно.
Что я пробовал перед публикацией?
Я попытался создать какой-то "System.out.println" в циклах и удалил код. Он дал мне следующие результаты:
- При удалении второго, пока l oop, он корректно зацикливается на первом l oop. Что на самом деле очевидно.
- Вставляя «System.out.println» в оба цикла (как показано выше), я обнаружил, что он печатает только один раз в первом l oop, затем только повторяет второй бесконечность.
Я сам после отладки предсказываю, что он застревает во втором, пока l oop. Поскольку код работал на P C, мне интересно, имеет ли он какое-то отношение к аппаратному обеспечению? Я застрял и мне нужна помощь. Я отладил его и не могу прийти к какому-либо лучшему выводу, чем этот.
Я пытался вставить код выше, извините за это!