Я создал класс, который контролирует скорость, с которой работает моя программа, вроде вертикальной синхронизации, и она передает необходимую информацию программе в каждом кадре.У меня все работает, но я попытался использовать более точный Thread.sleep (long millis, int nanos), который я довольно неопытен.Основываясь на описаниях, которые я видел, он просто добавляет предоставленные миллисекунды к наносекундам, а затем останавливает поток.Но около 90% кадров выдают странное исключение, которое я действительно не могу расшифровать.
java.lang.IllegalArgumentException: nanosecond timeout value out of range
Ниже приводится большая часть кода, который я использовал, который каким-либо образом взаимодействует с переменной, которую я использую для задержкискорость потока.
long startTime = System.nanoTime();
while (! this.stop)
{
try
{
// Run Frame
long endTime, deltaTime, deltaRemainder;
endTime = System.nanoTime();
deltaTime = endTime - startTime;
deltaRemainder = this.rate - (deltaTime % this.rate);
System.out.println("Frame Completed with "
+ (double)(deltaRemainder * .000000001) + " seconds left!");
if (deltaRemainder > 0)
Thread.sleep(0, (int)(deltaRemainder));
startTime = System.nanoTime();
}
catch (Exception e)
{
e.printStackTrace();
}
}
- это переменная, равная длине кадра в наносекундах, остановка действительно не важна и очевидна.start / endTime - это время в начале и конце кадра.deltaTime - время, которое фрейм занял до конца.И, наконец, deltaRemainder - это количество дополнительного времени, которое фрейм должен был завершить (если это занимает больше времени, чем должно, он переходит к концу в следующем возможном фрейме).
Может кто-нибудь объяснить, почему это исключениеброшен?Я действительно предпочел бы использовать точность, которую обеспечивает эта функция.