Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano, jak używać Direct2D realizacji geometrii, aby poprawić wydajność renderowania geometrii Twojej aplikacji w określonych sytuacjach.
Zawiera on następujące sekcje:
- Czym są realizacje geometrii?
- Dlaczego warto korzystać z realizacji geometrii?
- Kiedy używać zastosowań geometrii
- Tworzenie realizacji geometrycznych
- realizacje geometrii rysunkowej
- Skalowanie realizacji geometrycznych
- Tematy pokrewne
Co to są realizacje geometrii?
Realizacje geometrii, wprowadzone w systemie Windows 8.1, to nowy rodzaj prymitywu rysunkowego, który umożliwia aplikacjom Direct2D łatwiejszą poprawę wydajności renderowania geometrii w niektórych przypadkach. Realizacja geometrii jest reprezentowana przez interfejs ID2D1GeometryRealization.
Dlaczego używać realizacji geometrii?
Gdy Direct2D renderuje obiekt ID2D1Geometry, musi przekonwertować tę geometrię na formę, którą sprzęt graficzny rozumie przez proces nazywany tessellation. Zazwyczaj funkcja Direct2D musi tesselować geometrię dla każdej klatki, która jest rysowana, nawet jeśli geometria się nie zmienia. Jeśli aplikacja renderuje tę samą geometrię w każdej klatce, powtarzająca się ponowna teselacja to zmarnowany wysiłek obliczeniowy. Jest bardziej wydajne obliczeniowo buforowanie tesselacji, a nawet pełnej rasteryzacji, geometrii i rysowanie tej buforowanej reprezentacji w każdej klatce zamiast wielokrotnego przetessalowując.
Typowym sposobem rozwiązania tego problemu przez deweloperów jest buforowanie pełnej rasteryzacji geometrii. W szczególności często tworzy się nową mapę bitową, rasteryzuje geometrię do tej mapy, a następnie rysuje ją na scenę zgodnie z potrzebami. (To podejście zostało opisane w sekcji Renderowanie geometrii w temacie Zwiększanie wydajności aplikacji Direct2D). Chociaż takie podejście jest bardzo wydajne obliczeniowo, ma pewne wady:
- Buforowana mapa bitowa jest wrażliwa na zmiany w transformacji zastosowanej do sceny. Na przykład skalowanie rasteryzacji może spowodować zauważalne artefakty skalowania. Łagodzenie tych artefaktów przy użyciu algorytmów skalowania wysokiej jakości może być kosztowne obliczeniowo.
- Buforowana mapa bitowa zużywa znaczną ilość pamięci, zwłaszcza jeśli jest rasteryzowana w wysokiej rozdzielczości.
Realizacje geometrii stanowią alternatywny sposób pamięciowania geometrii, który pozwala uniknąć powyższych wad. Reprezentacja geometrii nie jest realizowana za pomocą pikseli (jak ma to miejsce w przypadku pełnej rasteryzacji), lecz przez punkty na płaszczyźnie matematycznej. Z tego powodu są one mniej wrażliwe niż pełne rasteryzacji do skalowania i innych manipulacji i zużywają znacznie mniej pamięci.
Kiedy używać zastosowań geometrii
Rozważ użycie realizacji geometrii, gdy aplikacja renderuje złożone geometrie, których kształty zmieniają się rzadko, ale które mogą podlegać zmianom.
Rozważmy na przykład aplikację mapowania, która pokazuje mapę statyczną, ale która umożliwia użytkownikowi powiększanie i zmniejszanie. Ta aplikacja może korzystać z realizacji geometrii. Ponieważ renderowane geometrie pozostają statyczne, warto je buforować w celu zapisania pracy tessellacji. Jednak ponieważ mapy są skalowane, gdy użytkownik powiększa, buforowanie pełnej rasteryzacji nie jest idealne ze względu na artefakty powstałe podczas skalowania. Buforowanie realizacji geometrii pozwoliłoby aplikacji uniknąć konieczności ponownej teselacji, jednocześnie zachowując wysoką jakość wizualną podczas skalowania.
Z drugiej strony należy wziąć pod uwagę aplikację kaleidoscope z animowaną geometrią, która stale się zmienia. Ta aplikacja prawdopodobnie nie skorzystałaby z zastosowania realizacji geometrycznych. Ponieważ same kształty zmieniają się z ramki na ramkę, nie przydaje się buforowanie ich tessellacji. Najlepszym rozwiązaniem dla tej aplikacji jest bezpośrednie rysowanie obiektów ID2D1Geometry.
Tworzenie realizacji geometrii
Obiekt ID2D1GeometryRealization musi zostać utworzony na podstawie istniejącego obiektu ID2D1Geometry. Aby utworzyć realizację geometrii, wywołaj metodę CreateFilledGeometryRealization lub metodę CreateStrokedGeometryRealization i przekaż ID2D1Geometry do zrealizowania.
- CreateFilledGeometryRealization tworzy realizację wnętrza kształtu: region, który zostanie narysowany przez wywołanie FillGeometry.
- CreateStrokedGeometryRealization tworzy realizację obrysu kształtu: obszar, który będzie narysowany poprzez wywołanie DrawGeometry.
Oba rodzaje realizacji geometrii są reprezentowane przez interfejs ID2D1GeometryRealization.
Podczas tworzenia realizacji geometrii Direct2D musi spłaszczyć wszelkie krzywe w podanej geometrii do postaci przybliżeń wielokątnych. Należy podać parametr tolerancji spłaszczania dla metody tworzenia — określa maksymalną odległość w pikselach niezależnych od urządzenia (DIPs) między prawdziwą krzywą geometrii a przybliżeniem wielokątnym. Im niższa tolerancja spłaszczania, tym wyższa jest wierność wynikowego obiektu realizacji geometrii. Podobnie zapewnienie wyższej tolerancji spłaszczania daje realizację geometrii o niższej wierności. Należy pamiętać, że realizacja geometrii o wyższej wierności jest droższa niż te o niższej wierności, ale można je skalować dalej przed wprowadzeniem widocznych artefaktów. Aby uzyskać wskazówki dotyczące używania tolerancji spłaszczania, zobacz Skalowanie realizacji geometrii poniżej.
Uwaga
Obiekty realizacji geometrii są skojarzone z konkretnym urządzeniem graficznym: są zasobami zależnymi od urządzenia.
Rysowanie realizacji geometrycznych
Realizacja geometrii rysunku jest podobna do rysowania innych direct2D pierwotnych, takich jak mapy bitowe. W tym celu wywołaj metodę DrawGeometryRealization i przekaż obiekt realizacji geometrii, który ma zostać narysowany, oraz pędzel, który ma być użyty. Podobnie jak w przypadku innych metod rysowania Direct2D, należy wywołać DrawGeometryRealization między wywołaniami BeginDraw i EndDraw.
Skalowanie realizacji geometrii
Realizacja geometrii, podobnie jak inne Direct2D prymitywy, uwzględnia przekształcenia ustawione w kontekście urządzenia. Chociaż przekształcenia translacji i obrotu nie mają wpływu na jakość wizualną wizualizacji geometrii, przekształcenia skalowania mogą tworzyć artefakty wizualne.
W szczególności zastosowanie wystarczająco dużej skali do każdej realizacji geometrii może ujawnić wielokątne przybliżenie prawdziwych krzywych. Na ilustracji pokazano parę realizacji geometrii eliptycznej (wypełnienie i kontur), które zostały zbyt mocno powiększone. Artefakty spłaszczania krzywej są widoczne.
Aplikacje wrażliwe na jakość wizualizacji powinny podjąć środki w celu zapewnienia, że tak się nie stanie. Sposób obsługi skalowania zależy od potrzeb aplikacji. Poniżej przedstawiono kilka zalecanych metod dla kilku różnych typów aplikacji.
Korzystanie z realizacji geometrii w aplikacjach, które nie są skalowane
Jeśli aplikacja nie wykonuje skalowania na realizacjach geometrii, można bezpiecznie utworzyć realizacje tylko raz przy użyciu jednej tolerancji spłaszczania. (Przekształcenia bez skalowania nie wpływają na jakość wizualną realizacji renderowanej geometrii.) Użyj funkcji ComputeFlatteningTolerance, aby obliczyć odpowiednią tolerancję spłaszczania dla DPI:
float dpiX, dpiY;
deviceContext->GetDpi(&dpiX, &dpiY);
float flatteningTolerance = D2D1::ComputeFlatteningTolerance(
D2D1::Matrix3x2F::Identity(), // apply no additional scaling transform
dpiX, // horizontal DPI
dpiY // vertical DPI
);
Korzystanie z realizacji geometrii w aplikacjach, które skaluje się w niewielkim stopniu
Jeśli Twoja aplikacja jest w stanie tylko nieznacznie skalować realizację geometrii (na przykład do 2x lub 3x), wówczas odpowiednie może być zwykłe utworzenie realizacji geometrii przy proporcjonalnie niższej tolerancji spłaszczania niż domyślna. Powoduje to utworzenie bardziej szczegółowej realizacji, którą można znacznie zwiększyć, zanim pojawią się efekty uboczne skalowania; kompromis polega na tym, że tworzenie realizacji o wyższej wierności wymaga więcej pracy.
Załóżmy na przykład, że wiesz, że aplikacja nigdy nie będzie skalować realizacji geometrii o więcej niż 2 razy. Aplikacja może utworzyć realizację geometrii przy użyciu tolerancji spłaszczania, która jest o połowę mniejsza od wartości domyślnej, i po prostu skalować realizację zgodnie z potrzebami, do 2-krotności. Użyj funkcji ComputeFlatteningTolerance, aby obliczyć odpowiednią tolerancję spłaszczania, przekazując wartość 2.0 jako parametr maxZoomFactor:
float dpiX, dpiY;
deviceContext->GetDpi(&dpiX, &dpiY);
float flatteningTolerance = D2D1::ComputeFlatteningTolerance(
D2D1::Matrix3x2F::Identity(), // apply no additional scaling transform
dpiX, // horizontal DPI
dpiY, // vertical DPI
2.0f // realization can be scaled by an additional 2x
);
Korzystanie z implementacji geometrii w aplikacjach, które podlegają znacznemu skalowaniu
Jeśli aplikacja może skalować realizację geometrii w górę lub w dół o znaczne wartości (na przykład o 10x lub więcej), to prawidłowe zarządzanie skalowaniem jest bardziej skomplikowane.
W przypadku większości tych aplikacji zalecane jest ponowne utworzenie realizacji geometrii przy stopniowo niższych tolerancjach spłaszczania w miarę skalowania sceny w górę, aby zachować wierność wizualną i uniknąć skalowania artefaktów. Podobnie, gdy scena jest skalowana w dół, aplikacja powinna odtworzyć realizację geometrii przy stopniowo wyższych tolerancjach spłaszczania, aby uniknąć marnotrawnego renderowania szczegółów, które nie są widoczne. Aplikacja nie powinna tworzyć realizacji geometrii od nowa za każdym razem, gdy zmienia się skala, ponieważ w ten sposób niweczy to cel buforowania pracy związanej z teselacją. Zamiast tego aplikacja powinna odtworzyć realizację geometrii rzadziej: na przykład po każdym 2-krotnym wzroście lub zmniejszeniu skali.
Za każdym razem, gdy skala zmienia się w aplikacji w odpowiedzi na interakcję użytkownika, aplikacja może porównać nową skalę ze skalą, na której ostatnio utworzono odwzorowania geometrii (na przykład w składowej m_lastScale). Jeśli dwie wartości są bliskie (w tym przypadku w ramach współczynnika 2), nie zostanie podjęta żadna dalsza akcja. Jeśli jednak dwie wartości nie są bliskie, realizacje geometrii zostaną ponownie utworzone. Funkcja ComputeFlatteningTolerance służy do obliczania spłaszczającej tolerancji odpowiedniej dla nowej skali, a m_lastScale jest aktualizowana do nowej skali.
Ponadto aplikacja zawsze tworzy realizację przy użyciu mniejszej tolerancji niż zwykle stosowana dla nowej skali, poprzez przekazanie wartości 2 jako parametr maxZoomFactor do ComputeFlatteningTolerance. Umożliwia to skalowanie nowych realizacji geometrii w górę przez dodatkowy czynnik 2 bez powstawania artefaktów skalowania.
Notatka
Opisane tutaj podejście może nie być odpowiednie dla wszystkich aplikacji. Jeśli na przykład aplikacja umożliwia szybkie skalowanie sceny przez bardzo duże czynniki (na przykład jeśli zawiera suwak "powiększenie", który można przenieść z 100% do 100 000 000% w zakresie kilku ramek), takie podejście może spowodować nadmiarową pracę poprzez odtworzenie realizacji geometrii w każdej ramce. Alternatywnym podejściem jest odtworzenie struktur geometrycznych dopiero po każdej manipulacji skalą sceny (na przykład po zakończeniu gestu uszczypnięcia przez użytkownika).
Tematy pokrewne
Zwiększanie wydajności aplikacji Direct2D
Ogólne wskazówki dotyczące renderowania złożonej zawartości statycznej