GetTickCount() -> GetTickCount64()로 변경하기.

1. Redstone에선 UWP에서 IOCP를 쓸 수 있다. 그래서 개발중인 프로젝트의 UWP버전에서 StreamSocket을 사용한 네트워크코드를 걷어내고 IOCP기반의 win32코드로 교체하기로 결정.
2. 코드 고치다보니 GetTickCount()가 거슬림. PC가 부팅되고 최대 47일밖에 보장이 안되는 카운터라 안그래도 계속 바꾸려고 생각하고 있었음. 좋다. GetTickCount64()로 바꾸자.
3. 이게 조심해서 고쳐야 하는게  4바이트에서 8바이트로 사이즈가 증가하는거라 메모리 옵셋으로 다루는 부분이 있는지 확인하고 언더플로우나 오버플로우 여부를 다 체크해야됨.
4. 네트워크 코드에선 금방 고쳤는데 이벤트 콜백함수에서 DWORD dwTick으로 사용하고 있음. 네트워크라이브러리를 사용하는 쪽 코드에서도 DWORD dwTick -> ULONGLONG CurTick으로 변경 필요.
5. 네트워크 라이브러리를 사용하는 서버 코드를 뒤집기 시작함. 의외로 GetTickCount()와 DWORD dwTick이 많이 나옴.
6. 그래픽 엔진을 서버에서도 사용하는데 그래픽 엔진에서 DWORD dwTick을 받음. 서버 코드 고치던거 스택에 푸쉬하고 그래픽 엔진 고치기 시작. 그래픽 API에 독립적인 DLL(Geometry라 부름)을 고치는데 그래픽 API를 사용하는 렌더러 DLL(Renderer라 부름)에서도 DWORD dwTick을 받음.
7. Geometry 코드 작업하던걸 또 스택에 푸쉬하고 Renderer DLL 코드를 뒤집기 시작. 다행히 이쪽은 타이밍 맞추는 코드가 별로 없어서 비교적 쉽게 끝남.
8. 다시 Geometry쪽 코드로 돌아옴. 싹 고치고 몇번이나 검증함.
9. 게임서버 코드로 돌아가서 엔진코드 호출부분을 고침.
10. 그렇게 서버를 띄우고 보니 클라이언트에서 엔진 코드 호출하는 부분이랑 클라이언트에서 GetTickCount()사용하는 코드를 안고쳤네. 클라이언트 코드를 뒤집기 시작.
11. 결국 프로젝트의 모든 DLL코드와 EXE를 다 뒤집어 엎음. 그 와중에 잠재적 버그 몇 개 찾아냄. 찜찜해서 모든 프로젝트를 static analyze돌림. 추가로 잠재적 버그 몇 개 더 찾음.
12. 잘 돌아감.
13. win32버전의 코드 변경분을로 UWP버전에 다시 업데이트 준비중.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중