[DEV]AB 1
[DEV]AB
R 1
Roksam
noisiv 1
noisiv
Manwe Work 1
Manwe Work
mavzermete 1
mavzermete
Hikaye Ekle

martyden sunucu performansını optimize

  • Konuyu başlatan Konuyu başlatan apikomt2
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 2
  • Görüntüleme Görüntüleme 277
Türk GIF.gif


Âşık der inci tenden,
İncinme incitenden,
Kemâlde noksân imiş,
İncinen incitenden...
Lûtfî (Alvarlı Efe)


entity_view.cpp

Bu kod bloğu, sunucu performansını optimize etmek amacıyla oyundaki nesnelerin (oyuncu, canavar, NPC, yerdeki eşya) birbirini görüş listesine (ViewInsert) alma kurallarını filtreler. Canavarların ve nesnelerin birbirini gereksiz yere takip etmesini engelleyerek CPU ve ağ paket yükünü düşürür.

  • Oyuncu Karakterleri (chMe->IsPC()): Görüş alanındaki tüm varlıkları (canavar, NPC, item, diğer oyuncular) kısıtlamasız olarak görüş listesine ekler. Oyuncunun ekranındaki görsellikte hiçbir eksilme olmaz.
  • Canavarlar ve NPC'ler (chMe->IsNPC()): Canavarların birbirini görüşe eklemesi engellenmiştir. Bir canavar veya NPC sadece şu 4 durumda hedefi görüşüne alır:
    • Oyuncular: Hedef bir oyuncu (IsPC()) ise (saldırmak veya takip etmek için).
    • Şifacı Yaratıklar: Yaratık şifacı mantığına (AIFLAG_HEALER) sahipse ve hedef kendi grubundaysa (can basabilmek için).
    • Gemi Savunması (Hidra): Hedef Hidra direği (20434) ise (direğe saldırmak için).
    • Köy Korumaları: Gardiyan NPC'leri (IsGuardNPC()) etraftaki canavarları görür (şehre giren moblara vurmak için).
  • Karakter Dışı Varlıklar (!m_me->IsType(ENTITY_CHARACTER)): Yerdeki eşyalar veya harita objeleri sadece etraftaki oyuncuları (IsPC()) görüş listesine kaydeder. Canavarlar yerdeki eşyaların matrisine hiç dahil edilmez.
  • Makro Kapalıyken (#else): Klasik Metin2 mantığı çalışır; kapsama alanındaki tüm varlıklar istisnasız birbirini görüş alanına ekler.
Klasik Metin2'de bir odadaki 100 canavar birbirini işlediğinde $100 \times 100 = 10.000$ adet görüş matrisi kontrolü oluşurken, bu filtreleme sayesinde canavarlar birbirini yok sayar ve karmaşıklık yalnızca o odadaki oyuncu sayısına düşürülür.






#define ENABLE_REDUCED_ENTITY_VIEW

Kod:
            #ifdef ENABLE_REDUCED_ENTITY_VIEW
            if (m_me->IsType(ENTITY_CHARACTER))
            {
                const auto chMe = (LPCHARACTER) m_me;

                // players view every entity
                if (chMe->IsPC())
                    m_me->ViewInsert(ent);

                // npcs view only a restricted amount of entities
                else if (chMe->IsNPC() && ent->IsType(ENTITY_CHARACTER))
                {
                    constexpr auto DefenseWaveMast = 20434;
                    const auto chEnt = (LPCHARACTER) ent;

                    // mobs view every player
                    if (chEnt->IsPC())
                        m_me->ViewInsert(ent);

                    // aiflag healers view their party
                    else if (IS_SET(chMe->GetAIFlag(), AIFLAG_HEALER) && chMe->GetParty() && chMe->GetParty() == chEnt->GetParty())
                        m_me->ViewInsert(ent);

                    // hydra mast is seen by other mobs
                    else if (chEnt->GetRaceNum() == DefenseWaveMast)
                        m_me->ViewInsert(ent);

                    // city guardians see all mobs
                    else if (chMe->IsGuardNPC())
                        m_me->ViewInsert(ent);
                }
            }
            else if (ent->IsType(ENTITY_CHARACTER))
            {
                const auto chEnt = (LPCHARACTER) ent;

                // other entities see every player
                if (chEnt->IsPC())
                    m_me->ViewInsert(ent);
            }
            #else
            m_me->ViewInsert(ent);
            #endif
#define
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst