LayerPage를 추가하려고 합니다. MVVM 구조이므로 Views에 LayerPage(Page)를 ViewModels에 LayerViewModel(ObservableRecipient 상속)을 각각 추가합니다. ViewModel을 당장에 쓰지는 않겠지만, 일단 구조에 맞게 추가해봅시다.
아직 WinUI 3용 CanvasAnimatedControl를 지원하지 않아 canvas.Invalidate()로 Update의 동작을 대신했습니다. 비교해 보니 CanvasAnimatedControl가 훨씬 빠르게 동작은 하네요. 아무래도 CanvasAnimatedControl은 모니터에 맞는 최적의 FPS로 Draw를 해줄 것 같고 canvas.Invalidate()는 메시지 큐에 의해 업데이트를 할 것이므로, 그런 차이가 생기는 것 같습니다.
목표의 절반 정도를 WinUI 3 용으로 변환하면서 느낀 점은, UWP용 Win2D 라이브러리의 대부분의 namespace는 그대로 유지되어 대체로 잘 동작하고, (변환 작업 중 Gradient Mesh Example은 오류를 발생했지만, ) CanvasAnimatedControl은 아마 WinUI 3와의 최적화 문제로 미 적용 된 듯 하며, 이 컨트롤이 추가되는 시점에 CanvasControl의 Invalidate의 성능도 정상화 될 것 같다는 점입니다.
WinUI 3 in Desktop App 형태는 win32로 구동된다는 점 빼고는 UWP의 컨트롤 및 구성을 그대로 계승한 것 처럼 보입니다. 컨트롤의 사용도 WPF의 그것과 같아 어려움은 없었습니다.
아직까지는 WinUI3 에서 Win2D의 활용은 어려운 것으로 보입니다. 사실, 정식 출시전이니까요.
Windows App SDK GitHub를 둘러본 결과, Win2D의 지원은 우선순위에 의해 후순위로 배치되어 있는 듯 합니다. 그리고 WinUI3 역시 Windows App SDK의 구성요소로 포함될 것으로 보이며, 2021년도에는 글쎄요 제가 원하는 수준으로 안정화 될 것 같지는 않네요.
다음의 대안으로 Avalonia UI를 살펴보고 있습니다. Avalonia UI는 오랜 시간 공을 들여 만들어진 WPF과 유사한 프레임워크이면서 클로스 플랫폼으로 윈도, 리눅스, 맥OS에서 동일한 코드로 데스크톱 어플리케이션을 개발할 수 있도록 합니다. 상용 어플리케이션에 적용할 수 있을정도로 안정화 되었으며 Skia를 백엔드 렌더러로 선택할 수 있어서 그리기 퍼포먼스가 인상적인 정도로 빠름을 확인할 수 있었습니다.