Çözüldü Wiki Sistemi Client Donma Sorunu

  • Konuyu açan Konuyu açan sharap
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 5
  • Gösterim Gösterim 124
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

sharap

MT Üye
MT Üye
Mesaj
399
Çözümler
20
Beğeni
173
Puan
529
Ticaret Puanı
0
Arkadaşlar Merhaba Geçenlerde Wİki Sistemini Ekledim Bayada Uzun Sürdü Sistem Görünürde seysrsız ve düzgünçalışıyor ama şöyle bir problemim var.

1. Clienti açıp oyuna giriyorum herhangi bir problem yok sistemde açılıyor herşey çalışıyor yani normal birşekilde.

1. Client açıkken 2. Clienti Açıyorum 1. Client Siyah Ekran Oluyor Kapatamıyorum Öyle Kalıyor.

Wiki sisteminden kaynaklı olduğunu Eski yedeklerimi tek tek yükleyip kontrol ettikten sonra wiki ekledikten sonra bu sorunla karşılaştığımı fark ettim

Bildiğiniz üzere eklemesi çok olan bir sistem şimdi geri söküp takmaya çalışsam çok zaman kaybedeceğim belki bu sorunlar ile karşılaşan ve çözen biri vardır diye konu açayım dedim yada bu konu ile alakalı dosya isimleri nelerdir direk o kısımları bir daha sil baştan eklemeye çalışayım.

Şimdiden İlgilenen Herkese Çook Teşekkür Ederim. :)
 
Çözüm
Wiki sistemine genel olarak yabancıyım ancak piyasada farklı sürümleri olduğunu biliyorum. Eğer senin wiki sistemin render targetlı ise muhtemelen UAC sonrası cihaz resetlenmiyordur.

Bir tane client aç ve oyuna giriş yap. Sonra masaüstünde herhangi bir uygulamaya sağ tıklayıp yönetici olarak çalıştır de,(açılan evet-hayır ekranında Hayır'a da tıklayabilirsin.) eğer yine metin2 ekranı simsiyah olursa üstteki tahminim doğru demektir. Eğer durum böyleyse PythonApplication.cpp ve GrpDevice.cpp dosyalarını kontrol et söktüğün filesle karşılaştır. Wiki sistemi ile alakalı gözden kaçırdığın kodlar olmalı.
Siyah ekran verdiğinde sysser kontrol ediyor musun ? hala düşmüyorsa debug ile derle ve kontrol et.
 
Merhaba,
Client Source
GameLib\MapOutdoorUpdate.cpp :

Aratın ve silin veyahut yorum satırı yapın.

Kod:
Genişlet Daralt Kopyala
__CollectCollisionShadowReceiver(v3Player, v3Light);


UserInterface\PythonCharacterManager.cpp:

Aratın ve silin
Kod:
Genişlet Daralt Kopyala
if (pkInstEach->IsForceVisible())
{
    dwForceVisibleInstCount++;
    continue ;
}
 
Wiki sistemine genel olarak yabancıyım ancak piyasada farklı sürümleri olduğunu biliyorum. Eğer senin wiki sistemin render targetlı ise muhtemelen UAC sonrası cihaz resetlenmiyordur.

Bir tane client aç ve oyuna giriş yap. Sonra masaüstünde herhangi bir uygulamaya sağ tıklayıp yönetici olarak çalıştır de,(açılan evet-hayır ekranında Hayır'a da tıklayabilirsin.) eğer yine metin2 ekranı simsiyah olursa üstteki tahminim doğru demektir. Eğer durum böyleyse PythonApplication.cpp ve GrpDevice.cpp dosyalarını kontrol et söktüğün filesle karşılaştır. Wiki sistemi ile alakalı gözden kaçırdığın kodlar olmalı.
 
Çözüm
Siyah ekran verdiğinde sysser kontrol ediyor musun ? hala düşmüyorsa debug ile derle ve kontrol et.

Hayır Hocam Herhangi Bir Seysser yok Bütün Seysser leri Hatta Kanal Loglarına Kadar Bile Baktm Yok Tertemiz. Debug Mod için İse Clientin donduğu ile alakalı bir veri kaydetmiyor sanki client halen çalışıyormuş gibi davranıyor yani bir problem gözükmüyor. Değerli Yorumunuz İçin Teşekkür Ederim İyiki Varsınız. :)

Merhaba,
Client Source
GameLib\MapOutdoorUpdate.cpp :

Aratın ve silin veyahut yorum satırı yapın.

Kod:
Genişlet Daralt Kopyala
__CollectCollisionShadowReceiver(v3Player, v3Light);


UserInterface\PythonCharacterManager.cpp:

Aratın ve silin
Kod:
Genişlet Daralt Kopyala
if (pkInstEach->IsForceVisible())
{
    dwForceVisibleInstCount++;
    continue ;
}

Bu İşlemi Yapmadım Ama Belki İşine Yarayan Olacaktır. Değerli Yorumunuz İçin Teşekkür Ederim İyiki Varsınız. :)


Wiki sistemine genel olarak yabancıyım ancak piyasada farklı sürümleri olduğunu biliyorum. Eğer senin wiki sistemin render targetlı ise muhtemelen UAC sonrası cihaz resetlenmiyordur.

Bir tane client aç ve oyuna giriş yap. Sonra masaüstünde herhangi bir uygulamaya sağ tıklayıp yönetici olarak çalıştır de,(açılan evet-hayır ekranında Hayır'a da tıklayabilirsin.) eğer yine metin2 ekranı simsiyah olursa üstteki tahminim doğru demektir. Eğer durum böyleyse PythonApplication.cpp ve GrpDevice.cpp dosyalarını kontrol et söktüğün filesle karşılaştır. Wiki sistemi ile alakalı gözden kaçırdığın kodlar olmalı.

Bunu Denedim Hocam Tahmin Ettiğiniz Gibi Herhangi Başka Bir EXE de Çalışınca Aynı Hatayı Veriyordu. Bununla beraber PythonAplication.cpp Dosyamı tekrardan temizleyip eklemeleri Gpt İle beraber yaptım hatta extra birkaç öneri de verdi eklemeleri ve Gpt Önerilerini de aşağıya bırakacağım belki işine yarayan olur.

Hatta bu önerileri de açıklayabilecek olan varsa açıklarsa çok daha güzel olur. @Kaiser Değerli Yorumunuz İçin Teşekkür Ederim İyiki Varsınız Hocam. :)

PythonAplication.cpp:
Genişlet Daralt Kopyala
// Bu Kısım İlk Eklediğim Bölüm Burası Zaten Diğer Fileste de Vardı.

bool PERF_CHECKER_RENDER_GAME = false;

void CPythonApplication::RenderGame()
{
    if (!PERF_CHECKER_RENDER_GAME)
    {
        float fAspect=m_kWndMgr.GetAspect();
        float fFarClip=m_pyBackground.GetFarClip();

        m_pyGraphic.SetPerspective(30.0f, fAspect, 100.0, fFarClip);

        CCullingManager::Instance().Process();

        m_kChrMgr.Deform();
       
        // INGAME_WIKI: Wiki modellerinin deformasyonu - karakter deformasyonu sonrası çalışır
#if defined(INGAME_WIKI)
        if (CPythonWikiRenderTarget::instance().CanRenderWikiModules())
            m_pyWikiModelViewManager.DeformModels();
#endif

        m_pyBackground.RenderCharacterShadowToTexture();

        m_pyGraphic.SetGameRenderState();
        m_pyGraphic.PushState();

        {
            long lx, ly;
            m_kWndMgr.GetMousePosition(lx, ly);
            m_pyGraphic.SetCursorPosition(lx, ly);
        }

        m_pyBackground.RenderSky();

        m_pyBackground.RenderBeforeLensFlare();

        m_pyBackground.RenderCloud();

        m_pyBackground.BeginEnvironment();
        m_pyBackground.Render();

        m_pyBackground.SetCharacterDirLight();
        m_kChrMgr.Render();
       
        // INGAME_WIKI: Wiki modellerinin render edilmesi - karakter render sonrası çalışır
#if defined(INGAME_WIKI)
        if (CPythonWikiRenderTarget::instance().CanRenderWikiModules())
            m_pyWikiModelViewManager.RenderModels();
#endif

        m_pyBackground.SetBackgroundDirLight();
        m_pyBackground.RenderWater();
        m_pyBackground.RenderSnow();
        m_pyBackground.RenderEffect();

        m_pyBackground.EndEnvironment();

        m_kEftMgr.Render();
        m_pyItem.Render();
        m_FlyingManager.Render();

        m_pyBackground.BeginEnvironment();
        m_pyBackground.RenderPCBlocker();
        m_pyBackground.EndEnvironment();

        m_pyBackground.RenderAfterLensFlare();

        return;
    }


// Bu Kısım İkinci Eklediğim Bölüm Burası Zaten Diğer Fileste de Vardı.

    //if (m_isActivateWnd)
    {
        CScreen s;
        float fAspect = UI::CWindowManager::Instance().GetAspect();
        float fFarClip = CPythonBackground::Instance().GetFarClip();

        s.SetPerspective(30.0f,fAspect, 100.0f, fFarClip);
        s.BuildViewFrustum();
    }
   
    // INGAME_WIKI: Wiki modellerinin güncellenmesi - her frame'de çalışır
#if defined(INGAME_WIKI)
    if (CPythonWikiRenderTarget::instance().CanRenderWikiModules())
        m_pyWikiModelViewManager.UpdateModels();
#endif

    DWORD t3=ELTimer_GetMSec();
    TPixelPosition kPPosMainActor;
    m_pyPlayer.NEW_GetMainActorPosition(&kPPosMainActor);

    DWORD t4=ELTimer_GetMSec();
    m_pyBackground.Update(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z);

    DWORD t5=ELTimer_GetMSec();
    m_GameEventManager.SetCenterPosition(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z);
    m_GameEventManager.Update();


// Bu Kısım Üçüncü Eklediğim Bölüm Burası Zaten Diğer Fileste de Vardı.

    if (!s_bFrameSkip)
    {
        CGrannyMaterial::TranslateSpecularMatrix(g_specularSpd, g_specularSpd, 0.0f);

        DWORD dwRenderStartTime = ELTimer_GetMSec();

        bool canRender = true;

        if (m_isMinimizedWnd)
        {
            canRender = false;
        }
        else
        {
            if (m_pyGraphic.IsLostDevice())
            {
                CPythonBackground& rkBG = CPythonBackground::Instance();
                rkBG.ReleaseCharacterShadowTexture();
               
                // INGAME_WIKI: Device kaybedildiğinde wiki render texture'larını serbest bırak
#if defined(INGAME_WIKI)
                CWikiRenderTargetManager::Instance().ReleaseRenderTargetTextures();
#endif

                if (m_pyGraphic.RestoreDevice())
                {
                    rkBG.CreateCharacterShadowTexture();
                   
                    // INGAME_WIKI: Device restore edildiğinde wiki render texture'larını yeniden oluştur
#if defined(INGAME_WIKI)
                    CWikiRenderTargetManager::Instance().CreateRenderTargetTextures();
#endif
                }
                else
                {
                    canRender = false;
                }
            }
        }


// Bu Kısım Dördüncü Eklediğim Bölüm GPT nin Önerisi Üzerine Eklediğim Kısımlar.

int CPythonApplication::CheckDeviceState()
{
    CGraphicDevice::EDeviceState e_deviceState = m_grpDevice.GetDeviceState();

    switch (e_deviceState)
    {
    case CGraphicDevice::DEVICESTATE_NULL:
        return DEVICE_STATE_FALSE;

    case CGraphicDevice::DEVICESTATE_BROKEN:
        return DEVICE_STATE_SKIP;

    case CGraphicDevice::DEVICESTATE_NEEDS_RESET:
        // INGAME_WIKI: Device reset öncesi wiki render texture'larını serbest bırak
#if defined(INGAME_WIKI)
        CWikiRenderTargetManager::Instance().ReleaseRenderTargetTextures();
#endif
       
        if (!m_grpDevice.Reset())
            return DEVICE_STATE_SKIP;
           
        // INGAME_WIKI: Device reset sonrası wiki render texture'larını yeniden oluştur
#if defined(INGAME_WIKI)
        CWikiRenderTargetManager::Instance().CreateRenderTargetTextures();
#endif

        break;
    }

    return DEVICE_STATE_OK;
}

NOT: Bende RENDER_TARGET Sistemi Yok. Umarım Bir yanlış Yoktur Aynı Problemi Yaşıyanların İşine Yarar.
 
Hayır Hocam Herhangi Bir Seysser yok Bütün Seysser leri Hatta Kanal Loglarına Kadar Bile Baktm Yok Tertemiz. Debug Mod için İse Clientin donduğu ile alakalı bir veri kaydetmiyor sanki client halen çalışıyormuş gibi davranıyor yani bir problem gözükmüyor. Değerli Yorumunuz İçin Teşekkür Ederim İyiki Varsınız. :)



Bu İşlemi Yapmadım Ama Belki İşine Yarayan Olacaktır. Değerli Yorumunuz İçin Teşekkür Ederim İyiki Varsınız. :)




Bunu Denedim Hocam Tahmin Ettiğiniz Gibi Herhangi Başka Bir EXE de Çalışınca Aynı Hatayı Veriyordu. Bununla beraber PythonAplication.cpp Dosyamı tekrardan temizleyip eklemeleri Gpt İle beraber yaptım hatta extra birkaç öneri de verdi eklemeleri ve Gpt Önerilerini de aşağıya bırakacağım belki işine yarayan olur.

Hatta bu önerileri de açıklayabilecek olan varsa açıklarsa çok daha güzel olur. @Kaiser Değerli Yorumunuz İçin Teşekkür Ederim İyiki Varsınız Hocam. :)

PythonAplication.cpp:
Genişlet Daralt Kopyala
// Bu Kısım İlk Eklediğim Bölüm Burası Zaten Diğer Fileste de Vardı.

bool PERF_CHECKER_RENDER_GAME = false;

void CPythonApplication::RenderGame()
{
    if (!PERF_CHECKER_RENDER_GAME)
    {
        float fAspect=m_kWndMgr.GetAspect();
        float fFarClip=m_pyBackground.GetFarClip();

        m_pyGraphic.SetPerspective(30.0f, fAspect, 100.0, fFarClip);

        CCullingManager::Instance().Process();

        m_kChrMgr.Deform();
      
        // INGAME_WIKI: Wiki modellerinin deformasyonu - karakter deformasyonu sonrası çalışır
#if defined(INGAME_WIKI)
        if (CPythonWikiRenderTarget::instance().CanRenderWikiModules())
            m_pyWikiModelViewManager.DeformModels();
#endif

        m_pyBackground.RenderCharacterShadowToTexture();

        m_pyGraphic.SetGameRenderState();
        m_pyGraphic.PushState();

        {
            long lx, ly;
            m_kWndMgr.GetMousePosition(lx, ly);
            m_pyGraphic.SetCursorPosition(lx, ly);
        }

        m_pyBackground.RenderSky();

        m_pyBackground.RenderBeforeLensFlare();

        m_pyBackground.RenderCloud();

        m_pyBackground.BeginEnvironment();
        m_pyBackground.Render();

        m_pyBackground.SetCharacterDirLight();
        m_kChrMgr.Render();
      
        // INGAME_WIKI: Wiki modellerinin render edilmesi - karakter render sonrası çalışır
#if defined(INGAME_WIKI)
        if (CPythonWikiRenderTarget::instance().CanRenderWikiModules())
            m_pyWikiModelViewManager.RenderModels();
#endif

        m_pyBackground.SetBackgroundDirLight();
        m_pyBackground.RenderWater();
        m_pyBackground.RenderSnow();
        m_pyBackground.RenderEffect();

        m_pyBackground.EndEnvironment();

        m_kEftMgr.Render();
        m_pyItem.Render();
        m_FlyingManager.Render();

        m_pyBackground.BeginEnvironment();
        m_pyBackground.RenderPCBlocker();
        m_pyBackground.EndEnvironment();

        m_pyBackground.RenderAfterLensFlare();

        return;
    }


// Bu Kısım İkinci Eklediğim Bölüm Burası Zaten Diğer Fileste de Vardı.

    //if (m_isActivateWnd)
    {
        CScreen s;
        float fAspect = UI::CWindowManager::Instance().GetAspect();
        float fFarClip = CPythonBackground::Instance().GetFarClip();

        s.SetPerspective(30.0f,fAspect, 100.0f, fFarClip);
        s.BuildViewFrustum();
    }
  
    // INGAME_WIKI: Wiki modellerinin güncellenmesi - her frame'de çalışır
#if defined(INGAME_WIKI)
    if (CPythonWikiRenderTarget::instance().CanRenderWikiModules())
        m_pyWikiModelViewManager.UpdateModels();
#endif

    DWORD t3=ELTimer_GetMSec();
    TPixelPosition kPPosMainActor;
    m_pyPlayer.NEW_GetMainActorPosition(&kPPosMainActor);

    DWORD t4=ELTimer_GetMSec();
    m_pyBackground.Update(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z);

    DWORD t5=ELTimer_GetMSec();
    m_GameEventManager.SetCenterPosition(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z);
    m_GameEventManager.Update();


// Bu Kısım Üçüncü Eklediğim Bölüm Burası Zaten Diğer Fileste de Vardı.

    if (!s_bFrameSkip)
    {
        CGrannyMaterial::TranslateSpecularMatrix(g_specularSpd, g_specularSpd, 0.0f);

        DWORD dwRenderStartTime = ELTimer_GetMSec();

        bool canRender = true;

        if (m_isMinimizedWnd)
        {
            canRender = false;
        }
        else
        {
            if (m_pyGraphic.IsLostDevice())
            {
                CPythonBackground& rkBG = CPythonBackground::Instance();
                rkBG.ReleaseCharacterShadowTexture();
              
                // INGAME_WIKI: Device kaybedildiğinde wiki render texture'larını serbest bırak
#if defined(INGAME_WIKI)
                CWikiRenderTargetManager::Instance().ReleaseRenderTargetTextures();
#endif

                if (m_pyGraphic.RestoreDevice())
                {
                    rkBG.CreateCharacterShadowTexture();
                  
                    // INGAME_WIKI: Device restore edildiğinde wiki render texture'larını yeniden oluştur
#if defined(INGAME_WIKI)
                    CWikiRenderTargetManager::Instance().CreateRenderTargetTextures();
#endif
                }
                else
                {
                    canRender = false;
                }
            }
        }


// Bu Kısım Dördüncü Eklediğim Bölüm GPT nin Önerisi Üzerine Eklediğim Kısımlar.

int CPythonApplication::CheckDeviceState()
{
    CGraphicDevice::EDeviceState e_deviceState = m_grpDevice.GetDeviceState();

    switch (e_deviceState)
    {
    case CGraphicDevice::DEVICESTATE_NULL:
        return DEVICE_STATE_FALSE;

    case CGraphicDevice::DEVICESTATE_BROKEN:
        return DEVICE_STATE_SKIP;

    case CGraphicDevice::DEVICESTATE_NEEDS_RESET:
        // INGAME_WIKI: Device reset öncesi wiki render texture'larını serbest bırak
#if defined(INGAME_WIKI)
        CWikiRenderTargetManager::Instance().ReleaseRenderTargetTextures();
#endif
      
        if (!m_grpDevice.Reset())
            return DEVICE_STATE_SKIP;
          
        // INGAME_WIKI: Device reset sonrası wiki render texture'larını yeniden oluştur
#if defined(INGAME_WIKI)
        CWikiRenderTargetManager::Instance().CreateRenderTargetTextures();
#endif

        break;
    }

    return DEVICE_STATE_OK;
}

NOT: Bende RENDER_TARGET Sistemi Yok. Umarım Bir yanlış Yoktur Aynı Problemi Yaşıyanların İşine Yarar.
Evet sende render target yok ama wikide var. Ve render target dediğimiz şey, directx cihazı kaybolduğunda veya resetlenme ihtiyacı duyduğunda, diğer tüm kaynaklarla beraber serbest bırakılması gereken bir veridir. Resetten hemen sonra ise tüm kaynaklarla beraber render targetın da tekrar oluşturulması gerekir.

Senin yaşadığın sorunun sebebi muhtemelen şurasıydı:
C++:
Genişlet Daralt Kopyala
case CGraphicDevice::DEVICESTATE_NEEDS_RESET:
        // Tüm kaynaklar burada serbest bırakılmalı..
#if defined(INGAME_WIKI)
        CWikiRenderTargetManager::Instance().ReleaseRenderTargetTextures();
#endif
        ....
            ....
        if (!m_grpDevice.Reset()) // cihaz resetleniyor
            return DEVICE_STATE_SKIP;
        ....
            ......
        // reset başarılıysa tüm kaynakları tekrar oluştur..
#if defined(INGAME_WIKI)
        CWikiRenderTargetManager::Instance().CreateRenderTargetTextures();
#endif

Eğer resetleme anında kaynaklardan biri veya birkaçı serbest bırakılmazsa resetleme başarısız olur, cihaz kaybolur.
Bu da senin "siyah ekran" dediğin sonucu verir. Çünkü artık bir nevi directx çökmüştür.
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst