다음 루프 (일부 잘라 내기)를 게임의 메인 루프로 사용하지만 원하는 속도로 스로틀 링 할 수 없으며 의도 한 것보다 약 2 배 빠르게 계속 실행됩니다.
private void myLoop() throws InterruptedException {
long timer = TimeUtils.getMillis();
int achievedLoops = 0;
long currTime = 0l;
long loopTime = 0l;
long lastTime = TimeUtils.getNano();
while(!isRequestedToStop) {
currTime = TimeUtils.getNano();
loopTime = currTime - lastTime;
lastTime = currTime;
if(TimeUtils.getDeltaMillis(timer) > 1000) {
timer += 1000;
logger.debug(achievedLoops + " Loops");
achievedLoops = 0;
}
achievedLoops++;
if(loopTime < TIME_PER_LOOP) {
Thread.sleep( (TIME_PER_LOOP - loopTime) / 1000000l);
}
}
}
수면의 대체 구현은 약간 더 나은 결과를 얻습니다 (루프가 너무 자주 1.9 배만 실행 됨).
while(loopTime < TIME_PER_LOOP) {
Thread.sleep(1l);
loopTime += 1000000l;
}
또 다른 대안 :
while(loopTime < TIME_PER_LOOP) {
Thread.sleep(1l);
loopTime = TimeUtils.getNano() - lastTime;
}
왜 그럴까요?
스레드를 줄이는 다른 방법이 있습니까?
논리가 시간이 지정된 단계에 연결되어 있기 때문에 기본적으로 제어되지 않고 실행할 수 있지만, 그렇지 않으면 CPU에 손상을 줄 가능성이 거의 없으므로 루프의 총 실행을 줄이고 싶습니다.
분할을 수행 할 때마다
(TIME_PER_LOOP - loopTime) / 1000000l
결과를 자르고 예상보다 최대 1ms (평균 0.5ms) 더 적게 잠자고 있습니다. 4ms의 루프 시간이 주어지면 루프가 예상보다 두 배 빠르게 실행됩니다. 다른 사람들이 언급했듯이 타이밍을 제어하는 훨씬 더 좋은 방법이 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다