JobTimer

CJB_ny·2022년 3월 6일
0

Unity_Server

목록 보기
51/55
post-thumbnail

지난시간까지 패킷모아보내기를 알아보았다.

결국에는 가장 중요하고 핵심적인 부분들은 다 완료가 된 것이다.

오늘은 짜잘짜잘한 작업들 말고

오늘 살펴볼 것은

지난시간에 했던

0.25초마다 Flush를 하고싶었던 것이다.

그런데 나중에 게임이 커져가지고

Room이 하나만있는게 아니라 여러개가 있고

서버쪽에서 실행해야하는 객체가 많아진다고 가정을 하면은

그렇게되면

Sleep을 이용해서 대충 때려 맞추는 작업은 할 수 없다.

어떤 애들은 0.25초마다 돌려야하고 어떤애들은 0.1초마다 돌려야하고

제각각 다를 것이다.

AI를 돌린다거나 스킬연산을 한다거나 하는 부분들도

어딘가에서는 업데이트를 해주어야 한다.

그래서 어쨋든

우리가 선택을 내릴 차례가 온 것이다.

어떤 식으로 "시간관리"를 해야 할까?

1. 시간관리

기존에 이렇게 하던것을

다음으로 실행되어야 하는 rooTick이

현재 시간(== now)보다 작다고 하면은

Flush를 하도록

이렇게 +250을 해주어서 관리를 할 수 있을 것이다

그래서 실행해야 하는 객체가 계속 늘어난다고 하면은

각각의 틱을

여기서 이렇게 늘려서

실행해야하는 틱들을

여기서도 이렇게 늘리면 될 것이다.

그래서 게임 컨텐츠 로직을

여기 while문 안에다가 다 때려박는게

첫번째 "시간관리"를 하는 방법이기는 하다.

그렇다는 것은 네트워크 상에서 Session에서

Receive를 할 때, 별도의 쓰레드에서

쓰레드 풀에서 하나를 꺼내와가지고

그녀석을 처리를 한다음에 -> 처리한 부분을 PacketHandler까지 전달을

해주고있었는데

PacketHandler에서는

이렇게하면 브로드캐스트에 전달해서

이렇게 넣기만 하고 빠지고

나머지 실제 연산은 Main의 while에서 메인쓰레드가 해줘가지고

Queue를 비워주는 방식을 채택할 수도 있을 것이다.

참고로, 이렇게 중앙에서 모든 연산을 하는것이

굉장히 무식해 보이지만

이리저리 수소문 해본 결과 이렇게 무식하게 하는 프로젝트들도 있었다!

이렇게

Main쓰레드가 모든 연산을 다 때려하는 이런 프젝의 "장점"은

마치 우리가 클라프로그래밍을 하듯

굉장히 단순하다는 것!

그런데 이런 while문이 계속 커지는 방법이 아니라

어떤 "예약 시스템"이 있다면 굉장히 좋을거 같다라는 생각이 든다.

지금 while만에서 매프레임마다 if문 비교 연산을 해주고있는데

이렇게 안하고 예약하면 좋을듯!


2. 우선순위 큐

일단은 이것을 "우선순위 큐"를 사용하여 구현을 해보도록 하겠다.

(시간관리는 하는 방법은 여러가지 이다)

그래서 시간들을 다 큐에 집어넣은다음에

가장 임박한 "실행시간"이 가장 과거에 있는 애들부터 하나씩 하나씩 꺼내가지고

이런식으로 현재시간(now)가 다음으로 실행되어야 하는 시간(roomTick)보다 크다고 하면은

그 이벤트를 실행시켜주는 방식으로 쭉 구현하면 될 것이다.

그래서 part2에서 우선순위 큐 코드

이렇게 긁어온다 (물론 파일만들고)

그리고

Peek라는거 추가를 하자

뺴지는 않지만 살짝 옅보는 기능

그다음 Server 쪽에다가 새로운 코드 ㄱㄱ

Jobtimer.cs만들고

이 Queue에다가 넣어줄 정보를 만들 것이다.

그리고 넣어 줄 정보를 JobTimerElem으로 하고

IComparable를 만들어서 인터페이스를 구현을 해준다.


IComparable은


대충 이런느낌이다


그래서 여기에서

이부분 지워주고

실행시간, 해야할 행동을 담고 있도록 하겠다.

실행시간을 비교해주면되는데

execTick이 작으면 작을 수록 먼저 튀어 나오기를 바란다.

그래서 상대방의 틱 - 나의 틱을 뺴주면된다

조금 햇갈릴 수 있는 부분임

그래서 JobTimer를

이렇게 해주고 Push에서

tickAfetr = 0이라면 바로 실행하도록 옵션으로 0 으로 넣어주도록 하겠다.

그리고 이렇게 하고

이 자체를 큐에다가 넣어주면 된다.

그다음 이렇게 Push를 해주면된다.

이렇게하면 말그대로

FLush를 할때마다

now를 체크를 해가지고

이미때가 된 애들은 다 실행을 시켜주는 것이다.

그러면 이녀석을 사용하기 위해서

Server > Program > Main

이부분 작업 ㄱㄱ

쉽게하기위해 FlushRoom함수 만들고

Flush를 한번할 것이다. 그리고

다음단계 예약해야됨.

FLushRoom을 250ms후에 다시 실행시켜 달라고 요청한것임

이렇게 하면되는데

이전과 달라진 점이

이제는 다른 쓰레드에서도 마찬가지이지만

이 JobTimer라는 중앙 관리 시스템한테

어떤 일감을 던져가지고 예약을 하게 될 거고

시간이 되었으면

Flush를 해서 실행할 것이다.


아무튼

이렇게 중앙에서 관리하는 시스템을 만들어 가지고 하면

편리하다...

우선순위 큐로 대소관계도 Log n의 복잡도로 빠르게 비교가 가능하고

편리하다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글