Guten Abend, ich möchte euch etwas über Ressourcenschonendes Scripten in Sa-Mp erzählen.
1. Player-for-Schleifen optimieren
Für die meisten User sieht eine for-Player-Schleife so aus:
for (new playerid=0; playerid<MAX_PLAYERS; playerid++)
{
//Beispiel aus Yless Server Addon
SetPlayerGravity(playerid, 0.008);
}
Doch sehen wir uns das mal genauer an. MAX_PLAYERS, ist der definierte Wert von Sa-Mp und ist in 0.2.2 als 200 deklariert. Warum sollten wir den eine for Schleife 200 mal auf einem 32 Slot Server laufen lassen. Also helfen wir uns dort mit GetMaxPlayers() ab. Diese Funktion returnt die maximale Anzahl der Player.
for (new playerid=0; playerid<GetMaxPlayers(); playerid++)
{
//Beispiel aus Yless Server Addon
SetPlayerGravity(playerid, 0.008);
}
Doch warum lassen wir die Schleife für jede ID die nicht online ist mitlaufen? Auch wenn Samp vor jedem Absenden selber cheackt ob der Player online ist, sollten wir dies per Pawn regeln. Hier arbeiten wir mit IsPlayerConnected(playerid);
for (new playerid=0; playerid<GetMaxPlayers(); playerid++)
{
if(IsPlayerConnected(playerid))
{
//Beispiel aus Yless Server Addon
SetPlayerGravity(playerid, 0.008);
}
}
2. Die Timer Funktionen
Ich kann mich noch an SampRL in der ersten Generation erinnern. Für jede Kleinigkeit wurde ein Timer gesettet. Das ist jedoch sinnlos, es sei den der Timer wird nich wiederholt. Für alle sich wiederholenden Timer gilt, ein Timer für alles reicht. Doch dieser sollte möglichst optimiert sein.
#define MAX_TIMERS 20
new timertime[MAX_TIMERS];
new acttimertime[MAX_TIMERS];
forward GeneralTimer();
public OnGameModeInit()
{
SetTimer("GeneralTimer", 1000, true);
return 1;
}
public GeneralTimer()
{
for(new timer=0; timer<MAX_TIMERS; timer++)
{
acttimertime[timer]++;
if(timertime[timer] == acttimertime[timer])
{
acttimertime[timer] = 0;
for(new playerid=0; playerid<GetMaxPlayers(); playerid++)
{
//Hier wird Beispielsweise für jedne Player etwas gecheckt
}
}
}
return 1;
}
Dies ist ein Beispiel wie ein General Timer aussehen könnte. Ein bessere und einfachere Methode gibt es hier: ProTimer System
3. Strings
Auch hier erinnere ich mich nur an die erste Scriptgeneration von SampRL. Zu jedem String wurden gleich hohe, unbenötigte Werte zugeordnet.
Beispiel:
new str[256];
format(str, 256, "%s.name", /*GetPlayerName()*/);
Auch hier stellt sich die Frage, warum stellen wir 256 Zeichen zur Verfügung wenn in Samp max. 32 gehen? 32 plus die 5 Zeichen von .name reichen also vollkommen aus. Desweiteren sollten wir hier auch mir sizeof(string) arbeiten, um die Funktion einfacher zu ändern, falls etwas eintritt.
new str[37];
format(str, sizeof(str), "%s.name", /*GetPlayerName()*/);
Schon haben wir den String abgeschlackt. Besonders Multidimensionale Array wie Strings sind in PAWN sehr Ressourcenfressend.
Ich werde das Tutorial weiter ergänzen sobald ich Lust und Laune habe. Ich hoffe ich konnte euch etwas helfen, ich gehe jetzt Simpsons gucken.