Bagikan melalui


Pelaporan Tekanan Memori

Pelaporan tekanan memori memungkinkan aplikasi Direct3D untuk menentukan kapan set kerja memori videonya telah tumbuh terlalu besar.

Tekanan memori adalah permintaan yang ditempatkan pada subsistem memori oleh aplikasi. Meskipun aplikasi Direct3D apa pun dapat menggunakan pelaporan tekanan memori, fitur ini sangat berguna untuk aplikasi yang merender video dengan menggunakan Direct3D. Pemutaran video biasanya mendapat manfaat dari buffering dalam jumlah besar, sehingga bingkai dapat didekode terlebih dahulu. Meskipun buffering umumnya menghasilkan pemutaran yang lebih lancar, itu benar-benar dapat menurunkan performa jika set kerja tumbuh terlalu besar, karena faktor-faktor berikut:

  • Memori mungkin dikeluarkan dari cache. Dalam kasus terburuk, ini dapat terjadi pada setiap bingkai video.
  • Alokasi memori mungkin ditempatkan di segmen memori nonoptimal.

Mulai dari Windows 7, Direct3D dapat melaporkan beberapa statistik tentang tekanan memori video:

  • Jumlah byte yang dikeluarkan oleh proses selama interval waktu.
  • Jumlah memori yang ditempatkan dalam segmen memori nonoptimal.
  • Indikasi kasar dari efisiensi keseluruhan alokasi memori yang ditempatkan dalam memori nonoptimal.

Informasi ini dapat membantu aplikasi untuk mempertahankan set kerja yang wajar.

Menggunakan Pelaporan Tekanan Memori

Pelaporan tekanan memori menggunakan antarmuka IDirect3DQuery9 yang ada untuk mengkueri perangkat. Jenis kueri baru telah ditambahkan ke enumerasi D3DQUERYTYPE .

D3DQUERYTYPE_MEMORYPRESSURE        = 19,

Untuk menggunakan kueri ini, lakukan langkah-langkah berikut:

  1. Panggil IDirect3DDevice9Ex::CreateQuery dengan bendera D3DQUERYTYPE_MEMORYPRESSURE . Metode ini mengembalikan penunjuk ke antarmuka IDirect3DQuery9 .
  2. Panggil IDirect3DQuery9::Issue dengan bendera D3DISSUE_BEGIN untuk memulai interval pengukuran.
  3. Panggil IDirect3DQuery9::Issue dengan bendera D3DISSUE_END .
  4. Panggil IDirect3DQuery9::GetData untuk mendapatkan hasil kueri. Kueri mengembalikan struktur D3DMEMORYPRESSURE .

Contoh Kode

Contoh berikut menunjukkan dua fungsi yang mengukur tekanan memori. Yang pertama memulai interval pengukuran, dan yang kedua mengambil hasil pengukuran.

HRESULT BeginMemoryPressureQuery(
    IDirect3DDevice9Ex *pDevice, 
    IDirect3DQuery9 **ppQuery
    )
{
    HRESULT hr = pDevice->CreateQuery(D3DQUERYTYPE_MEMORYPRESSURE, ppQuery);

    if (SUCCEEDED(hr))
    {
        hr = (*ppQuery)->Issue(D3DISSUE_BEGIN);
        if (FAILED(hr))
        {
            (*ppQuery)->Release();
            *ppQuery = NULL;
        }
    }
    return hr;
}

HRESULT EndMemoryPressureQuery(
    IDirect3DQuery9 *pQuery, 
    D3DMEMORYPRESSURE *pResult
    )
{
    HRESULT hr = pQuery->Issue(D3DISSUE_END);
    if (SUCCEEDED(hr))
    {
        hr = pQuery->GetData(pResult, sizeof(*pResult), D3DGETDATA_FLUSH);
    }
    return hr;
}

API Video Direct3D