본문 바로가기

게임개발

[Winform] 개발 일기 - 밸런싱을 위한 시뮬레이터 제작기

http://gacha.fromepsilon.com 로 웹 버전 가챠뽑기시뮬레이터를 만들기도 했었고,

현재 만드는 게임에 넣으려고 한 것은 아닌데 친구의 의뢰도 있었으며

윈폼과 비동기 프로그래밍을 시험해 볼 흥미로운 소재가 되어 제작해보았다.

최초 개발은 python과 pyQt로 만들었지만 쓸데없이 커다란 용량과 실행시 매우 느린 관계로 버렸다.

역시 윈폼은 vs로 만들어야 최고이다.

비동기 Observable을 활용해 반복을 비동기적으로 구현하였고

DatagridView, Combobox, OpenfileDialog, SavefileDialog, Progressbar, Button, label 등 다양한 윈폼의 양식을 사용하였다.

이 중에서 가장 애먹은 것은 Excel파일과 DatagridView를 다루는 것이 었는데 파이썬의 pandas가 진짜 잘만들었구나 새삼 느꼈다.

처음엔 Microsoft.Office.Interop.Excel를 사용해봤지만 너무 느리고 심지어 close를 해줘도 Excel프로그램이 죽지 않고 살아있는 끔찍한 상태였다. 여기다 더해서 DataTable 객체를 별도로 만들어서 넣어야 하는데 영 별로였다.

그래서 찾은 대안이 ExcelDataReader. 얘도 그닥 만족스럽진 않지만 그나마 빠르고 깔끔하게 사용 가능하다. 게다가 객체를 또 만들어서 그걸 다시 넣느니 (+넣을 때 기존 데이터가 있으면 복잡해진다.) DatagridView 자체로 해결되면 훨씬 좋지 않은가. Linq를 적절히 쓰면 데이터 불러올 때 그나마 좀 괜찮은 것 같다.

그리고 DatagridView의 행과 열에 접근하는 방식이 너무 비직관적이라 이부분도 상당히 애먹었다. 일단 원하는 행이나 열의 위치에 접근하는 것 부터 유효성 체크하는 것도 난관이었다.

파이썬 pandas에서는 깔끔하게 처리되는 부분이 위 2개를 콜라보하면서 반복문 떡칠이 되는 것은 만족스럽지 않았지만 어찌어찌 잘 된 듯.

그 다음 나의 소중한 시간을 2시간이나 뺏어간 onefile 빌드. 구글링해서 나온 것들로 별 짓을 다했지만 잘 안돼서 찾아보니 Fody와 Costura.Fody라는 아름다운 녀석이 있었다. 패키지 설치하고 빌드하니 바로 1개의 파일로 잘 작동.

역시 라이브러리는 위대하다.

(허무한 것은 .Net이나 .Net Core로 개발할 경우 단일 실행 파일로 만들기가 훨씬 간단하다. 프로젝트 창에서 프로젝트를 우클릭하여 게시 버튼을 누르고 설정에 들어가면 단일 실행파일로 만들 수 있는 옵션이 있다.)

그리고 Observable이 모두 완료되는 것을 체크하는 부분. 이건 아직도 정석적인 방법은 찾지 못했다. 그냥 만든 수를 기록해서 complete될 때 마다 +1을 하고 비교하여 같으면 최종 완료 때 해야할 작업을 complete안에 넣어줬다. 이건 아무리 찾아도 안나와서 과연 다른 사람들은 어떻게하는지 궁금하다.
BackgroundWorker라는 것이 있긴한데 task를 넣어놓고 한 번에 동작해서 완료시 알림을 받는 것으로 보인다. (레퍼런스 북의 스레드 파트를 읽어보니 task 클래스가 잘 나오면서 사용하지 않게 된 기능이다.)

마지막으로 비동기 구현이 상당히 까다로웠는데 크로스 스레드를 잡아내기 위해 정적 오브젝트를 이용한 스레드 Lock, 윈폼 컴포넌트에 접근할 땐 Invoke를 적절히 잘 썼다. 자신의 스레드가 만들지 않은 인스턴스에 접근하는 것은 가능은 하지만 문제가 생길 여지가 많으므로(실제로 동시에 호출하면서 터지기도 했다.) Invoke를 쓰게 된다.

현 버전 0.21v인데 친구가 원하는 기능을 더 많이 추가해서 1.00v가 되면 오픈소스로 공개할 예정이다.