Das liegt zum einen daran dass unnötig viel KOMPLETT SINNLOSER Code im Hintergrund läuft, der das Spiel nicht nur langsam macht, sondern den Computer auchnoch unnötig warmlaufen lässt.
Man könnte meinen, Aeonsoft hätte für diesen Müll von den Stromkonzernern Geld zugeschoben bekommen.
Die Frage lautet aber doch:
Wie zum Teufel mache ich meinen Client schneller?
1 :
Das erste worauf ihr achten solltet sind Codeschnipsel die wirklich unnötig sind.
Ein Paradebeispiel dafür ist die Funktion OnAfterLoadPropitem(), die eigentlich nur für den Server relevant ist.
Wenn man die Funktion vom Clienten unbeachtet lässt, läd der Client gleich etwas schneller - ganz ohne Nebeneffekte.
2 :
Codeteile die unnötigen Code enthalten oder unnötig viel Code ausführen der garnicht notwendig ist.
Nach weiteren Tests hat sich herausgestellt, dass FOR_LAND_NEAR nur in bestimmten Fällen schneller ist, ihr solltet deshalb von dieser Änderung in eurem eigenen Interesse absehen.
Dafür gibts was anderes :
CModelObject::FrameMove( D3DXVECTOR3 *pvSndPos, float fSpeed )
Die Funktion enthält diesen Teil :
Quote:
int i = ( m_nFrameOld + 1 ) % GetMaxFrame();
int nFrame = ( static_cast<int>( m_fFrameCurrent ) + 1 ) % GetMaxFrame();
while( i != nFrame )
{
BOOL bAttr = FALSE;
/*
MOTION_ATTR* pAttr = IsAttrSound( i );
if( pAttr && pAttr->m_nSndID > 0 && m_nPause == 0 )
{
PLAYSND( pAttr->m_nSndID, pvSndPos );
bAttr = TRUE;
}
*/
BOOL bQuake = IsAttrQuake( (float)( i ) );
if( bQuake && m_nPause == 0 )
{
CMover *pMover = CMover::GetActiveMover();
if( pMover )
{
ItemProp* pItemProp = pMover->GetActiveHandItemProp();
if( pItemProp && pItemProp->dwItemKind3 != IK3_YOYO && !pMover->IsActiveMover() )
{
pMover->GetWorld()->m_pCamera->SetQuake( 15 );
bAttr = TRUE;
}
}
}
if( bAttr )
break;
i = ( i + 1 ) % GetMaxFrame();
}
Welcher Code sich um folgendes Statement geht:
Welches aber NIE ausgeführt werden kann weil :Quote:
pMover->GetWorld()->m_pCamera->SetQuake( 15 );
bAttr = TRUE;
Der Code setzt einen Pointer zum aktuellen Spieler und führt den Code nur dann aus wenn der aktuelle Spieler nicht der aktuelle Spieler ist. Was so ziemlich nie eintreten wird / kann.Quote:
CMover *pMover = CMover::GetActiveMover();
if( pMover )
{
ItemProp* pItemProp = pMover->GetActiveHandItemProp();
if( pItemProp && pItemProp->dwItemKind3 != IK3_YOYO && !pMover->IsActiveMover() )
Am besten dieses ganze Codesegment entfernen.
3 :
Operationen die einfach ZU OFT ausgeführt werden.
Warum soll ich 63 mal in der Sekunde prüfen, ob sich im Equip des Spielers ein Objekt befindet dass nicht gerendert werden muss?
Beispiel hierfür ist die Funktion OverCoatItemRender.
Sie sollte nur ausgeführt werden, wenn sich auch tatsächlich was am Equip des Spielers ändert - und zusätzlich alle 2~10 Sekunden.
So spart ihr jede Menge CPU Zeit.
4 :
Funktionen die ausgeführt werden, obwohl sie in einem bestimmten Kontext total sinnfrei sind.
Biespiel hier : CWndTaskBar::Process( void )
Diese Funktion überprüft ob der Mauszeiger auf einem der Iconfelder liegt, um eventuelle Tooltips anzuzeigen.
Und das sogar wenn der Mauszeiger nichtmal in der Nähe der Taskleiste ist.
Und ja - er macht es jedesmal für alle Items in der Taskleiste.
Mit einem
um den entsprechenden Teil der Funktion rumQuote:
CRect rect = GetWindowRect();
if( rect.PtInRect( point) )
{
}
(
Ab
CPoint point = GetMousePoint();
Bis
if( m_nExecute )
)
Lässt sich das ganze eingrenzen.
5 :
Bis zum bitteren Ende.
Nicht nur , dass der Buffrender in epischem Ausmaße FPS frisst, nein er sorgt auch dafür dass euer Client langsam läd.
Circa eine halbe Sekunde auf einem Highend Rechner wie meinem lassen sich mit der Überarbeitung des Buffrenders allein beim einloggen sparen.
Genaueres findet ihr dazu in CWndWorld::OnInitialUpdate bei der Variable
m_pBuffTexture
Wenn ihr den Clienten durchsucht werdet ihr hunderte solche Fälle finden.
Mit ein bisschen Nachdenken könnt ihr diesen Resourceverschwendungen ein Ende machen.






