Visão geral dos destinos de renderização A8 compatíveis
Este tópico descreve as noções básicas de um destino de renderização A8 compatível e fornece exemplos de como usá-lo.
Um destino de renderização A8 compatível é um destino de renderização compatível (ID2D1BitmapRenderTarget) que usa um formato de pixel A8 (DXGI_FORMAT_A8_UNORM). Você pode usar um destino de renderização A8 compatível para melhorar o desempenho do aplicativo e fornecer transições mais suaves durante a animação de texto. Um destino de renderização A8 compatível é particularmente útil quando você tenta melhorar o seguinte:
A taxa de quadros do aplicativo que renderiza texto ou geometria sem serrilhado que inclui apenas animações simples, como tradução, rotação, escala ou alterações de cor.
A continuidade visual do aplicativo que estica e diminui o texto durante uma animação.
Para criar um destino de renderização A8 compatível, use o método ID2D1RenderTarget::CreateCompatibleRenderTarget junto com o formato de pixel DXGI_FORMAT_A8_UNORM e especifique um destino de renderização compatível retornado. Para obter mais informações sobre formatos de pixel, consulte Formatos de pixel com suporte e modos alfa.
Por exemplo, para animar eficientemente o texto mostrado na captura de tela a seguir, use um destino de renderização A8 compatível para armazenar o texto em cache como uma máscara de opacidade. Em seguida, aplique transformações à máscara de opacidade para obter resultados de renderização rápidos.
O código a seguir mostra como fazer isso. Ele cria um destino de renderização A8 compatível, recupera o bitmap dele e, em seguida, renderiza o bitmap usando 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();