C# Play-Back 개발 - 1

Godtaek·2024년 7월 18일
0

Simulation

목록 보기
1/1

1. 서론

시뮬레이션 개발 N달 차.... 아직 시뮬레이션 개발이 뭔지 감도 못잡은 상태에서 Play-Back 기능을 개발하게 됐다.

쉽게 말하면 리플레이 기능으로, 특정 시점 X에서 Y까지 있었던 일을 다시 보여주는 것이다.

레거시 코드가 있다곤 했지만... 도움이 되지 않아버렷.... 그러나 기능 개발의 힌트는 얻을 수 있었다.

2. 아이디어

History를 만들어서 돌리면 안 되나? 라고 생각했다.

그런데, string으로 이력 데이터를 저장하자니 용량이 쉽고 빠르게 커져버린다. 1년, 2년 전 데이터도 저장해야 하기 때문에, 용량이 너무 커지면 안 된다. 그러기 위해서 정보 데이터를 숫자로 바꾼 다음, 그걸 바이너리 파일로 바꿔 저장할 예정이다.

바이너리 파일로 바꾸는 형식으로, 2가지 정도의 방법을 떠올렸다.

  1. 이벤트를 저장하여, 특정 시점부터 다시 시뮬레이션을 돌리는 형식
  2. 오브젝트들의 위치, 상태를 프레임별로 저장하여 해당 시점부터 저장한 정보를 기반으로 다시 재생하는 형식

일단 전자로 결정했다.

이유는 다음과 같다.

  1. 시뮬레이션 코드를 재사용할 수 있을 거 같았고,
  2. 시뮬레이션을 배속해서 결과값을 빠르게 얻기에 유리해보였다.

View만 따지자면, 2번 형식이 좋지만, View없이 빠르게 그 당시 결과값을 봐야할 경우도 있으니....

초기값만 History 데이터 기반으로 계산해서 세팅해주고, 이벤트 기반으로 다시 시뮬레이션 돌리는 형식을 일단 선택했다.

3. 예상되는 문제

많은 문제가 예상되지만, 기본적으로 재생하고 있다가, 뒤로 가거나 앞으로 갈 때 문제가 예상된다.

이벤트 기반이기 때문에 시간의 흐름이 역행하거나 흐름이 건너뛴다면 문제가 생길 수 있다.

뒤로 가는 것을 방지하기 위해서 플레이백을 했던 데이터에 한해서는 바이너리 데이터로 캐싱할 예정이다.

현재 이끌었던 최대 시간을 갱신하면서 진행하다가, 뒤로 돌아가면 바이너리 데이터를 불러오는 형식이면 될 거 같다.

앞으로 당기는 거는 이벤트를 빠르게 당겨서 해버리는 수 밖에 없지 않을까 싶은데

이렇게 구현하면 또, 뒤로 당기는 문제가 생길 수 있거나, 앞으로 당길 때 로딩의 문제가 생길 수 있을 거 같다.

계속 고민해보고 구현하고 해결해볼 예정이다.

4. 글 쓰다가 문득

이벤트 기반으로 해버리면 딱히 해야될 필요가 없지 않나 싶다.
History 테이블이 존재하고(위치나 상태를 표현해주진 않지만, 유추할 수 있다.)

특정 시점의 기록을 보고 싶다면 그 시점 바이너리 데이터들 + History 테이블 데이터들로 상황을 모사할 수 있을 거 같은데

혹시.... 조언해주신다면 감사합니다.

profile
성장하는 개발자가 되겠습니다

0개의 댓글