Opublikowano 12 Stycznia 20251 r Inaczej mała optymalizacja załadowania map w wersji rozszerzonej, na devie jest tylko podstawowa od amuna src: - commonDefines.h dodaj: Tylko zalogowani Zaloguj się, aby wyświetlić chronioną treść Ten post zawiera treści dostępne tylko dla członków. Zaloguj się lub utwórz konto, aby odblokować całą zawartość tego posta. Zaloguj się Utwórz konto 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:
Opublikowano 2 Lutego 20251 r W dniu 12.01.2025 o 15: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 CKod został skopiowany#ifdef ENABLE_ENTITY_PRELOADINGvoid 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 CKod został skopiowany#ifdef ENABLE_ENTITY_PRELOADINGbool 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
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto