Opublikowano 12 Stycznia12 Sty Inaczej mała optymalizacja załadowania map w wersji rozszerzonej, na devie jest tylko podstawowa od amuna src: - commonDefines.h dodaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się char_manager.cpp poszukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się przed: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się input_login.cpp poszukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj nad: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się packet.h poszukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj pod: // jak masz zajęte miejsce 211 to zmień na inne byle żeby pasowało w src i bin. 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się przed: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się sectree_manager.cpp poszukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj pod: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się poszukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj pod: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się sectree_manager.h w includach daj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się poszukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj pod: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się szukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj pod: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się przechodzimy teraz do bin w locale_inc.h daj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się packet.h szukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj pod: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się przed: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj nad: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się PythonNetworkStream.cpp szukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj pod: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się PythonNetworkStream.h szukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj pod: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się PythonNetworkStreamPhaseGame.cpp szukaj: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj pod: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się dodaj na koncu: 🔐 Ukryta Treść 🔐 Zaloguj się lub Zarejestruj się
Opublikowano 2 Lutego2 Lut 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
Inaczej mała optymalizacja załadowania map w wersji rozszerzonej, na devie jest tylko podstawowa od amuna
src:
- commonDefines.h
dodaj:
char_manager.cpp
poszukaj:
przed:
dodaj:
input_login.cpp
poszukaj:
dodaj nad:
packet.h
poszukaj:
dodaj pod:
// jak masz zajęte miejsce 211 to zmień na inne byle żeby pasowało w src i bin.
przed:
dodaj:
sectree_manager.cpp
poszukaj:
dodaj pod:
poszukaj:
dodaj pod:
sectree_manager.h
w includach daj:
poszukaj:
dodaj pod:
szukaj:
dodaj pod:
przechodzimy teraz do bin
w locale_inc.h daj:
packet.h
szukaj:
dodaj pod:
przed:
dodaj nad:
PythonNetworkStream.cpp
szukaj:
dodaj pod:
PythonNetworkStream.h
szukaj:
dodaj pod:
PythonNetworkStreamPhaseGame.cpp
szukaj:
dodaj pod:
dodaj na koncu: