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ę.

Zmiana CH – chwilowy freeze przed loadingiem

Featured Replies

Opublikowano

Cześć,

mam pytanie odnośnie zmiany CH.

Czy ktoś z Was wie, dlaczego przed zmianą kanału ekran na chwilę się „freezuje”, a dopiero po 1–3 sekundach przechodzi dalej (najpierw screen loading, potem postać)?

U mnie wygląda to tak:

– odliczanie 3, 2, 1

– krótki freeze (ok. 1–3 sekundy)

– dopiero potem ładowanie i zmiana CH

Próbowałem już grzebać w src klienta oraz w plikach pack, ale niestety nic nie udało mi się znaleźć ani poprawić — problem cały czas występuje.

Czy to jest normalne zachowanie (np. związane z połączeniem/relogiem na inny kanał), czy raczej coś mam źle skonfigurowane?

Będę wdzięczny za każdą wskazówkę 🙂

Edytowane przez necro93

Rozwiązane przez necro93

Opublikowano

Hej Necro,

Podeślij fragment networkmodule / selectcharacter

NetworkModule Najczęściej:

TextKod został skopiowany
client/src/UserInterface/PythonNetworkStream.cppclient/src/UserInterface/PythonNetworkStream.hclient/src/NetworkModule.cppclient/src/NetworkModule.h

SelectCharacter (wybór postaci / wejście do gry) Najczęściej:

TextKod został skopiowany
client/src/UserInterface/PythonCharacterManager.cppclient/src/UserInterface/PythonNetworkStreamPhaseSelect.cppclient/src/UserInterface/PythonNetworkStreamPhaseGame.cpp

Python (UI – ważne)

TextKod został skopiowany
client/root/uiSelectCharacter.pyclient/root/uiLogin.pyclient/root/game.py

Nie wiem mogę się mylić, ale to tam chyba wszystko się dzieje.

Opublikowano
  • Autor

Jak będę w domu to z ciekawości to sprawdzę ale wydaje mi się że to chyba nie rozwiąże problemu bo to chyba jest podczas wyboru postaci a głównie mi zależy na tym freeze.

Ale szczerze mówiąc nie bardzo widzę, co dokładnie może powodować ten freeze przed zmianą CH. Wygląda to tak, jakby klient na chwilę się zatrzymywał przed przełączeniem fazy / reconnectem.

Coś w stylu jak tutaj w tym temacie ale to podczas poruszania klientem po pulpicie. Mam to w planach zrobić ale najpierw chce uporać się z tym problemem.

https://sharegon.pl/topic/449-napraw-zawieszanie-si%C4%99-gry-podczas-przeci%C4%85gania-klienta/#comment-4619

Edytowane przez necro93

Opublikowano
W dniu 19.03.2026 o 13:34, roller napisał(a):

Hej Necro,

Podeślij fragment networkmodule / selectcharacter

NetworkModule Najczęściej:

TextKod został skopiowany
client/src/UserInterface/PythonNetworkStream.cppclient/src/UserInterface/PythonNetworkStream.hclient/src/NetworkModule.cppclient/src/NetworkModule.h

SelectCharacter (wybór postaci / wejście do gry) Najczęściej:

TextKod został skopiowany
client/src/UserInterface/PythonCharacterManager.cppclient/src/UserInterface/PythonNetworkStreamPhaseSelect.cppclient/src/UserInterface/PythonNetworkStreamPhaseGame.cpp

Python (UI – ważne)

TextKod został skopiowany
client/root/uiSelectCharacter.pyclient/root/uiLogin.pyclient/root/game.py

Nie wiem mogę się mylić, ale to tam chyba wszystko się dzieje.

majster nawet nie wiadomo o co chodzi a ty przepisujesz jego pytanie do chata i wrzucasz odpowiedz daj mu napisac o co chodzi nawet nie wiadomo o jakie pliki chodzi

teraz każdy mądry przez to AI xd

Opublikowano

Jak Ci bardzo zależy to wystarczy przejrzeć gdzie w main thread kod się "blokuje". Polecam zajrzeć w CPythonApplication::Process i tam sobie wypluć logi. Jeśli masz podejrzenie, że jest to związane z pakietami to wypluj sobie logi w np.

bool CNetworkStream::Recv(int len, void* pDestBuf)

Jak nie logi to debugger no i tyle. Powodzenia.

Opublikowano
  • Autor
  • Rozwiązanie
W dniu 19.03.2026 o 19:17, pampuch napisał(a):

Jak Ci bardzo zależy to wystarczy przejrzeć gdzie w main thread kod się "blokuje". Polecam zajrzeć w CPythonApplication::Process i tam sobie wypluć logi. Jeśli masz podejrzenie, że jest to związane z pakietami to wypluj sobie logi w np.

bool CNetworkStream::Recv(int len, void* pDestBuf)

Jak nie logi to debugger no i tyle. Powodzenia.

Sprawdzę to, dam znac jak wrócę z pracy. :)

Rozwiązane! Może komuś się to przyda!

Opis:

Koniec freezu po zmianie CH, odliczenie czasu 3-2-1.., jedno szybkie okno ładowania, wejście na postać bez zawieszki. C++ i Python są zsynchronizowane, a wybór postaci wysyła się tylko raz we właściwej chwili.

https://youtu.be/fW2y3YgaWss

SourceClient/UserInterface/PythonNetworkStreamPhaseGame.cpp:

Znajdz:

C++Kod został skopiowany
bool CPythonNetworkStream::RecvWarpPacket(){	TPacketGCWarp kWarpPacket; 	if (!Recv(sizeof(kWarpPacket), &kWarpPacket))		return false; 	Sleep(2000); 	CNetworkStream::PingPort(kWarpPacket.lAddr, kWarpPacket.wPort);	CNetworkStream::Connect((DWORD)kWarpPacket.lAddr, kWarpPacket.wPort); 	return true;}

Zamień:

C++Kod został skopiowany
bool CPythonNetworkStream::RecvWarpPacket(){	TPacketGCWarp kWarpPacket;	if (!Recv(sizeof(kWarpPacket), &kWarpPacket))		return false;	SetLoadingPhase();	__DirectEnterMode_Set(m_dwSelectedCharacterIndex);	CNetworkStream::PingPort(kWarpPacket.lAddr, kWarpPacket.wPort);	CNetworkStream::Connect((DWORD)kWarpPacket.lAddr, kWarpPacket.wPort);	return true;}

W PythonNetworkStreamPhaseLoading.cpp

Znajdz:

C++Kod został skopiowany
void CPythonNetworkStream::SetLoadingPhase(){	if ("Loading"!=m_strPhase)		m_phaseLeaveFunc.Run(); 	Tracen("");	Tracen("## Network - Loading Phase ##");	Tracen(""); 	m_strPhase = "Loading"; 	m_dwChangingPhaseTime = ELTimer_GetMSec();	m_phaseProcessFunc.Set(this, &CPythonNetworkStream::LoadingPhase);	m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveLoadingPhase); 	CPythonPlayer& rkPlayer=CPythonPlayer::Instance();	rkPlayer.Clear(); 	CFlyingManager::Instance().DeleteAllInstances();	CEffectManager::Instance().DeleteAllInstances(); 	__DirectEnterMode_Initialize();}

Zamień:

C++Kod został skopiowany
void CPythonNetworkStream::SetLoadingPhase(){	const std::string strPrevPhase = m_strPhase; 	if ("Loading"!=m_strPhase)		m_phaseLeaveFunc.Run(); 	Tracen("");	Tracen("## Network - Loading Phase ##");	Tracen(""); 	m_strPhase = "Loading"; 	m_dwChangingPhaseTime = ELTimer_GetMSec();	m_phaseProcessFunc.Set(this, &CPythonNetworkStream::LoadingPhase);	m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveLoadingPhase); 	CPythonPlayer& rkPlayer=CPythonPlayer::Instance();	rkPlayer.Clear(); 	CFlyingManager::Instance().DeleteAllInstances();	CEffectManager::Instance().DeleteAllInstances(); 	__DirectEnterMode_Initialize(); 	if (strPrevPhase == "Game" && m_poHandler)		PyCallClassMemberFunc(m_poHandler, "BeginLoadingFromGameWarp", Py_BuildValue("()"));}

Kompilacja zrodla... (nowy exe po zmianach w C++)

W pack/root/networkmodule.py

Znajdz:

C++Kod został skopiowany
	def SetLoadingPhase(self):		try:			import introLoading			self.SetPhaseWindow(introLoading.LoadingWindow(self))		except:			import exception			exception.Abort("networkModule.SetLoadingPhase")

Zamień:

C++Kod został skopiowany
	def SetLoadingPhase(self):		try:			import introLoading			if self.curPhaseWindow and isinstance(self.curPhaseWindow, introLoading.LoadingWindow):				if getattr(self.curPhaseWindow, "_pendingSelectCharAfterReconnect", False):					self.curPhaseWindow._pendingSelectCharAfterReconnect = False					net.SendSelectCharacterPacket(self.GetCharacterSlot())				return			self.SetPhaseWindow(introLoading.LoadingWindow(self))		except:			import exception			exception.Abort("networkModule.SetLoadingPhase") 	def BeginLoadingFromGameWarp(self):		try:			import introLoading			self.newPhaseWindow = 0			if self.curtain:				self.curtain.event = 0				self.curtain.FadeInFlag = False				self.curtain.curAlpha = 0.0				self.curtain.Hide()			old = self.curPhaseWindow			self.curPhaseWindow = 0			if old:				old.Close()			w = introLoading.LoadingWindow(self)			w._skipSelectCharacterOnOpen = True			w._pendingSelectCharAfterReconnect = True			w.Open()			self.curPhaseWindow = w		except:			import exception			exception.Abort("networkModule.BeginLoadingFromGameWarp")

W pack/root/introLoading.py

Znajdz:

C++Kod został skopiowany
	def __del__(self):		print "---------------------------------------------------------------------------- DELETE LOADING WINDOW"		net.SetPhaseWindow(net.PHASE_WINDOW_LOAD, 0)		ui.Window.__del__(self) 	# w Open po self.Show():		chrSlot=self.stream.GetCharacterSlot()		net.SendSelectCharacterPacket(chrSlot) 	# OnUpdate (jeden krok):	def OnUpdate(self):		if len(self.loadStepList)>0:			(progress, runFunc)=self.loadStepList[0]			try:				runFunc()			except:				self.errMsg.Show()				self.loadStepList=[]				import dbg				dbg.TraceError(" !!! Failed to load game data : STEP [%d]" % (progress))				app.Exit()				return			self.loadStepList.pop(0)			self._SetProgress(progress)

Zamień:

C++Kod został skopiowany
	def __del__(self):		print "---------------------------------------------------------------------------- DELETE LOADING WINDOW"		net.ClearPhaseWindow(net.PHASE_WINDOW_LOAD, self)		ui.Window.__del__(self) 	# na poczatku Open:		_skipSelectChr = getattr(self, '_skipSelectCharacterOnOpen', False)		if _skipSelectChr:			self._skipSelectCharacterOnOpen = False 	# po self.Show():		if not _skipSelectChr:			chrSlot=self.stream.GetCharacterSlot()			net.SendSelectCharacterPacket(chrSlot) 	# stale (nowe):	# LOAD_STEPS_PER_FRAME_WARP = 6 	def OnUpdate(self):		global _gameAlreadyLoaded		if len(self.loadStepList) <= 0:			return		burst = 1		if OPTIMIZE_TELEPORT_LOADING and _gameAlreadyLoaded:			b = int(LOAD_STEPS_PER_FRAME_WARP)			if b < 1: b = 1			if b > 32: b = 32			burst = b		for _ in xrange(burst):			if len(self.loadStepList) <= 0:				break			(progress, runFunc) = self.loadStepList[0]			try:				runFunc()			except:				self.errMsg.Show()				self.loadStepList = []				import dbg				dbg.TraceError(" !!! Failed to load game data : STEP [%d]" % (progress))				app.Exit()				return			self.loadStepList.pop(0)			self._SetProgress(progress)

Spakować root, tyle. U mnie to dziala.

Pozdrawiam

Edytowane przez necro93

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

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.