Omówienie zasobów
Zasób Direct2D jest obiektem używanym do rysowania i jest reprezentowany przez interfejs Direct2D, taki jak ID2D1Geometry lub ID2D1RenderTarget. W tym temacie opisano rodzaje zasobów Direct2D i sposób ich udostępniania.
Ten temat zawiera następujące sekcje:
- informacje o zasobach Direct2D
- Device-Independent zasoby
- Device-Dependent zasoby
- udostępnianie zasobów fabryki
- Udostępnianie zasobów renderowania docelowych
Wiele interfejsów API 2D przyspieszanych sprzętowo jest zaprojektowanych w oparciu o model zasobów skoncentrowany na procesorze CPU i zestaw operacji renderowania, które działają dobrze na procesorach CPU. Następnie część interfejsu API jest przyspieszona sprzętowo. Zaimplementowanie interfejsów API wymaga menedżera zasobów do mapowania zasobów CPU na zasoby GPU. Ze względu na ograniczenia procesora GPU niektóre operacje mogą nie być przyspieszone w każdej sytuacji. W takich przypadkach menedżer zasobów musi komunikować się w obie strony między CPU i GPU (co jest kosztowne), aby umożliwić przejście na renderowanie CPU. W niektórych przypadkach może to spowodować, że renderowanie wymusi całkowity powrót do CPU. Ponadto operacje renderowania, które wydają się proste, mogą wymagać tymczasowych pośrednich kroków renderowania, które nie są widoczne w interfejsie API i które wymagają dodatkowych zasobów procesora GPU.
Funkcja Direct2D zapewnia bardziej bezpośrednie mapowanie w celu pełnego wykorzystania procesora GPU. Udostępnia ona dwie kategorie zasobów: niezależne od urządzenia i zależne od urządzenia.
- Zasoby niezależne od urządzenia, takie jak ID2D1Geometry, są przechowywane na procesorze CPU.
- Zasoby zależne od urządzenia, takie jak ID2D1RenderTarget i ID2D1LinearGradientBrush, są bezpośrednio mapowane na zasoby GPU (gdy jest dostępne przyspieszenie sprzętowe). Operacje renderowania są wykonywane przez połączenie informacji o wierzchołkach i pokryciach z geometrii z informacjami dotyczącymi teksturowania generowanymi przez zasoby zależne od urządzenia.
Podczas tworzenia zasobów zależnych od urządzenia zasoby systemowe (procesor GPU, jeśli jest dostępny lub procesor CPU) są przydzielane podczas tworzenia urządzenia i nie zmieniają się z jednej operacji renderowania na inną. Taka sytuacja eliminuje konieczność korzystania z menedżera zasobów. Oprócz ogólnych ulepszeń wydajności oferowanych przez eliminację menedżera zasobów ten model umożliwia bezpośrednie sterowanie dowolnym renderowaniem pośrednim.
Ponieważ direct2D zapewnia tyle kontroli nad zasobami, musisz zrozumieć różne rodzaje zasobów i kiedy można ich używać razem.
Zgodnie z opisem w poprzedniej sekcji zasoby niezależne od urządzenia zawsze znajdują się na procesorze CPU i nigdy nie są skojarzone z urządzeniem renderowania sprzętowego. Poniżej przedstawiono zasoby niezależne od urządzeń:
- ID2D1DrawingStateBlock
- ID2D1Factory
- ID2D1Geometry i interfejsy dziedziczone z niego.
- ID2D1GeometrySink i ID2D1SimplifiedGeometrySink
- ID2D1StrokeStyle
Aby utworzyć zasoby niezależne od urządzenia, użyj ID2D1Factory, który sam w sobie jest zasobem niezależnym od urządzenia. (Aby utworzyć fabrykę, użyj funkcji CreateFactory).
Z wyjątkiem celów renderowania, wszystkie zasoby utworzone przez fabrykę są niezależne od urządzeń. Element docelowy renderowania jest zasobem zależnym od urządzenia.
Każdy zasób, który nie ma nazwy na poprzedniej liście, jest zasobem zależnym od urządzenia. Zasoby zależne od urządzenia są skojarzone z konkretnym urządzeniem renderowania. Gdy jest dostępne przyspieszanie sprzętowe, to urządzenie jest procesorem GPU. W innych przypadkach jest to procesor.
Aby utworzyć większość zasobów zależnych od urządzenia, użyj elementu docelowego renderowania. W większości przypadków użyj fabryki, aby utworzyć obiekt docelowy renderowania.
Poniżej przedstawiono przykłady zasobów zależnych od urządzenia:
- ID2D1Brush i interfejsy dziedziczone z niego. Użyj elementu docelowego renderowania, aby utworzyć pędzle.
- ID2D1Layer. Użyj elementu docelowego renderowania, aby utworzyć warstwy.
- ID2D1RenderTarget i interfejsy dziedziczone z niego. Aby utworzyć cel renderowania, użyj fabryki lub innego celu renderowania.
Uwaga
Począwszy od systemu Windows 8, istnieją nowe interfejsy, które tworzą zasoby zależne od urządzenia. ID2D1Urządzenia i ID2D1DeviceContext mogą współużytkować zasób, jeśli kontekst urządzenia i zasób są tworzone na podstawie tego samego ID2D1Device.
Zasoby zależne od urządzenia stają się bezużyteczne, gdy skojarzone urządzenia renderowania staną się niedostępne. Oznacza to, że po otrzymaniu błędu D2DERR_RECREATE_TARGET dla elementu docelowego renderowania należy ponownie utworzyć obiekt docelowy renderowania i wszystkie jego zasoby.
Wszystkie zasoby niezależne od urządzenia utworzone przez fabrykę można udostępniać wszystkim innym zasobom (niezależnym od urządzenia lub zależnym od urządzenia) utworzonym przez tę samą fabrykę. Na przykład można użyć dwóch obiektów ID2D1RenderTarget, aby narysować ten sam ID2D1RectangleGeometry, jeśli oba obiekty ID2D1RenderTarget zostały utworzone przez tę samą fabrykę.
Interfejsy zlewowe (ID2D1SimplifiedGeometrySink, ID2D1GeometrySinki ID2D1TessellationSink) mogą być udostępniane z zasobami utworzonymi przez dowolną fabrykę. W przeciwieństwie do innych interfejsów w trybie Direct2D, można użyć dowolnej implementacji interfejsu ujścia. Możesz na przykład użyć własnej implementacji ID2D1SimplifiedGeometrySink.
Możliwość udostępniania zasobów utworzonych przez element docelowy renderowania zależy od rodzaju elementu docelowego renderowania. Podczas tworzenia obiektu docelowego renderowania typu D2D1_RENDER_TARGET_TYPE_DEFAULTzasoby utworzone przez obiekt docelowy renderowania mogą być używane tylko przez ten obiekt docelowy renderowania (chyba że element docelowy renderowania mieści się w jednej z kategorii opisanych w poniższych sekcjach). Dzieje się tak, ponieważ nie wiadomo, z jakiego urządzenia będzie korzystać obiekt docelowy renderowania — może to zakończyć się renderowaniem lokalnego sprzętu, oprogramowania lub sprzętu klienta zdalnego. Można na przykład napisać program, który przestaje działać, gdy jest wyświetlany zdalnie lub gdy obiekt docelowy renderowania jest zwiększany o rozmiar przekraczający maksymalny rozmiar obsługiwany przez sprzęt renderowania.
W poniższych sekcjach opisano okoliczności, w których zasób utworzony przez jeden obiekt docelowy renderowania może być współużytkowany z innym obiektem docelowym renderowania.
Zasoby można udostępniać między dowolnym elementem docelowym renderowania, który jawnie używa sprzętu, o ile tryb zdalny jest kompatybilny. Tryb zdalny ma gwarancję zgodności tylko wtedy, gdy oba obiekty docelowe renderowania używają flagi użycia D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING lub D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, lub gdy żadna z flag nie jest określona. Te ustawienia gwarantują, że zasoby będą zawsze znajdować się na tym samym komputerze. Aby określić tryb użycia, ustaw pole użycia struktury D2D1_RENDER_TARGET_PROPERTIES użytej do utworzenia celu renderowania za pomocą jednej lub więcej flag D2D1_RENDER_TARGET_USAGE.
Aby utworzyć cel renderowania, który jawnie używa renderowania sprzętowego, ustaw pole typu struktury D2D1_RENDER_TARGET_PROPERTIES, z której korzystasz do utworzenia celu renderowania, na typ D2D1_RENDER_TARGET_TYPE_HARDWARE.
Możesz udostępniać zasoby utworzone przez obiekt docelowy renderowania powierzchni DXGI z dowolnym innym obiektem renderowania powierzchni DXGI, który korzysta z tego samego bazowego urządzenia Direct3D.
Zasoby można udostępniać między celem renderowania a zgodnymi celami renderowania utworzonymi przez ten cel renderowania. Aby utworzyć zgodny obiekt docelowy renderowania, użyj metody ID2D1RenderTarget::CreateCompatibleRenderTarget.
Możesz użyć metody ID2D1RenderTarget::CreateSharedBitmap, aby utworzyć ID2D1Bitmap, które mogą być współużytkowane między dwoma obiektami docelowymi renderowania określonymi w wywołaniu metody, jeśli metoda powiedzie się. Ta metoda powiedzie się tak długo, jak dwa obiekty docelowe renderowania używają tego samego bazowego urządzenia do renderowania.