WPF 최대 100만개 객체 그릴때 문의 입니다.

안녕하세요.

이번에 한 화면에 사각형이나 선 같은 객체들을 최대 100만개 정도 까지 그리고, 조건에 따라 이동하는 화면을 하나 만들어야 하는데 …

생각이상으로 버벅이는 상황이라… 혹시 좋은 방법이 없을까 고수님들께 지혜를 구하고자 글을 씁니다.

감사합니다.

1개의 좋아요

한 화면에 객체가 모두 다 보이는 건가요?

사람 눈에 보이지 않은 스크린 범위 밖 영역은

위치 정보만 갖고 있고 실제 뷰 포트 영역에 보여질때 그리는것이 좋습니다.

반대로 뷰 포트 영역에 벗어 나는 객체는 제거 하거나,
기존에 이미 생성 되었던 객체를 활용하여 데이터만 교체 하는 방법으로요 (리사이클러 라 합니다.)

UI가상화 키워드로 검색 해보시는것을 추천드립니다.

5개의 좋아요

줌인 줌아웃 기능이 있어서 한 화면에 다 보여주는 것이랑 같을 것 같긴 합니다.

zoom level로 해서 객체 수 조절을 해볼려고 했는데 그건 대표님이 부정적일 꺼라는 말이 있어서…

UI가상화 찾아보겠습니다 감사합니다.

3개의 좋아요

아., zoom in/out 형식이면

타일맵 형식으로 처리 하는 것이 효과적일 수 있습니다.

그럴려면 우선 객체를 타일로 이미지화 해서
각 Level 별로 타일 사이즈를 들고 있어야 합니다.

zoom in/out 시에 비동기로 level에 맞는 타일을 로드해서 표현 하구요.

화면 이동은 위에서 제가 말한 UI가상화로 처리하구요.
(항상 말로는 구현은 쉽죠 ㅎㅎ)

타일 맵 관련 라이브러리를 도입해서 사용하시면 의외로 쉽게 구현 가능해서 금방 해결하 실 수 도 있습니다.

5개의 좋아요

저라면 directx or direct2d 호스팅 할 것 같네요
https://www.google.com/search?q=hosting+direct3d+in+wpf

2개의 좋아요

사실 비슷한 고민들이 있는데, 혹시 훌륭한 아이디어로 해당 문제를 해결하셨다면, 글로 남겨주시기를 부탁드립니다.

1개의 좋아요

WPF에서 객체를 어떤 방식으로 그리시나요? 만약 Canvas의 자식으로 그릴 객체를 넣어서 보여준다면 100만개는 굉장히 많은양입니다. Canvas의 객체들은 HitTest라던가 객체가 유지될 수 있는 다양한 처리를 하기 때문에 느립니다.

속도 개선을 위한 다음의 방식을 살펴봐주세요.

  1. 클리핑
    @aroooong 님의 의견입니다. 보일 필요가 없는 객체는 그릴 필요도 없는데요, 이것 만으로도 상당한 속도 개선이 될 듯 합니다. (다만 WPF에서 기본적으로 클리핑을 하기 때문에(하는 것으로 알고 있기 때문에)… 어떻게 구현하셨는지는 살펴봐야 할 듯 합니다.

  2. 캐싱
    한번 그리면 다시 그릴 필요가 없는 객체의 경우 하나의 큰 이미지에 그린 후 두번째에는 다시 그리지 않고 그 이미지를 그냥 출력하는 방법입니다. 한번만 그려지면 다시 그릴 필요가 없는 객체가 많을 경우 상당한 속도 개선이 있습니다. 지도 및 지도의 다양한 요소를 이동시킬 때 사용해야 하는 방법입니다.

  3. 무시
    그려야 할 객체가 다른 객체에 완전히 가려질 경우 그리지 않습니다. 사용자가 보는 화면은 최종 그려진 화면이니까요.

1개의 좋아요

비슷한 문제를 고민한적이 있는데요
백만개를 비트맵 이미지 하나에 그려줍니다
비트맵 이미지를 캔버스에 올리고 특정 위치에 사용자가 클릭을 했을때 해당 이미지에 맞는 컨트롤을 생성해서
편집하게 해줍니다
이런식으로 백만개를 하나의 이미지로 보여주고
상호작용 할때만 컨트롤이 튀어 나오게 해서
처리해주면 가능할것 같다고 생각한적이 있습니다

4개의 좋아요