Поделиться через


Общие сведения о целевых объектах визуализации, совместимых с 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();

Справочник по Direct2D