Vue d’ensemble des cibles de rendu A8 compatibles

Cette rubrique décrit les principes de base d’une cible de rendu A8 compatible et fournit des exemples d’utilisation.

Une cible de rendu A8 compatible est une cible de rendu compatible (ID2D1BitmapRenderTarget) qui utilise un format de pixel A8 (DXGI_FORMAT_A8_UNORM). Vous pouvez utiliser une cible de rendu A8 compatible pour améliorer les performances de l’application et fournir des transitions plus arrondies pendant l’animation de texte. Une cible de rendu A8 compatible est particulièrement utile lorsque vous essayez d’améliorer les éléments suivants :

  • Fréquence d’images de l’application qui restitue du texte ou de la géométrie anticrénelée qui inclut uniquement des animations simples, telles que la traduction, la rotation, l’échelle ou les modifications de couleur.

  • Continuité visuelle de l’application qui étire et diminue le texte pendant une animation.

Pour créer une cible de rendu A8 compatible, utilisez la méthode ID2D1RenderTarget::CreateCompatibleRenderTarget avec le format de pixel DXGI_FORMAT_A8_UNORM et spécifiez une cible de rendu compatible retournée. Pour plus d’informations sur les formats de pixels, consultez Les formats de pixel pris en charge et les modes alpha.

Par exemple, pour animer efficacement le texte affiché dans la capture d’écran suivante, utilisez une cible de rendu A8 compatible pour mettre en cache le texte en tant que masque d’opacité. Ensuite, appliquez des transformations au masque d’opacité pour obtenir des résultats de rendu rapides.

capture d’écran du texte à animer

Le code suivant montre comment procéder. Il crée une cible de rendu A8 compatible, récupère l’image bitmap à partir de celle-ci, puis affiche l’image bitmap à l’aide de 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();

Référence Direct2D