Yardım DX9 güncellemesi sonrası nesne marketin zeminleri bozması

  • Konuyu açan Konuyu açan leqions
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 3
  • Gösterim Gösterim 105
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

leqions

Üye
Üye
Mesaj
84
Çözümler
4
Beğeni
110
Puan
689
Ticaret Puanı
0
Merhaba. DirectX9 güncellemesi yaptım. Çoklu client açıldığında zemin bozulması sanırım çözülmüş, ben onu yaşamadım ama nesne market penceresini açtığımda zemin dokularında aynı şekilde bir bozulma meydana geliyor. Sorunun CGraphicDevice::EnableWebBrowserMode içindeki rkD3DDev.Reset(&rkD3DPP); satırından kaynaklandığını anladım ama bir çözüme varamadım.

Denediğim çözüm adımları:
1- Direkt olarak WebBrowserMode'un aktive ve deaktive edildiği fonksiyonlardan reset'i kaldırdım:
Browser hariç hiçbir bileşen renderlanmayı sürdürmedi. Oyun arkaplanda görsellik hariç çalışmaya devam etti, nesne market tarayıcısını kapattığımda zeminlerde bozulma olmadan renderlanmaya devam etti. (Nesne marketi tam ekran yaparak belki rahatsız ediciliğini azaltabilirim ama sorunun üstünü örtmek yerine çözmek istiyorum)

2- GrpScreen.cpp içinde CScreen::Show fonksiyonunda if (g_isBrowserMode) bloğuna ms_lpd3dDevice->Present(NULL, NULL, hWnd, NULL); satırını ekledim:
bu satır normalde aynı bloğun else kısmında var, anladığım kadarıyla oyunun kendisini render ediyor. Bu sefer de tarayıcı ile oyunun geri kalanı aynı anda renderlandığı için olan tarayıcıya oldu, sadece tarayıcı ekranında metin seçerken ara ara kendini gösteriyor. Onun dışında sadece nesne marketin boş UI arkaplanı var. Tarayıcı meydanda yok.

İşin içinden çıkamadım. chatgpt'yi darladım, o da yardımcı olamadı. Fikir verebilecek biri var mıdır? Ya da ilgisi yüksek ihtimal yoktur ama CEF browsera geçsem bir değişiklik olur mu?

Başka bir ui board içinde bir tarayıcı oluşturmanın bir yolu var mı bu arada, sanki bir ara denk gelmiştim ama onu bulamadım bugün. Belki o şekilde çözerim.
 
EterLib/StateManager.cpp - > ::SetDevice fonksiyonuna git, içerisinde şu kısmı görmen gerek:
C++:
Genişlet Daralt Kopyala
    D3DCAPS9 d3dCaps;
    m_lpD3DDev->GetDeviceCaps(&d3dCaps);

    if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
        m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
    else
        m_dwBestMagFilter = D3DTEXF_LINEAR;

    if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
        m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
    else
        m_dwBestMinFilter = D3DTEXF_LINEAR;

    DWORD dwMax = d3dCaps.MaxAnisotropy;
    dwMax = dwMax < 4 ? dwMax : 4;

    for (int i = 0; i < 8; ++i)
        m_lpD3DDev->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, dwMax);

Bunu SetDevice fonksiyonundan kaldır ve komple ::SetDefaultState() fonksiyonuna taşı:
C++:
Genişlet Daralt Kopyala
void CStateManager::SetDefaultState()
{

    D3DCAPS9 d3dCaps;
    m_lpD3DDev->GetDeviceCaps(&d3dCaps);

    if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
        m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
    else
        m_dwBestMagFilter = D3DTEXF_LINEAR;

    if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
        m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
    else
        m_dwBestMinFilter = D3DTEXF_LINEAR;

    DWORD dwMax = d3dCaps.MaxAnisotropy;
    dwMax = dwMax < 4 ? dwMax : 4;

    for (int i = 0; i < 8; ++i)
        m_lpD3DDev->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, dwMax);
 
    [...]
}

Eğer mevcut çağrı hiyerarşisini yanlışlıkla bozmadıysan bu düzenleme sorununu çözecektir.
Eğer işe yaramazsa cihazın resetlendiği anda StateManager sınıfını tamamen yok et ve tekrar oluştur.

Ek olarak; CEF Browser bellek kullanımını arttırıyor. Teknik olarak arttırması gayet normal ancak metin2 için tavsiye etmem.
 
EterLib/StateManager.cpp - > ::SetDevice fonksiyonuna git, içerisinde şu kısmı görmen gerek:
C++:
Genişlet Daralt Kopyala
    D3DCAPS9 d3dCaps;
    m_lpD3DDev->GetDeviceCaps(&d3dCaps);

    if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
        m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
    else
        m_dwBestMagFilter = D3DTEXF_LINEAR;

    if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
        m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
    else
        m_dwBestMinFilter = D3DTEXF_LINEAR;

    DWORD dwMax = d3dCaps.MaxAnisotropy;
    dwMax = dwMax < 4 ? dwMax : 4;

    for (int i = 0; i < 8; ++i)
        m_lpD3DDev->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, dwMax);

Bunu SetDevice fonksiyonundan kaldır ve komple ::SetDefaultState() fonksiyonuna taşı:
C++:
Genişlet Daralt Kopyala
void CStateManager::SetDefaultState()
{

    D3DCAPS9 d3dCaps;
    m_lpD3DDev->GetDeviceCaps(&d3dCaps);

    if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
        m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
    else
        m_dwBestMagFilter = D3DTEXF_LINEAR;

    if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
        m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
    else
        m_dwBestMinFilter = D3DTEXF_LINEAR;

    DWORD dwMax = d3dCaps.MaxAnisotropy;
    dwMax = dwMax < 4 ? dwMax : 4;

    for (int i = 0; i < 8; ++i)
        m_lpD3DDev->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, dwMax);
 
    [...]
}

Eğer mevcut çağrı hiyerarşisini yanlışlıkla bozmadıysan bu düzenleme sorununu çözecektir.
Eğer işe yaramazsa cihazın resetlendiği anda StateManager sınıfını tamamen yok et ve tekrar oluştur.

Ek olarak; CEF Browser bellek kullanımını arttırıyor. Teknik olarak arttırması gayet normal ancak metin2 için tavsiye etmem.
Olmadı hocam maalesef, bir değişiklik yok. "StateManager sınıfını tamamen yok edip tekrar oluşturma" kısmına da kafam basmadı bir türlü :/
 
Geri
Üst