2012-04-20 2 views
5

C#에서 GDI +를 사용하여 작은 사각형 (약 1 백만)을 많이 그리는 응용 프로그램이 있는데 성능이 너무 좋지 않습니다. Graphis.FillRectangle에 전달하기 위해 많은 수의 Rectangle 개체를 생성하는 데는 다소 시간이 걸린다는 것을 알고 있습니다. 또한 Rectangle이 불변으로 설계 되었기 때문에 Rectangle이 프레임에서 프레임으로 변경되면이를 피할 수 없다는 것을 이해합니다. 따라서 내 질문은 : Rectangle을 모두 볼 수 있다고 가정해야한다는 것을 제외하고는이 도면 호출의 성능을 향상시킬 수있는 가능성이 있습니까? 당신은, 당신이 다른 브러쉬 등을 필요로하기 때문에 그것이 당신을 위해 작동하지 않는 경우GDI +에서 직사각형을 많이 그리기

FillRectangles(Brush brush, Rectangle[] rects); 

: 사전에

감사합니다, 크리스토프

+0

인스턴스화 사각형은 실제 API 호출에 비해 거의 시간이 걸리지 않습니다. 사실, Rectangle은 구조체입니다. – usr

+0

1,000 또는 1 백만을 의미합니까? –

+0

거의 확실하게 더 좋은 방법이 있습니다. 직사각형은 무엇을 나타 냅니까? 뭐 그릴거야? –

답변

9

난 당신이 대신 호출의 배열 변형을 사용하는 것이 좋습니다 상태 (브러시)로 프리미티브를 그룹화하고 배열을 각각 한 번에 그려야합니다. 빠른 테스트를 통해 성능의 최소 세 배 이상을 보여줍니다. 즉, 한 번에 그려지는 1M 직사각형만큼 고르지 못한 느낌의 개별적으로 그린 ​​300K 직사각형입니다.

+1

에 대해 읽어야합니다. 정말 빠른 속도입니다. – Christoph

+0

FillRectangles는 너무 느립니다. 더 빠른 것이있어? 안드로이드는 운영체제에 2 차원 가속도를 밀어 넣었습니다. 왜냐하면 개발자가 아니라면 직사각형을 채우는 속도가 빨라지 죠. 창문에는 가속이없고, 성능이 떨어지는 앱이 남아 있습니다. 2050 년쯤에 PC 하드웨어가 FillRectangles 기능을 위해 충분히 빠르지 만 걱정하지 않아도됩니다. 나는 참을성있게 기다리고있을 것이다. – hamish

+0

dotTrace 사용 2017 하드웨어를 사용해도 성능이 떨어지는 모든 기능을 볼 수 있습니다. 여전히 다음과 같이 수행됩니다. FillRectangles, DrawImageUnscaled (GDIPdrawImageI), DrawImage (GdipDrawImageRect) – hamish

관련 문제