Udostępnij przez


Omówienie kompatybilnych celów renderowania A8

W tym temacie opisano podstawy celu renderowania A8 zgodnego z wymaganiami i przedstawiono przykłady jego użycia.

Zgodny obiekt docelowy renderowania A8 jest zgodnym obiektem docelowym renderowania (ID2D1BitmapRenderTarget), który używa formatu pikseli A8 (DXGI_FORMAT_A8_UNORM). Można użyć zgodnego celu renderowania A8, aby poprawić wydajność aplikacji i zapewnić płynne przejścia podczas animowania tekstu. Zgodny cel renderowania A8 jest szczególnie przydatny, gdy próbujesz poprawić następujące aspekty.

  • Szybkość klatek aplikacji, która renderuje tekst lub geometrię antyaliasowaną, zawierającą tylko proste animacje, takie jak przesunięcie, obrót, zmiana rozmiaru lub zmiana koloru.

  • Wizualna ciągłość aplikacji, która powiększa i zmniejsza tekst podczas animacji.

Aby utworzyć zgodny cel renderowania A8, użyj metody ID2D1RenderTarget::CreateCompatibleRenderTarget wraz z formatem pikseli DXGI_FORMAT_A8_UNORM, aby określić zwrócony zgodny cel renderowania. Aby uzyskać więcej informacji na temat formatów pikseli, zobacz Obsługiwane formaty pikseli i tryby alfa.

Aby na przykład efektywnie animować tekst wyświetlany na poniższym zrzucie ekranu, użyj zgodnego elementu docelowego renderowania A8, aby buforować tekst jako maskę nieprzezroczystości. Następnie zastosuj przekształcenia do maski nieprzezroczystości, aby uzyskać szybkie wyniki renderowania.

zrzut ekranu przedstawiający tekst do animowania

Poniższy kod pokazuje, jak to zrobić. Tworzy on zgodny element docelowy renderowania A8, pobiera z niego mapę bitową, a następnie renderuje mapę bitową przy użyciu funkcji FillOpacityMask.

ID2D1BitmapRenderTarget *m_pOpacityRT;

// Create the compatible render target using desiredPixelSize to avoid
// blurriness issues caused by a fractional-pixel desiredSize.

D2D1_PIXEL_FORMAT alphaOnlyFormat = D2D1::PixelFormat(
    DXGI_FORMAT_A8_UNORM, 
    D2D1_ALPHA_MODE_PREMULTIPLIED);

hr = m_pRT->CreateCompatibleRenderTarget(
    NULL,
    &maskPixelSize,
    &alphaOnlyFormat,
    D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE,
    &m_pOpacityRT
    );

D2D1_RECT_F destinationRect = D2D1::RectF(
    roundedOffset.x,
    roundedOffset.y,
    roundedOffset.x + opacityRTSize.width,
    roundedOffset.y + opacityRTSize.height
    );

ID2D1Bitmap *pBitmap = NULL;
m_pOpacityRT->GetBitmap(&pBitmap);

pBitmap->GetDpi(&dpiX, &dpiY);

// The antialias mode must be set to D2D1_ANTIALIAS_MODE_ALIASED
// for this method to succeed. We've set this mode already though
// so no need to do it again.

m_pRT->FillOpacityMask(
    pBitmap,
    m_pBlackBrush,
    D2D1_OPACITY_MASK_CONTENT_TEXT_NATURAL,
    &destinationRect
    );

pBitmap->Release();

Odniesienie do Direct2D