Dizin Arabellekleri (Direct3D 9)
IDirect3DIndexBuffer9 arabirimi tarafından temsil edilen dizin arabellekleri, dizin verileri içeren bellek arabellekleridir. Dizin verileri veya dizinler, köşe arabelleklerine yapılan tamsayı uzaklıklarıdır ve IDirect3DDevice9::DrawIndexedPrimitive yöntemi kullanılarak primitifleri işlemek için kullanılır.
Köşe arabelleği köşeler içerir; bu nedenle, dizinli ilkel öğelerle veya dizine alınmadan bir köşe arabelleği çizebilirsiniz. Ancak, bir dizin arabelleği dizinler içerdiği için, karşılık gelen bir tepe nokta arabelleği olmadan bir dizin arabelleği kullanamazsınız. (Yan not olarak IDirect3DDevice9::D rawIndexedPrimitiveUP ve IDirect3DDevice9::D rawPrimitiveUP dizin veya köşe arabelleği olmadan çizen tek çizim yöntemleridir.)
Dizin AraBelleği Açıklaması
Dizin arabelleği, bellekte nerede bulunduğu, okuma ve yazmayı destekleyip desteklemediği ve içerebileceği dizinlerin türü ve sayısı gibi özellikleri açısından açıklanmıştır. Bu özellikler D3DINDEXBUFFER_DESC bir yapıda tutulur.
Dizin arabelleği açıklamaları, uygulamanıza var olan bir arabelleğin nasıl oluşturulduğunu bildirir. Sistemin daha önce oluşturulmuş bir dizin arabelleğinin özellikleriyle doldurulması için boş bir açıklama yapısı sağlarsınız.
- Biçim üyesi, dizin arabellek verilerinin yüzey biçimini açıklar.
- Tür, dizin arabelleğinin kaynak türünü tanımlar.
- Kullanım yapısı üyesi genel yetenek bayrakları içerir. D3DUSAGE_SOFTWAREPROCESSING bayrağı, dizin arabelleğinin yazılım köşe işleme ile kullanılacağını belirtir. kullanımda D3DUSAGE_WRITEONLY bayrağının varlığı, dizin arabelleği belleğinin yalnızca yazma işlemleri için kullanıldığını gösterir. Bu, hızlı işleme ve işlemeyi etkinleştirmek için dizin verilerini en iyi bellek konumuna yerleştirmek için sürücüyü serbest bırakır. D3DUSAGE_WRITEONLY bayrağı kullanılmazsa, sürücünün verileri okuma işlemleri için verimsiz bir konuma yerleştirme olasılığı daha düşüktür. Bu, işleme ve renderleme hızından biraz fedakarlık eder. Bu bayrak belirtilmezse, uygulamaların dizin arabelleğindeki veriler üzerinde okuma ve yazma işlemleri gerçekleştirdiği varsayılır.
- Havuz, indeks arabelleği için ayrılan bellek sınıfını belirtir. D3DPOOL_SYSTEMMEM bayrağı, sistemin sistem belleğinde dizin arabelleği oluşturduğunu gösterir.
- Boyut üyesi, köşe arabellek verilerinin boyutunu bayt cinsinden saklar.
- Son pSharedHandle parametresi kullanılmaz. NULL olarakayarlayın.
Dizin İşleme Gereksinimleri
Dizin işleme işlemlerinin performansı büyük ölçüde dizin arabelleğinin bellekte nerede bulunduğuna ve hangi tür işleme cihazının kullanıldığına bağlıdır. Uygulamalar, dizin arabellekleri oluşturulduğunda bellek ayırmayı denetler. D3DPOOL_SYSTEMMEM bellek bayrağı ayarlandığında, dizin arabelleği sistem belleğinde oluşturulur. D3DPOOL_DEFAULT bellek bayrağı kullanıldığında, cihaz sürücüsü dizin arabelleği için belleğin en iyi ayrıldığı yeri belirler ve genellikle sürücü için en uygun bellek olarak adlandırılır. Sürücü için en uygun bellek yerel video belleği, yerel olmayan video belleği veya sistem belleği olabilir.
IDirect3DDevice9::CreateIndexBuffer yöntemi çağrılırken D3DUSAGE_SOFTWAREPROCESSING davranış bayrağının ayarlanması, dizin arabelleğinin yazılım köşesi işleme ile kullanılacağını belirtir. Bu bayrak, yazılım köşesi işleme kullanıldığında karma mod köşe işlemede (D3DCREATE_MIXED_VERTEXPROCESSING) gereklidir.
Uygulama, sürücü için en uygun bellekte ayrılmış bir dizin arabelleğine dizinleri doğrudan yazabilir. Bu teknik, daha sonra yedekli kopyalama işlemini engeller. Bu teknik, uygulamanız verileri dizin arabelleğinden geri okursa iyi çalışmaz, çünkü ana bilgisayar tarafından sürücü için en uygun bellekten yapılan okuma işlemleri çok yavaş olabilir. Bu nedenle, uygulamanızın işleme sırasında okuması gerekiyorsa veya verileri arabelleğe hatalı bir şekilde yazarsa, sistem bellek dizini arabelleği daha iyi bir seçimdir.
Not
Video belleği kullanmak istemediğiniz veya sürücü köşe veya dizin arabelleklerini AGP belleğine koyarken büyük miktarda sayfa kilitli RAM kullanmak istemediğiniz durumlar dışında, her zaman D3DPOOL_DEFAULT kullanın.
Dizin Arabelleği Oluşturma
Altı parametre kabul eden IDirect3DDevice9::CreateIndexBuffer yöntemini çağırarak dizin arabellek nesnesi oluşturun.
İlk parametre, dizin arabellek uzunluğunu bayt cinsinden belirtir.
İkinci parametre bir kullanım denetimleri kümesidir. Bunun yanı sıra, değeri, indekslerle belirlenen köşelerin kırpma bilgilerini kapsayıp kapsamadığını belirler. Performansı geliştirmek için kırpma gerekmediğinde D3DUSAGE_DONOTCLIP belirtin.
D3DUSAGE_SOFTWAREPROCESSING bayrağı, bu cihaz için karma mod veya yazılım tepe işleme (D3DCREATE_MIXED_VERTEXPROCESSING / D3DCREATE_SOFTWARE_VERTEXPROCESSING) etkinleştirildiğinde ayar edilebilir. D3DUSAGE_SOFTWAREPROCESSING, karma modda yazılım köşesi işleme ile kullanılacak arabellekler için ayarlanmalıdır, ancak karma modda (D3DCREATE_HARDWARE_VERTEXPROCESSING) donanım dizini işleme kullanılırken mümkün olan en iyi performans için ayarlanmamalıdır. Ancak D3DUSAGE_SOFTWAREPROCESSING ayarı, hem donanım hem de yazılım vertex işleme ile tek bir arabellek kullanıldığında tek seçenektir. Karmaşık ve yazılım cihazlarında D3DUSAGE_SOFTWAREPROCESSING kullanımına izin verilir.
Dizin işleme donanımda yapılırken bile D3DPOOL_SYSTEMMEM belirterek köşe ve dizin arabelleklerini sistem belleğine zorlamak mümkündür. Bu, bir sürücü bu arabellekleri AGP belleğine koyarken fazla miktarda sayfa kilitli bellekten kaçınmanın bir yoludur.
Üçüncü parametre, her dizinin boyutunu belirten D3DFORMAT numaralandırılmış türünün D3DFMT_INDEX16 veya D3DFMT_INDEX32 üyesidir.
Dördüncü parametre, sisteme bellekte yeni dizin arabelleğinin yerleştirileceği yeri bildiren D3DPOOL numaralandırılmış türünün bir üyesidir.
IDirect3DDevice9::CreateIndexBuffertarafından kabul edilenson parametre, çağrı başarılı olursa köşe arabelleği nesnesinin yeni IDirect3DIndexBuffer9 arabirimine yönelik bir işaretçiyle doldurulan bir değişkenin adresidir.
Aşağıdaki C++ kod örneği, kodda dizin arabelleği oluşturmanın nasıl görünebileceğini gösterir.
/*
* For the purposes of this example, the d3dDevice variable is the
* address of an IDirect3DDevice9 interface exposed by a
* Direct3DDevice object, g_IB is a variable of type
* LPDIRECT3DINDEXBUFFER9.
*/
if( FAILED( d3dDevice->CreateIndexBuffer( 16384 *sizeof(WORD),
D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT,
&g_IB, NULL ) ) )
return E_FAIL;
Dizin Arabelleğine Eriş
Dizin arabelleği nesneleri, uygulamaların dizin verileri için ayrılan belleğe doğrudan erişmesini sağlar. IDirect3DIndexBuffer9::Lock yöntemini çağırarak, dizin arabellek belleğine bir işaretçi elde edebilirsiniz. Bunu yaptıktan sonra, arabelleği yeni dizin verileriyle doldurmak veya içerdiği verileri okumak için gerektiğinde belleğe erişebilirsiniz. Lock yöntemi dört parametre kabul eder. İlk OffsetToLock, dizin verilerine uzaklıktır. İkinci parametre, dizin verilerinin bayt cinsinden ölçülen boyutudur. ppbData IDirect3DIndexBuffer9::Lock yöntemi tarafından kabul edilen üçüncü parametre, çağrı başarılı olursa dizin verilerine yönelik bir işaretçiyle doldurulmuş bir BYTE işaretçisinin adresidir.
Son parametre Bayraklar, sisteme belleğin nasıl kilitlenmesi gerektiğini bildirir. Uygulamanın arabellekteki verilere nasıl eriştiği belirtmek için bunu kullanabilirsiniz. Bayrakları parametresi için sabitleri, dizin verilerinin uygulamanız tarafından erişilme şekline göre belirtin. Bu, sürücünün belleği kilitlemesine ve istenen erişim türüne göre en iyi performansı sağlamasına olanak tanır. Uygulamanız yalnızca dizin arabelleği belleğinden okuyacaksa D3DLOCK_READONLY bayrağını kullanın. Bu bayrağın dahil edilmesi, Direct3D'nin belleğe erişimin salt okunur olacağı göz önünde bulundurulduğunda verimliliği artırmak için iç yordamlarını iyileştirmesini sağlar.
Dizin verilerini doldurduktan veya okuduktan sonra, aşağıdaki kod örneğinde gösterildiği gibi IDirect3DIndexBuffer9::Unlock yöntemini çağırın.
// This code example assumes the m_pIndexBuffer is a variable of type
// LPDIRECT3DINDEXBUFFER9 and that g_Indices has been properly
// initialized with indices.
// To fill the index buffer, you must lock the buffer to gain
// access to the indices. This mechanism is required because index
// buffers may be in device memory.
VOID* pIndices;
if( FAILED( m_pIndexBuffer->Lock(
0, // Fill from start of the buffer
sizeof(g_Indices), // Size of the data to load
BYTE**)&pIndices, // Returned index data
0 ) ) ) // Send default flags to the lock
{
SAFE_RELEASE(m_pIndexBuffer);
return E_FAIL;
}
memcpy( pIndices, g_Indices, sizeof(g_Indices) );
m_pIndexBuffer->Unlock();
Not
D3DUSAGE_WRITEONLY bayrağıyla bir dizin arabelleği oluşturursanız, D3DLOCK_READONLY kilitleme bayrağını kullanmayın. Uygulamanız yalnızca dizin arabelleği belleğinden okuyacaksa D3DLOCK_READONLY bayrağını kullanın. Bu bayrağın dahil edilmesi, Direct3D'nin belleğe erişimin salt okunur olacağı göz önünde bulundurulduğunda verimliliği artırmak için iç yordamlarını iyileştirmesini sağlar.
IDirect3DIndexBuffer9::Lock yönteminin Bayrakları parametresi için D3DLOCK_DISCARD veya D3DLOCK_NOOVERWRITE kullanma hakkında bilgi için bkz. Performans İyileştirmeleri (Direct3D 9).
C++'ta dizin arabelleği için ayrılan belleğe doğrudan eriştiğinizden, uygulamanızın ayrılan belleğe doğru şekilde eriştiğinden emin olun. Aksi takdirde, bu belleği geçersiz işleme riskini alırsınız. Uygulamanızın ayrılmış arabellekteki bir dizinden diğerine geçiş yapmak için kullandığı dizin biçiminin adım boyunu kullanın.
IDirect3DIndexBuffer9::GetDesc yöntemini çağırarak dizin arabelleği hakkındaki bilgileri alın. Bu yöntem, D3DINDEXBUFFER_DESC yapısının üyelerini dizin arabelleği hakkındaki bilgilerle doldurur.
İlgili konular