Class Initialization & if

01/16/2015 22:58 bloodx#1
Hey Hou, hab ne Frage

Ich habe eine Funktion gehookt um bestimmte Daten zu "Manipulieren" die Funktion wird bei jedem Monster Kill auf'm Server ausgeführt und sollte d.h schnell und sicher sein natürlich.

Habe einen Vector wo bestimmte Spieler drinnen sind und wo geprüft werden muss ob Sie drinnen sind und was der return Wert ist.

PHP Code:
int __declspec(nakedAsmHookAllotExpFunction()
{
    
CVIPSystem VIP;
    
check true;
    
__asm
    
{
            
PUSHAD    //Save  Register
            
PUSHFD // Save FLAGS ?

            
mov        Expeax
            mov     edx
, [ebp 2Ch// PlayerPointer
            
mov        PlayerPtredx
    
}
    if (
PlayerPtr)
    {
        if ((
VIP.IsinVector(PlayerPtr) == 100) && (check == true) )
        {
            
Exp Exp 1.10;
            
check false;
        }
        if ((
VIP.IsinVector(PlayerPtr) == 200) && (check == true) )
        {
            
Exp Exp 1.20;
            
check false;
        } 
Meine erste Frage : Ist es Sinnvoller CVIPSystem VIP; Global zu machen ? somit wird nicht bei jedem Ausführen aufs neue die Class initialisiert ?
oder würde z.b nen std::auto_ptr auch gut sein ?

Meine zweite Frage: Sind die if so gut gemacht ? habe extra den check drinne damit die vectoren nicht alle durchgelaufen werden müssen ?

oder sollte ich da auf etwas anderes setzen ?
01/17/2015 17:59 Schlüsselbein#2
Ist die Funktion zu langsam?
01/17/2015 18:09 bloodx#3
Quote:
Originally Posted by Schlüsselbein View Post
Ist die Funktion zu langsam?
nein, das Problem besteht bisher nicht.

Aber mir ging es um das Verständniss. OB es Sinnvoller ist die Class nicht jedes Mal zu initialisieren.

oder OB die if methode auf diese Weise schlecht gewählt ist.




vielleicht noch eine Frage da google mir im bezug auf das Thema nicht hilft.

CiritcalSection sind sie Sinnvoll beim Hooken ?

Ich Modifizier ja Daten in Player / Item / Monster etc. Objecten vom Server in meiner DLL - WENN der fall auftritt das 2 drauf zugreifen wollen könnte es zu Problemen kommen oder ?
01/17/2015 23:55 MrSm!th#4
Quote:
Meine erste Frage : Ist es Sinnvoller CVIPSystem VIP; Global zu machen ? somit wird nicht bei jedem Ausführen aufs neue die Class initialisiert ?
oder würde z.b nen std::auto_ptr auch gut sein ?
Wenn überhaupt solltest du die Variable static machen. Dann wird sie zum einen erst lazy beim ersten Aufruf der Funktion initialisiert, zum anderen ist ihre Sichtbarkeit dann nicht global. Das ist durchaus ein probates Mittel, um Komplexere Initialisierungen nur einmal auszuführen.
Inwiefern auto_ptr hier aushelfen sollte, verstehe ich nicht ganz (und nein, auto_ptr würde ich nicht mehr nutzen; es gibt bessere Alternativen wie std::unique_ptr).

Quote:
CiritcalSection sind sie Sinnvoll beim Hooken ?
Nur wenn die Funktion aus mehreren Threads aufgerufen wird und dabei Race-Conditions entstehen können.
Ob du dabei CriticalSections oder C++ Locks verwenden solltest, kann ich dir nicht beantworten, da ich mich zu wenig mit den Implementierungen auskenne. Ich bezweifle aber, dass der eine Mechanismus signifikante Vorteile gegenüber dem anderen hat und würde daher aufgrund von Ausnahmesicherheit zu C++ Locks greifen.

Quote:
Ich Modifizier ja Daten in Player / Item / Monster etc. Objecten vom Server in meiner DLL - WENN der fall auftritt das 2 drauf zugreifen wollen könnte es zu Problemen kommen oder ?
Die Sache ist: Wenn du in einem fremden Programm deinen Hook einbringst, kannst du da sowieso nicht vernünftig für Synchronisation sorgen, wenn du nicht gerade jede Stelle kennst, an der auf das Objekt zugegriffen wird, um dort einen Hook zum Anfragen des Locks einzubauen. Locking funktioniert ja nur, wenn jede Funktion sich daran hält, erst auf das Lock zu warten, bevor sie etwas mit dem Objekt tut.
Höchstwahrscheinlich nutzt das Spiel aber selbst schon irgendeine Form von Locks, wenn es mit mehreren Threads arbeitet. Du könntest die Locks des Spiels suchen und mitverwenden.

Wichtig wäre aber zu erwähnen, dass Locking die Performance deiner Funktion deutlich mehr als dein vector beeinflussen würde.

Solange dein vector nicht ein paar Millionen Elemente hat, würde ich mir da über die Performance nicht so große Sorgen machen. Geht es hier eigentlich um Server-Software oder um einen Client? Ich kann mir gerade irgendwie nicht vorstellen, dass wirklich jeder Kill auf dem gesamten Server jedem Client gemeldet wird.