Bagikan melalui


Gambaran umum target render A8 yang kompatibel

Topik ini menjelaskan dasar-dasar target render A8 yang kompatibel, dan memberikan contoh cara menggunakannya.

Target render A8 yang kompatibel adalah target render yang kompatibel (ID2D1BitmapRenderTarget) yang menggunakan format piksel A8 (DXGI_FORMAT_A8_UNORM). Anda dapat menggunakan target render A8 yang kompatibel untuk meningkatkan performa aplikasi dan memberikan transisi yang lebih lancar selama animasi teks. Target render A8 yang kompatibel sangat berguna ketika Anda mencoba meningkatkan hal berikut:

  • Kecepatan bingkai aplikasi yang merender teks atau geometri anti-alias yang hanya mencakup animasi sederhana, seperti terjemahan, rotasi, skala, atau perubahan warna.

  • Kelangsungan visual aplikasi yang membentang dan mengurangi teks selama animasi.

Untuk membuat target render A8 yang kompatibel, gunakan metode ID2D1RenderTarget::CreateCompatibleRenderTarget bersama dengan format piksel DXGI_FORMAT_A8_UNORM, dan tentukan target render yang kompatibel yang dikembalikan. Untuk informasi selengkapnya tentang format piksel, lihat Format piksel dan mode alfa yang didukung.

Misalnya, untuk menganimasikan teks yang ditampilkan secara efisien dalam cuplikan layar berikut, gunakan target render A8 yang kompatibel untuk menyimpan teks sebagai masker opasitas. Kemudian, terapkan transformasi pada masker opasitas untuk mencapai hasil penyajian yang cepat.

cuplikan layar teks untuk dianimasikan

Kode berikut menunjukkan cara melakukannya. Ini membuat target render A8 yang kompatibel, mengambil bitmap darinya, lalu merender bitmap dengan menggunakan 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();

Referensi Direct2D