글을 읽기 전에 올빼미를 보십시오. 이건 강제 사항입니다.
요번 달 플랜트 정비 일정은 다 끝나기도 했고, 연구할 것이 남아있어 회사에서 코딩을 하고 있습니다. 어찌하다보니 C#을 이용해 GUI를 만들고 있는데 사실 제 분야는 Verilog같은 HDL 이지 이 쪽이 아니였단 말이죠. 뭐 별 수 있나요. 까라는데로 까야죠.
그래서 저는 눈동자와 Tree 대신 스택오버플로우를 켰고 대충 한달 잡아서 Winform에서 WPF까지 대강 끝내버렸습니다. 사실 인스턴트니 뭐니 이런 개념적인 부분은 다 쌩까고 감으로 얘가 뭔 소리를 하는지 알겠다, 코드적으로는 대충 이럴거다 생각했는데 예상대로 대충 얼추 맞아들어가고 역시 제가 생각한 건 양놈들도 다 생각해 놨더라구요. 오오 양갓 오오
문제는 처음에 노트북에만 한정했던 프로그램이 갑자기 태블릿으로 옮겨가면서 발생합니다.
처음엔 Winform으로 짜다가 그 쪽에 사용된 FPGA 관련 클래스, 기타 수학적인 연산들을 코드로 구현해놓은 클래스를 들고 WPF로 옮겨가서 MVVM으로 그럴싸한 GUI 만들었습니다. 둘 다 노트북에서는 큰 문제가 없었습니다. CPU 점유율도 비슷하게 먹고 WPF쪽이 메모리를 살짝 더 먹긴 했지만(100mb) 큰 문제는 아니였으니까요.
근데 이걸 태블릿에 옮겨서 써보니까 둘 다 동작은 하지만 WPF 쪽은 GUI쪽에 심각한 랙이 걸리는 겁니다. 그냥 쓰면 상관이 없는데 비동기 처리를 위해 스레드를 부를 때 마다 이 부분은 매우 두드러지게 나타납니다. Winform, WPF에서 쓰이는 클래스도 똑같고, 다중 스레드가 행하는 코드적인 틀 자체도 똑같은데 왜 이런 현상이 일어나는지 모르겠네요.
하드웨어의 성능 탓이다라고 변명할 수 있지만 요즘 모바일 게임봐도 돈먹는 슬롯머신 주제에 그래픽은 꽤 빠방하게 잘 나오잖아요? 정작 Visual Studio도 WPF로 만들어졌구요. 근데 코드의 최적화 탓을 하면 그와 같은 클래스를 공유하고 틀도 똑같은 WinForm이 제대로 돌아가는게 설명이 안됩니다. 그리고 WPF쪽에서 리소스를 최적화해보았지만 딱히 나아지는 건 없었습니다. 예를 들면 2차원 관련 연산의 횟수를 줄여보던가, 카메라의 해상도를 낮춰보던가... 다 소용이 없었습니다. 게다가 실시간 그래프 갱신같은 부분은 제가 손 댈 수 있는 쪽이 아니니까 제가 할 수 있는건 제 코드를 손 보는 정도 밖에 없었네요.
요는, 하드웨어의 성능도 문제고, 소프트웨어의 성능도 문제라고 결론 지었습니다. 교수보다 위대한 구글을 좀 뒤져보니 WPF에 대한 성능 이슈는 오래전 부터 뜨거운 감자고 UWP도 왜 이 모양이냐란 소리도 나오더군요. 이걸 보면 Xamarin으로 크로스 플랫폼을 만들어도 딱히 기대는 안되겠네요. 결국 하드웨어건 소프트웨어건 성능적인 부분이 최적화가 되지 않는다면 모바일은 뭘 해도 모바일이란 한계를 못 벗어 날 것 같네요.
* 찾아보니 이런 글도 있군요.
https://www.sysnet.pe.kr/Default.aspx?mode=3&sub=0&detail=1&wid=4807