Общие сведения о целевых объектах визуализации, совместимых с A8
В этом разделе описываются основы совместимого целевого объекта отрисовки A8 и приведены примеры его использования.
Совместимая цель отрисовки A8 — это совместимый целевой объект отрисовки (ID2D1BitmapRenderTarget), использующий формат пикселя A8 (DXGI_FORMAT_A8_UNORM). Вы можете использовать совместимый целевой объект отрисовки A8 для повышения производительности приложения и обеспечения более плавных переходов во время анимации текста. Совместимый целевой объект отрисовки A8 особенно полезен при попытке улучшить следующее:
Частота кадров приложения, отрисовывающего текст или анти-псевдоним геометрию, которая включает только простые анимации, такие как преобразование, поворот, масштабирование или изменение цвета.
Непрерывность визуального элемента приложения, которое растягивает и уменьшает текст во время анимации.
Чтобы создать совместимый целевой объект отрисовки A8, используйте метод ID2D1RenderTarget::CreateCompatibleRenderTarget вместе с форматом пикселя DXGI_FORMAT_A8_UNORM и укажите возвращаемый совместимый целевой объект отрисовки. Дополнительные сведения о форматах пикселей см. в разделе Поддерживаемые форматы пикселей и альфа-режимы.
Например, чтобы эффективно анимировать текст, отображаемый на следующем снимке экрана, используйте совместимый объект отрисовки A8 для кэширования текста в виде маски непрозрачности. Затем примените преобразования к маске непрозрачности, чтобы обеспечить быстрые результаты отрисовки.
В следующем примере кода показано, как это сделать: Он создает совместимый объект отрисовки A8, извлекает из него растровое изображение, а затем отрисовывает растровое изображение с помощью 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();