go4game 추가 사항들 정리
By SeukWon Kang
github commit log로 부터 역으로 만들어낸 내용입니다.
설명: 실제 여러 월드가 동작하는 화면
설명: 월드내 팀의 자세한 상태 - 배경색이 team color
설명: 추가된 장식물, home object
최근 부터 역순으로 team 의 world 간 이동 기능 homepos to home object json config load / save log format 정리 장식물(decoration object)들 추가 collision 관련 성능, 구조 개선 object, team, world struct 간 상호 pointer 줄이기. 같은 기능이 추가 되었습니다. 코드상으로는 많은 변화가 있었지만 실제 외견(어차피 서버라 외견이랄게 없지만)상으로 변화한 것은 별로 없습니다.
설명을 덧붙이자면 team의 world간 이동은 zone base 의 게임을 만드는 것을 가정하고 만든 것입니다. 즉 여러개의 zone(==world) 가 존재하고 player(==team)가 그 zone간을 자유롭게 이동할 수 있게 한 것입니다.
json config는 테스트 하다보니 여러 벌의 설정이 필요한데 매번 코드 수정하자니 귀찮기도 하고 해서 만든것입니다. 재미있는 점은 보통 서비스 설정 관련 코딩을 하다보면 여러 설정을 합치는 것 ( default 설정 + 사용자 지정 config + 사용자 지정 option )이 필요한데 각 설정이 기존 설정에 partial overwrite 를 해야 하는 경우가 많습니다. ( 즉 추가 설정이 모든 값을 가지고 있지 않은 경우) 이경우 추가되는 필드만 덮어쓰도록 하는 것은 꽤나 귀찮은 코딩을 요구하는데 golang의 json unmarshal 은 이 부분이 자연스럽게 이루어 집니다. ( 새 config에 있는 값만 기존 struct에 덮어 씁니다. 없는 field는 기존값 보존) golang 문서상으로 명시되어 있지 않아 테스트 코드를 짜서 확인 했습니다.
장식물은 새 object type 를 추가 하는 데 어느 정도의 코딩이 들어가는지 테스트 겸 게임스러움을 주기 위한 non-interaction object를 추가하기 위한 작업 입니다. 아직은 그냥 열을 지어 원점 중심으로 공전하는 object일 뿐입니다.
기존 team별 homepos을 home object로 변경하였습니다. homepos처리를 일반화 하고 또 사용자가 homepos를 볼 수 없는 문제를 해결하기 위함입니다.
주 struct간 pointer 줄이기는 team의 world간 이동을 위한 기반 작업입니다. 그리고 golang이 생각보다 pointer 처리에 성능 소비가 많은 점 때문에 성능을 올리는 효과도 있지 않을까 하는 생각도 있었습니다. 코드를 계속 refatoring 하고 benchmark하면서 알게된 아주 중요한 사실중 하나는 **golang에서 성능을 얻고 싶으면 pointer사용을 자제 해야 한다는 점입니다. ** 보통 pointer 를 사용하는 것이 memory copy가 줄기 때문에 더 빨라진다고 생각하는데 ( 저도 그랬습니다. ) golang에서는 그보다 referenct counting을 사용한 gabage collection을 위한 처리쪽이 더 부하가 크기 때문에 가능하면 pointer 보다 value 를 사용하는 것이 더 빠릅니다. (profile해보면 golang runtime에서 GC관련 시간 소비를 꽤 많이 합니다.) 그리고 struct 내에서도 불필요한 pointer field를 없애는 편이 좋습니다. 실제 vector3d 는 float64를 3개 사용하는 24byte 짜리 struct 입니다만 benchmark 해본 결과 pointer로 사용하는 것보다 value 로 사용하는 것이 명백하게 빠릅니다. 그래서 기존 vector3d 연산을 모두 pointer 에서 value로 바꾸었습니다.