Aracılığıyla paylaş


Kayıp Cihazlar (Direct3D 9)

Direct3D cihazı işletimsel veya kayıp durumda olabilir. İşlem durumu, cihazın çalıştığı ve tüm işlemeyi beklendiği gibi sunduğu cihazın normal durumudur. Cihaz, tam ekran bir uygulamada klavye odağını kaybetme gibi bir olay işlemenin imkansız hale gelmesine neden olduğunda kayıp durumuna geçiş yapar. Kayıp durumu, tüm işleme işlemlerinin sessiz başarısızlığı ile karakterize edilir. Bu, işleme işlemlerinin başarısız olmasına rağmen işleme yöntemlerinin başarı kodları döndürebileceği anlamına gelir. Bu durumda hata kodu D3DERR_DEVICELOST IDirect3DDevice9::P resenttarafından döndürülür.

Tasarım gereği, bir cihazın kaybolmasına neden olabilecek senaryoların tamamı belirtilmez. Kullanıcının ALT+SEKME tuşlarına basması veya bir sistem iletişim kutusunun başlatılması gibi bazı tipik örnekler odak kaybıdır. Bir güç yönetimi olayı nedeniyle veya başka bir uygulama tam ekran işlemi varsaydığında cihazlar da kaybolabilir. Buna ek olarak, IDirect3DDevice9::Reset gelen tüm hatalar cihazı kayıp durumuna geçirir.

IUnknown türetilen tüm yöntemlerin cihaz kaybolduktan sonra çalışması garanti edilir. Cihaz kaybından sonra her işlev genellikle aşağıdaki üç seçeneğe sahiptir:

  • D3DERR_DEVICELOST ile başarısız - Bu, uygulamanın cihazın kaybolduğunu tanıması gerektiği anlamına gelir, böylece uygulama beklendiği gibi bir şey olmadığını tanımlar.
  • Sessizce başarısız olur, S_OK veya diğer dönüş kodları döndürülebilir - Bir işlev sessizce başarısız olursa, uygulama genellikle "başarılı" ile "sessiz hata" sonucu arasında ayrım yapamaz.
  • işlevi bir dönüş kodu döndürür.
Direct3D 9 ile Direct3D 9Ex arasındaki farklar:
Direct3D 9 cihazı D3DERR_DEVICELOST döndürür. IDirect3DDevice9::P resentdöndürüldükten sonra öykünme davranışı çalışmaz ve cihaz başarıyla sıfırlanana kadar gelecekteki tüm çağrılar başarısız olur.
Direct3D 9Ex cihazı hiçbir zaman D3DERR_DEVICELOST döndürmez, ancak yeni durum iletileri döndürebilir (bkz. cihaz davranışı değişiklikleri ).

 

Kayıp Bir Cihaza Yanıt Verme

Kaybolan bir cihaz sıfırlandıktan sonra kaynakları (video bellek kaynakları dahil) yeniden oluşturmalıdır. Bir cihaz kaybolursa, uygulama cihazın işletim durumuna geri yüklenip yüklenmediğini görmek için cihazı sorgular. Aksi takdirde, uygulama cihaz geri yükleninceye kadar bekler.

Cihaz geri yüklenebiliyorsa, uygulama tüm video bellek kaynaklarını ve değiştirme zincirlerini yok ederek cihazı hazırlar. Ardından uygulama IDirect3DDevice9::Reset yöntemini çağırır. Sıfırlama, cihaz kaybolduğunda etkisi olan tek yöntemdir ve bir uygulamanın cihazı kayıp durumundan işletimsel duruma değiştirebileceği tek yöntemdir. Uygulama, IDirect3DDevice9::CreateRenderTarget ve IDirect3DDevice9::CreateDepthStencilSurface yöntemleri tarafından oluşturulanlar da dahil olmak üzere D3DPOOL_DEFAULT ayrılan tüm kaynakları serbest bırakmadığı sürece sıfırlama başarısız olur.

Çoğunlukla, Direct3D'nin yüksek frekanslı çağrıları cihazın kaybedilip kaybedilmediğiyle ilgili herhangi bir bilgi döndürmez. Uygulama, kayıp bir cihaz bildirimi almadan IDirect3DDevice9::D rawPrimitivegibi işleme yöntemlerini çağırmaya devam edebilir. Dahili olarak, cihaz çalışma durumuna sıfırlanana kadar bu işlemler atılır.

Uygulama, IDirect3DDevice9::TestCooperativeLevel yönteminin dönüş değerini sorgulayarak kayıp bir cihazla karşılaşıldığında ne yapacağını belirleyebilir.

Kilitleme İşlemleri

Dahili olarak Direct3D, bir cihaz kaybolduktan sonra kilit işleminin başarılı olmasını sağlamak için yeterli çalışmayı yapar. Ancak, video belleği kaynağının verilerinin kilit işlemi sırasında doğru olacağı garanti edilmemektedir. Hata kodunun döndürülmeyecek olması garanti edilir. Bu, uygulamaların kilit işlemi sırasında cihaz kaybıyla ilgilenmeden yazılmasını sağlar.

Kaynaklar

Kaynaklar video belleği kullanabilir. Kayıp bir cihazın bağdaştırıcının sahip olduğu video belleğiyle bağlantısı kesildiğinden, cihaz kaybolduğunda video belleğinin ayrılmasını garanti etmek mümkün değildir. Sonuç olarak, tüm kaynak oluşturma yöntemleri D3D_OK döndürerek başarılı olmak için uygulanır, ancak aslında yalnızca sahte sistem belleği ayırır. Cihaz yeniden boyutlandırılmadan önce herhangi bir video belleği kaynağının yok edilmesi gerektiğinden, video belleğini fazla ayırma sorunu yoktur. Bu işlevsiz yüzeyler, uygulama IDirect3DDevice9::P resent çağırıp cihazın kaybolduğunu keşfedene kadar kilitleme ve kopyalama işlemlerinin normal şekilde çalışmasını sağlar.

Bir cihazın kayıp durumundan işletimsel duruma sıfırlanması için tüm video belleği serbest bırakılmalıdır. Bu, uygulamanın IDirect3DDevice9::CreateAdditionalSwapChain ile oluşturulan tüm takas zincirlerini ve D3DPOOL_DEFAULT bellek sınıfına yerleştirilen tüm kaynakları serbest bırakması gerektiği anlamına gelir. Uygulamanın D3DPOOL_MANAGED veya D3DPOOL_SYSTEMMEM bellek sınıflarındaki kaynakları serbest bırakması gerekmez. Diğer durum verileri, işletimsel duruma geçiş tarafından otomatik olarak yok edilir.

Cihaz kaybına yanıt vermek için tek bir kod yolu ile uygulama geliştirmeniz teşvik edilir. Bu kod yolu, aynı değilse, cihazı başlangıçta başlatmak için alınan kod yoluna benzer olabilir.

Alınan Veriler

Direct3D, uygulamaların IDirect3DDevice9::ValidateDevicekullanarak donanım tarafından tek geçişli işlemeye karşı dokuyu ve işleme durumlarını doğrulamasını sağlar. Genellikle uygulamanın başlatılması sırasında çağrılan bu yöntem, cihaz kaybolursa D3DERR_DEVICELOST döndürür.

Direct3D, uygulamaların video bellek kaynaklarından oluşturulan veya önceden yazılmış görüntüleri kalıcı olmayan sistem belleği kaynaklarına kopyalamasına da olanak tanır. Bu tür aktarımların kaynak görüntüleri herhangi bir zamanda kaybolabileceğinden, Direct3D cihaz kaybolduğunda bu tür kopyalama işlemlerinin başarısız olmasına izin verir.

Zaman uyumsuz sorgular ile ilgili olarak, IDirect3DQuery9::GetData, uygulamaya IDirect3DQuery9::GetData hiçbir zaman S_OK döndürmeyeceğini belirtmek için FLUSH bayrağı belirtilirse D3DERR_DEVICELOST döndürür.

IDirect3DDevice9::GetFrontBufferDatakopyalama işlemi, cihaz kaybolduğunda birincil yüzey olmadığından D3DERR_DEVICELOST ile başarısız olabilir. IDirect3DDevice9::CreateAdditionalSwapChain, cihaz kaybolduğunda arka arabellek oluşturulamadığından D3DERR_DEVICELOST ile de başarısız olabilir. Bu örneklerin, IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevelve IDirect3DDevice9::Reset yöntemlerinin dışındaki tek D3DERR_DEVICELOST örneği olduğunu unutmayın.

Programlanabilir Gölgelendiriciler

Direct3D 9'da köşe gölgelendiricilerinin ve piksel gölgelendiricilerinin sıfırlandıktan sonra yeniden oluşturulması gerekmez. Hatırlanırlar. DirectX'in önceki sürümlerinde kayıp bir cihaz, gölgelendiricilerin yeniden oluşturulmasını gerektiriyormuş.

Direct3D Cihazları