Skocz do zawartości
Masz już aplikację Sharegon?

Odkryj wszystkie możliwości. Dowiedz się więcej

Sharegon.pl

Zainstaluj aplikację Sharegon i korzystaj z powiadomień push oraz licznika nowych aktywności bezpośrednio z ekranu głównego.

Aby zainstalować tę aplikację na iOS i iPadOS.
  1. Tap the Share icon in Safari
  2. Przewiń menu i stuknij Dodaj do ekranu początkowego.
  3. Stuknij Dodaj w prawym górnym rogu.
Zainstaluj aplikację Sharegon na Androidzie
  1. Otwórz Sklep Google Play na swoim smarfonie.
  2. Wyszukaj „Sharegon” w pasku wyszukiwania.
  3. Stuknij „Zainstaluj”, aby pobrać aplikację.

Entity Preloading - Extensive version.

Featured Replies

Opublikowano

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:

 

  • 3 tygodnie później...
Opublikowano
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

 

  • 9 miesięcy temu...
  • 1 miesiąc temu...

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Konto

Nawigacja

Skonfiguruj powiadomienia push w przeglądarce.

Chrome (Android)
  1. Stuknij ikonę kłódki obok paska adresu.
  2. Wybierz Uprawnienia → Powiadomienia.
  3. Dostosuj swoje preferencje.
Chrome (Desktop)
  1. Kliknij ikonę kłódki na pasku adresu.
  2. Wybierz Ustawienia witryny.
  3. Znajdź Powiadomienia i dostosuj swoje preferencje.