Thread.sleep ()으로 조절 된 루프는 의도 한 것보다 두 배 이상 자주 실행됩니다.

dot_Sp0T

다음 루프 (일부 잘라 내기)를 게임의 메인 루프로 사용하지만 원하는 속도로 스로틀 링 할 수 없으며 의도 한 것보다 약 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

자주 트리거되는 CRON Azure 웹 작업이 구성된 빈도보다 오래 실행될 때 두 번째로 트리거됩니까?

분류에서Dev

별도의 CSS 파일이 항상 인라인 스타일보다 우수한 것으로 간주됩니까? 일회성 조정이라도?

분류에서Dev

별도의 CSS 파일이 항상 인라인 스타일보다 우수한 것으로 간주됩니까? 일회성 조정이라도?

분류에서Dev

별도의 CSS 파일이 항상 인라인 스타일보다 우수한 것으로 간주됩니까? 일회성 조정이라도?

분류에서Dev

흐름 참조의 뮬 루프가 매우 이상한 순서로 실행됩니다.

분류에서Dev

Rust lang thread :: sleep () Windows에서 게임 루프 동안 지정된 시간의 거의 두 배 동안 잠자기

분류에서Dev

플래시 IDE 컴파일러는 두 배의 속도로 실행됩니다.

분류에서Dev

두 개의 파이프 프로그램, 하나는 다른 프로그램이 종료 된 후에도 계속 실행됩니다.

분류에서Dev

이상한 결과를주는 두 배로 뜨다

분류에서Dev

새 HDD (x3) 디스크 쓰기 오류 !! 내가 많은 것을 시도해 주시도록 도와주세요. 나는 그것의 일관된 높은 비트 레이트 사용으로 인한 것으로 의심됩니다

분류에서Dev

이 루프는 왜 무한히 실행됩니까? for 루프에서 쉼표로 구분 된 조건

분류에서Dev

앱의 상태를 업데이트하기 위해 입력 필드와 함께 연결된 onChange 이벤트 핸들러 함수는 첫 번째로드시 한 번 실행되고 이후 단어 두 번 실행됩니다.

분류에서Dev

연속 된 두 숫자의 합이 3으로 나눌 수 없도록 정수 배열을 정렬합니다.

분류에서Dev

루프는 처음 호출 될 때 한 번만 실행되고 두 번째로 무한 실행됩니다.

분류에서Dev

입력 된 하나가 다른 것보다 하나 이상의 특정 변수를 가지고 있는지 확인하기 위해 두 개의 문자 배열을 서로 어떻게 비교합니까?

분류에서Dev

Jenkins 파이프 라인의 모든 단계가 동일한 호스트에서 실행된다는 것이 보장됩니까?

분류에서Dev

IMPORTDATA의 실제 한도는 광고 된 것보다 낮은 것 같습니다 (150 만 셀로 importdata 테스트).

분류에서Dev

동일한 내용의 새 배열로 배열을 선언하지 않는 한 배열은 while 루프에서 자체적으로 변경됩니다.

분류에서Dev

두 개의 서로 다른 Spark 구조화 된 스트림으로 동일한 주제를 읽어 Kafka 파이프 라인 디버그

분류에서Dev

Javascript 함수 배열이 자동으로 실행됩니다.

분류에서Dev

for 루프와 파이썬 3의 if 조건을 사용하여 두 배열 내의 일치하는 요소를 다른 값으로 바꿉니다.

분류에서Dev

이상한 버그-서브 루틴은 cout으로 만 실행됩니다.

분류에서Dev

SonarQube Analysis를 두 번 실행하면 이전 문제가 모두 제거 된 것으로 표시됩니다.

분류에서Dev

requestFrameAnimation으로 만든 작은 게임 (코드 펜 참조)을 형성하는 루프는 한 번의 사용자 입력 명령 지연으로 실행됩니다.

분류에서Dev

오이가 처음입니다. 두 개의 기능 파일을 실행하고 있습니다. 실행하는 동안 오류가 표시됩니다. 첫 번째 태그 만 실행하면 정상적으로 실행됩니다.

분류에서Dev

useEffect 후크는 두 번째 인수가 제공된 경우에도 무한 루프를 실행합니다.

분류에서Dev

PHP : 문자열, 두 개의 배열 및 4 개의 루프는 0이됩니다.

분류에서Dev

Python : 중첩 된 iteritems 루프는 한 번만 실행됩니다.

분류에서Dev

"다른 프로세서에서 두 개의 상점이 일관된 순서로 보인다"는 것은 무엇을 의미합니까?

Related 관련 기사

  1. 1

    자주 트리거되는 CRON Azure 웹 작업이 구성된 빈도보다 오래 실행될 때 두 번째로 트리거됩니까?

  2. 2

    별도의 CSS 파일이 항상 인라인 스타일보다 우수한 것으로 간주됩니까? 일회성 조정이라도?

  3. 3

    별도의 CSS 파일이 항상 인라인 스타일보다 우수한 것으로 간주됩니까? 일회성 조정이라도?

  4. 4

    별도의 CSS 파일이 항상 인라인 스타일보다 우수한 것으로 간주됩니까? 일회성 조정이라도?

  5. 5

    흐름 참조의 뮬 루프가 매우 이상한 순서로 실행됩니다.

  6. 6

    Rust lang thread :: sleep () Windows에서 게임 루프 동안 지정된 시간의 거의 두 배 동안 잠자기

  7. 7

    플래시 IDE 컴파일러는 두 배의 속도로 실행됩니다.

  8. 8

    두 개의 파이프 프로그램, 하나는 다른 프로그램이 종료 된 후에도 계속 실행됩니다.

  9. 9

    이상한 결과를주는 두 배로 뜨다

  10. 10

    새 HDD (x3) 디스크 쓰기 오류 !! 내가 많은 것을 시도해 주시도록 도와주세요. 나는 그것의 일관된 높은 비트 레이트 사용으로 인한 것으로 의심됩니다

  11. 11

    이 루프는 왜 무한히 실행됩니까? for 루프에서 쉼표로 구분 된 조건

  12. 12

    앱의 상태를 업데이트하기 위해 입력 필드와 함께 연결된 onChange 이벤트 핸들러 함수는 첫 번째로드시 한 번 실행되고 이후 단어 두 번 실행됩니다.

  13. 13

    연속 된 두 숫자의 합이 3으로 나눌 수 없도록 정수 배열을 정렬합니다.

  14. 14

    루프는 처음 호출 될 때 한 번만 실행되고 두 번째로 무한 실행됩니다.

  15. 15

    입력 된 하나가 다른 것보다 하나 이상의 특정 변수를 가지고 있는지 확인하기 위해 두 개의 문자 배열을 서로 어떻게 비교합니까?

  16. 16

    Jenkins 파이프 라인의 모든 단계가 동일한 호스트에서 실행된다는 것이 보장됩니까?

  17. 17

    IMPORTDATA의 실제 한도는 광고 된 것보다 낮은 것 같습니다 (150 만 셀로 importdata 테스트).

  18. 18

    동일한 내용의 새 배열로 배열을 선언하지 않는 한 배열은 while 루프에서 자체적으로 변경됩니다.

  19. 19

    두 개의 서로 다른 Spark 구조화 된 스트림으로 동일한 주제를 읽어 Kafka 파이프 라인 디버그

  20. 20

    Javascript 함수 배열이 자동으로 실행됩니다.

  21. 21

    for 루프와 파이썬 3의 if 조건을 사용하여 두 배열 내의 일치하는 요소를 다른 값으로 바꿉니다.

  22. 22

    이상한 버그-서브 루틴은 cout으로 만 실행됩니다.

  23. 23

    SonarQube Analysis를 두 번 실행하면 이전 문제가 모두 제거 된 것으로 표시됩니다.

  24. 24

    requestFrameAnimation으로 만든 작은 게임 (코드 펜 참조)을 형성하는 루프는 한 번의 사용자 입력 명령 지연으로 실행됩니다.

  25. 25

    오이가 처음입니다. 두 개의 기능 파일을 실행하고 있습니다. 실행하는 동안 오류가 표시됩니다. 첫 번째 태그 만 실행하면 정상적으로 실행됩니다.

  26. 26

    useEffect 후크는 두 번째 인수가 제공된 경우에도 무한 루프를 실행합니다.

  27. 27

    PHP : 문자열, 두 개의 배열 및 4 개의 루프는 0이됩니다.

  28. 28

    Python : 중첩 된 iteritems 루프는 한 번만 실행됩니다.

  29. 29

    "다른 프로세서에서 두 개의 상점이 일관된 순서로 보인다"는 것은 무엇을 의미합니까?

뜨겁다태그

보관