• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

6:50 설명부분 질문(시간 연산 질문)

21.11.17 20:02 작성 조회수 136

1

강의를 듣다가 궁금한 부분이 생겨서 질문합니다!

 

float deltaTime = 0;

        void ExplodeAfter4Secod()

        {

            deltaTime += Time.deltaTime;

            if(deltaTime >= 4)

            {

                // 로직

            }

이렇게 코드를 작성하여 실행을 시키면 컴퓨터가 매프레임마다 deltaTime에 Time.deltaTime을 더해서 if문으로 확인을하고 다시 시간을 더해서 if문으로 확인을하고 

이러한 일련의 작업들이 무식하고 비효율적이다

=> 그래서 시간 매니저를 만들어서 시간매니저에게 "4초후에 무엇인가를 하고싶어!"라고 던져주면 시간매니저가 4초가되었을때 알려주어 해당 로직을 실행하게하면,

매프레임마다 매프레임마다 시간을 더해서 if문 체크를 하는 낭비를 생략할 수 있다.  즉, 중앙에서 관리를 하면 낭비를 줄일 수 있다라고 설명을 하셨는데

 

1. "4초후에 무엇인가를 하고싶어!"라고 시간매니저(중앙)에 던져주어 매니저가 시간을 샌다음에 결국에 다시 해당 함수에 "4초가 지났다!"라고 알려주어 해당함수의 로직이 실행이되는것같은데..

매니저에게 "4초후에 무엇인가를 하고싶어!" 라고 던져주면 결국 매니저도 연산을 한뒤에 요청을 보낸 함수에게 알려주는 것이니까 결국 같은것아닌가용...??ㅎㅎ;;(원리가 잘 이해가 가지 않습니다)

 

2. 시간 매니저에게 "4초후에 무엇인가를 하고싶어!"라고 보냈을때는 매틱마다(매 프레임마다)연산을 하지않고 4초가지났다라고 해당함수에게 알려 줄 수 있는것인가요??

 

3. 시간매니저에게 "4초후에 무엇인가를 하고싶어!"라는 요청을 보낼때 매프레임마다 연산을 하지않는다면 시간을 어떻게 재서 다시 해당함수에게 알려 줄 수 있는것인가요??

 

4. 코루틴이 1~3경우에 굉장히 유용하다고 설명하셨는데 코루틴은 어떠한 원리로 "4초를 일시정지"햇다가 다시 실행시켜 줄 수 있는것인가요? 

일시정지를 했더라도 일시정지한 시간을 알아야 4초후에 알려줄 수 있는거같은데...일시정지하는동안도 연산을 하나요??

답변 1

답변을 작성해보세요.

3

1. "4초후에 무엇인가를 하고싶어!"라고 시간매니저(중앙)에 던져주어 매니저가 시간을 샌다음에 결국에 다시 해당 함수에 "4초가 지났다!"라고 알려주어 해당함수의 로직이 실행이되는것같은데.. 매니저에게 "4초후에 무엇인가를 하고싶어!" 라고 던져주면 결국 매니저도 연산을 한뒤에 요청을 보낸 함수에게 알려주는 것이니까 결국 같은것아닌가용...??ㅎㅎ;;(원리가 잘 이해가 가지 않습니다)

->
여기부턴 자료구조&알고리즘 분야로 넘어가는데
일감 100개가 있고 각각 1초, 2초, 3초 ... 100초 후에 실행되어야 한다고 가정해보겠습니다.
그러면 매 틱마다 일감 100개를 모두 확인해야 비로소 시간이 지났는지를 알 수 있을까요?
당연히 그렇지 않습니다.
우선순위 큐나 정렬된 리스트를 이용해 일감 100개를
'정렬된' 상태로 지니고 있다고 가정해보겠습니다.
현재 2.5초 경과된 상태라면, [1초/2초 후 실행 일감]은 실행되겠지만
바로 그 다음에 등장하는 [3초 후 실행 일감]은 아직 실행되지 않아야 할 것이고,
이를 토대로 4~100초 후 실행되어야 하는 일감은 체크하지도 않고 
실행될 필요가 없다는 것을 알게 되겠죠.
이를 관리하는 방법은 굉장히 다양합니다.
참고로 테라 서버에서도 비슷하게 일감을 중앙에서 관리했는데,
한참 후 (ex. 100초 이상) 남은 애들은 별도의 큐로 관리해서
아주 느리게 1초에 한번씩만 체크를 하고,
얼마 안 남은 (ex. 100초 미만) 남은 애들은
여러 버킷으로 쪼개서 관리했습니다.
가령 0~1초 후 실행되는 통 하나, 1~2초 후 실행되는 통 하나, 
이런 식으로 버킷 단위로 일감을 관리해서
해당 통 단위로만 체크했던 기억이 있네요.
아무튼 상세한 방법은 응용하기에 따라 아주 많습니다.

2. 시간 매니저에게 "4초후에 무엇인가를 하고싶어!"라고 보냈을때는 매틱마다(매 프레임마다)연산을 하지않고 4초가지났다라고 해당함수에게 알려 줄 수 있는것인가요??

 -> 네

3. 시간매니저에게 "4초후에 무엇인가를 하고싶어!"라는 요청을 보낼때 매프레임마다 연산을 하지않는다면 시간을 어떻게 재서 다시 해당함수에게 알려 줄 수 있는것인가요??

-> 1번 참고 바랍니다.