Skocz do zawartości
Opublikowano

Inaczej mała optymalizacja załadowania map w wersji rozszerzonej, na devie jest tylko podstawowa od amuna

src:
- commonDefines.h 
dodaj: 

🔐 Ukryta Treść 🔐



char_manager.cpp
poszukaj: 

🔐 Ukryta Treść 🔐



przed:     

🔐 Ukryta Treść 🔐



dodaj: 

🔐 Ukryta Treść 🔐



input_login.cpp
poszukaj: 

🔐 Ukryta Treść 🔐



dodaj nad: 

🔐 Ukryta Treść 🔐


packet.h
poszukaj:

🔐 Ukryta Treść 🔐


dodaj pod:
// jak masz zajęte miejsce 211 to zmień na inne byle żeby pasowało w src i bin.

🔐 Ukryta Treść 🔐


przed:

🔐 Ukryta Treść 🔐



dodaj:

🔐 Ukryta Treść 🔐


sectree_manager.cpp

poszukaj:

🔐 Ukryta Treść 🔐



dodaj pod:

🔐 Ukryta Treść 🔐


poszukaj:

🔐 Ukryta Treść 🔐



dodaj pod:

🔐 Ukryta Treść 🔐


sectree_manager.h

w includach daj:
 

🔐 Ukryta Treść 🔐


poszukaj:

🔐 Ukryta Treść 🔐


dodaj pod:
 

🔐 Ukryta Treść 🔐


szukaj:         
 

🔐 Ukryta Treść 🔐


dodaj pod:
 

🔐 Ukryta Treść 🔐


przechodzimy teraz do bin

w locale_inc.h daj:

🔐 Ukryta Treść 🔐


packet.h

szukaj:

🔐 Ukryta Treść 🔐


dodaj pod:

🔐 Ukryta Treść 🔐


przed:

🔐 Ukryta Treść 🔐


dodaj nad:

🔐 Ukryta Treść 🔐


PythonNetworkStream.cpp

szukaj:

🔐 Ukryta Treść 🔐


dodaj pod:

🔐 Ukryta Treść 🔐


PythonNetworkStream.h

szukaj:
 

🔐 Ukryta Treść 🔐


dodaj pod:
 

🔐 Ukryta Treść 🔐


PythonNetworkStreamPhaseGame.cpp

szukaj:
 

🔐 Ukryta Treść 🔐


dodaj pod:
 

🔐 Ukryta Treść 🔐


dodaj na koncu:

🔐 Ukryta Treść 🔐

 

Featured Replies

Opublikowano
W dniu 12.01.2025 o 16:07, Azurri napisał(a):

Inaczej mała optymalizacja załadowania map w wersji rozszerzonej, na devie jest tylko podstawowa od amuna

Szczerze nie dopatrzyłem się zmian względem wersji Anuma Github 

Trochę edytowałem główną funkcje aby lepiej wpasowywała się w nowe standardy c++ 

  • użyto dynamic_cast, który sprawdza, czy rzutowanie jest możliwe. Jeśli nie, zwraca nullptr, co zapobiega błędom.
  • Lepsza inicjalizacja mapy użyto prostszego zapisu m_preloadedEntities[mapIndex] = std::unordered_set<uint32_t>()
  • Dane były zapisywane bezpośrednio do TEMP_BUFFER, co mogło prowadzić do wielokrotnej alokacji pamięci. W nowej wersji użyto std::vector<uint8_t>, który najpierw zbiera dane, a potem przekazuje je do TEMP_BUFFER (w moim przypadku było 950 rekordów zapisu Entities)
  • Dodano warunek ' if ' 
  • Nowa wersja unika potencjalnych problemów z pamięcią dzięki użyciu std::vector i dynamic_cast, co zmniejsza ryzyko wycieków pamięci i błędów.

Server/game/src/sectree_manager.cpp

#ifdef ENABLE_ENTITY_PRELOADING
void SECTREE_MANAGER::GeneratePreloadedEntitiesMap(int32_t mapIndex, LPSECTREE_MAP lpMapSectree) {
	if (m_preloadedEntities.find(mapIndex) == m_preloadedEntities.end()) {
		m_preloadedEntities[mapIndex] = std::unordered_set<uint32_t>();
		auto lmbd = [&mapIndex, this](LPENTITY ent) {
			if (auto ch = dynamic_cast<LPCHARACTER>(ent)) {
				this->m_preloadedEntities.at(mapIndex).emplace(ch->GetRaceNum());
			}
		};
		lpMapSectree->for_each(lmbd);
		for (const auto& race : m_preloadedEntities.at(mapIndex)) {
			sys_log(0, "ENTITY_PRELOADING: [map: %d], [entity race: %d]", mapIndex, race);
		}
	}
}
void SECTREE_MANAGER::ExtendPreloadedEntitiesMap(int32_t mapIndex, uint32_t mob_race) {
	auto it = m_preloadedEntities.find(mapIndex);
	if (it == m_preloadedEntities.end()) return;
	if (it->second.emplace(mob_race).second) {
		sys_log(0, "ENTITY_PRELOADING: extended [map: %d], with [entity race: %d]", mapIndex, mob_race);
	}
}
void SECTREE_MANAGER::SendPreloadEntitiesPacket(LPCHARACTER ch) {
    if (!ch) return;
    auto d = ch->GetDesc();
    if (!d) return;
    auto lMapIndex = ch->GetMapIndex();
    auto it = m_preloadedEntities.find(lMapIndex);
    if (it == m_preloadedEntities.end() || it->second.empty()) return;
    // rezerwacja pamięci
    std::vector<uint8_t> tempBuffer;
    tempBuffer.reserve(it->second.size() * sizeof(uint32_t));
    // Zapisz dane do bufora
    for (const auto& race : it->second) {
        const uint8_t* raceBytes = reinterpret_cast<const uint8_t*>(&race);
        tempBuffer.insert(tempBuffer.end(), raceBytes, raceBytes + sizeof(uint32_t));
    }

    TEMP_BUFFER buf;
    buf.write(tempBuffer.data(), tempBuffer.size());
    TPacketGCPreloadEntities pack{};
    pack.header = HEADER_GC_PRELOAD_ENTITIES;
    pack.count = static_cast<uint16_t>(it->second.size());
    pack.size = sizeof(pack) + buf.size();

    d->BufferedPacket(&pack, sizeof(pack));
    d->Packet(buf.read_peek(), buf.size());
}
#endif


UserInterface/PythonNetworkStreamPhaseGame.cpp

#ifdef ENABLE_ENTITY_PRELOADING
bool CPythonNetworkStream::RecvPreloadEntitiesPacket() {
    TPacketGCPreloadEntities pack{};
    if (!Recv(sizeof(pack), &pack)) {
		Tracef("Failed to receive preload entities packet header");
        return false;
    }
    if (static_cast<int32_t>(pack.size) - sizeof(pack) != pack.count * sizeof(uint32_t)) {
		Tracef("Invalid preload entities packet size");
        return false;
    }
    uint32_t dwEntityRace = 0;
    CInstanceBase::SCreateData d{};
    auto& rkChrMgr = CPythonCharacterManager::Instance();
    for (uint16_t i = 0; i < pack.count; ++i) {
        if (!Recv(sizeof(uint32_t), &dwEntityRace)) {
			Tracef("Failed to receive entity race data");
            return false;
        }
 #ifdef _DEBUG
        TraceError("Preloading %d", dwEntityRace);
 #endif
        d.m_dwRace = dwEntityRace;
        d.m_dwVID = dwEntityRace;
        if (rkChrMgr.CreateInstance(d)) {
            rkChrMgr.DeleteInstance(dwEntityRace);
        } else {
 #ifdef _DEBUG
            TraceError("Failed to preload race %d", dwEntityRace);
 #endif
        }
    }
    return true;
}
#endif

 

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...