Die Funktion selber ist ja nur ein zurückgeben einer Variable. Also ansich kannst du auch die Variable direkt nutzen.
Es verbraucht also weniger als wenn ich Eine Schleife bei 200 Slots habe jedoch nur 150 belegt sind.
Schnellere Spieler orientierte Schleifen
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Also ansich kannst du auch die Variable direkt nutzen.
Nein, da ich die Include mit einer static Deklaration gemacht habemfg.
-
Fuck ich meinte die Standard Funktion MAX_PLAYER bzw. ein vorher deklarierter Wert
-
Fuck ich meinte die Standard Funktion MAX_PLAYER bzw. ein vorher deklarierter Wert
Ja eben nicht, weil bei MAX_PLAYERS die Schleife z.B. 500 oder 50x durchgeführt wird und bei mir wird genau nach der höchsten id gesucht sprich, wenn 5 Spieler online sind, wird die Schleife nur 5x durchgeführt und das ist wesentlich schneller und besser !mfg.
-
Wenn aber X Spieler online sind, und die Spieler von vorne an beginnen den Server zu verlassen sinkt bei dir die höchste ID wieder, das heißt die hintersten Spieler werden einfach ignoriert.
Außerdem bringt es nicht so viel, da unbelegte Slots/IDs dennoch durchgegangen werden. Das lässt sich aber auch nicht so leicht vermeiden.
-
Wenn aber 50 Spieler online sind, und die Spieler von vorne an beginnen den Server zu verlassen sinkt bei dir die höchste ID wieder, das heißt die hintersten Spieler werden einfach ignoriert.
Falsch, du hast die Include anscheinend nicht verstandenAußerdem bringt es nicht so viel, da unbelegte Slots/IDs dennoch durchgegangen werden. Das lässt sich aber auch nicht so leicht vermeiden.
Nicht wenn MAX_PLAYERS > höchste spielerid ist (und das ist zu 99.9% der Fall)
//Edit: Sprich solange MAX_PLAYERS > höchste spielerid ist, hat meine Funktion einen Vorteil !mfg.
-
if(playerid == h_ID && playerid > 0) h_ID--;
Sagt da aber was anderes. Du setzt die ID beim connecten auf die höchste playerid, beim verlassen ziehst du aber nur eins ab. Sinnvoller wäre es, die höchste ID zu holen (dazu wäre aber eine Schleife nötig). Das löst ganz nebenbei auch das o.g. Problem. -
Sagt da aber was anderes. Du setzt die ID beim connecten auf die höchste playerid, beim verlassen ziehst du aber nur eins ab. Sinnvoller wäre es, die höchste ID zu holen (dazu wäre aber eine Schleife nötig). Das löst ganz nebenbei auch das o.g. Problem.
Nicht wirklichEs gibt gar kein Problem, das bildest du dir gerade irgendwie ein...
Sobald die höchste Spielerid disconnected, wird der Wert um 1 reduziert, sehr richtig, das hat zwar zur folge, dass es nicht sonderlich genau ist, aber tortzdem, ist das die höchste Spielerid und somit werden alle Spieler in einer Schleife mit dieser Variable berücksicht
Wie du sagst, man bräuchte eine weitere Schleife um jetzt auf die genaue Anzahl der Spieler wieder zu stoßen, ich finde allerdings, dass ist irrelevant da ein sehr naher Wert denke ich mal völlig ausreicht
mfg.
-
Hallo,
anscheinend ist da noch ein Flüchtigkeitsfehler drinnen:
return CallLocalFunction("_OnPlayerConenct", "i", playerid);
Du hast _OnPlayerConenct nicht geforwardet sondern _OnPlayerConnect
forward _OnPlayerConnect(playerid);MfG
-
Zitat
gibt diese Funktion die höchste spielerid auf dem Server wieder, dies macht die Schleifen erheblich schneller und
ressourcenschonender
Was ist "erheblich" schneller ? 1ms auf 100.000.000 Durchläufen ? Die Wortwahl ist mMn total irreführend.
Das Gleiche gilt für "Ressourcenschonender". Ich bin auch der Meinung,dass du es nur geschrieben hast damit man hier eine Art
"Wow" Effekt entsteht.Unerfahrene Scripter werden durch so eine Wortwahl fehlgelenkt. Denn bei den Schleifen anzusetzen um sein Script
zu optimieren ist nicht der richtige Punkt. Auch gibt es Fälle,bei denen deine Methode sogar langsamer ist als die Nutzung von MAX_PLAYERS.Es ist auch keine Neuheit und sowas gibt es bereits um Welten besser von anderen Autoren.
Übrigens:
for(new i , j = GetID() ; i < j; i++)
So wäre es theoretisch noch schneller.ZitatWie du sagst, man bräuchte eine weitere Schleife um jetzt auf die genaue Anzahl der Spieler wieder zu stoßen, ich finde
allerdings, dass ist irrelevant da ein sehr naher Wert denke ich mal völlig ausreicht
Ja genau...sehr naher Wert völlig ausreicht .
Denn mit extra Funktion eine Schleife bis 498 durchzuführen ist ja auch wirklich besser als eine Schleife die immer bis 499 geht .. .Punktewertung lasse ich aus,würde nämlich nicht positiv ausfallen.
-
Sagt da aber was anderes. Du setzt die ID beim connecten auf die höchste playerid, beim verlassen ziehst du aber nur eins ab. Sinnvoller wäre es, die höchste ID zu holen (dazu wäre aber eine Schleife nötig). Das löst ganz nebenbei auch das o.g. Problem.
Schau dir mal meine version an, dort ist es mit der schleife gelösst, da ich mir die selben gedanken gemacht habe.
Natürlich ist diese Include nicht so gut wie Foreach. -
Denn mit extra Funktion eine Schleife bis 498 durchzuführen ist ja auch wirklich besser als eine Schleife die immer bis 499 geht .. .
Also das ist ja mal ein Scherz -.-
Hallo,
anscheinend ist da noch ein Flüchtigkeitsfehler drinnen:
return CallLocalFunction("_OnPlayerConenct", "i", playerid);
Du hast _OnPlayerConenct nicht geforwardet sondern _OnPlayerConnect
forward _OnPlayerConnect(playerid);MfG
Gutes Argument...trotzdem funktioniert es, verstehe ich gerade selber nicht
Punktewertung lasse ich aus,würde nämlich nicht positiv ausfallen.
Was würdest du denn Bewerten, den Code oder den sinnvollen Nutzen, der ja für dich irrelevant sein kann, da du es ja nicht nutzen wirstmfg.
-
Was würdest du denn Bewerten, den Code oder den sinnvollen Nutzen, der ja für dich irrelevant sein kann, da du es ja nicht nutzen wirst
Code 1 Punkt
(sinnvollen) Nutzen 0 PunkteDu hättest 2 Punkte für Nutzen bekommen, wenn du nicht mit static gearbeitet, der Variable einen vernünftigen Namen gegeben und die Funktion GetID rausgelassen hättest.
Dann wäre es noch sinnvoll und definitv einigermaßen nutzbar.Du redest von ressourcen "Schonung", verlangst aber vom Scripter immer wieder eine Funktion in der Schleife aufzurufen, auch wenn die nur einen Wert zurück gibt.
Ernsthaft was soll der quatsch?
Die Warscheinlichkeit das ein Spieler in dem momment Connected in der die Schleife gerade läuft, ist gleich 0.Du machst wieder genau das, was ich dir letztesmal gesagt habe: Du denkst einfach NICHTS zu Ende.
Es ist ja schön und gut, wenn du Dinge vereinfachen möchtest und auf ressurcenschonung ziehlst.
DIe erste Version die du Released hast, war schlimmer als das hier.@dead: hat auch vollkommen richtig erkannt, das dieser Code
if(playerid == h_ID && playerid > 0) h_ID--;
einfach nicht so funktioniert wie du dir das vorstellst.
So wie fast alle deine Includes.
Sei dein Streamer oder deine Limit Include oder dein Inventar "System".Beispiel:
Spieler 1,2,3,6,9 sind auf dem Server
h_ID steht jetzt auf 9ID 9 verlässt den Server.
Was passiert?
h_ID steht jetzt auf 8 und das obwohl die nächste höchste ID 6 wäreich find auch diesen Code
if(playerid > h_ID) h_ID = playerid;
sehr sinnvoll
Kein Spieler connected - h_ID ist 0
Ein Spieler connected - h_ID ist 0
Noch ein Spieler connected - h_ID ist 1Du hast IMMER egal welche Situation, einen "Slot" zuwenig
Es tut mir auch nicht wirklich Leid das ich hier kein gutes Haar an der Include hinterlasse,
ich kann nicht mal etwas positives darüber sagen - was absolut traurig ist. -
Sei dein Streamer oder deine Limit Include oder dein Inventar "System".
Irgendwie stimmt das ja mal so überhaupt nichtBeispiel:
Spieler 1,2,3,6,9 sind auf dem Server
h_ID steht jetzt auf 9ID 9 verlässt den Server.
Was passiert?
h_ID steht jetzt auf 8 und das obwohl die nächste höchste ID 6 wäre
LoL, das habe ich doch oben schon gesagt, dead meint aber was völlig anderes !Kein Spieler connected - h_ID ist 0
Ein Spieler connected - h_ID ist 0
Noch ein Spieler connected - h_ID ist 1
Denk mal über den Code nach, das ist so richtigder Variable einen vernünftigen Namen gegeben
Na, h_ID, h = highest ID = playerid ? Finde ich sinvoll...Die Warscheinlichkeit das ein Spieler in dem momment Connected in der die Schleife gerade läuft, ist gleich 0.
Welche Schleife -
Welche Schleife
Dann ist der Titel und die erste Zeile in der Include also nur zufällig dahin gekommen?
InteressantNa, h_ID, h = highest ID = playerid ? Finde ich sinvoll...
Ohne kontext macht das ja auch keinen Sinn - statt static new benutzen - ihr einen vernünftigen Namen geben, so das sie im Script auch verwendbar ist.
Das hab ich gemeintDenk mal über den Code nach, das ist so richtig
Das sagt gerade der richtige.
if(playerid > h_ID) h_ID = playerid;
Wo ist hier bitte die Logik?Spieler mit ID 0 connected h_ID = 0
for(new i;i<GetID();i++)
{
//tue was
}
Dieser Code wird absoult nicht ausgeführt.
Warum weil i 0 ist und GetID 0 zurück gibt -> false da 0 nicht kleiner als 0 ist.Sinnvoll wäre es hier h_ID = playerid+1; zu nehmen,
da sonst einfach ein Slot fehltLoL, das habe ich doch oben schon gesagt, dead meint aber was völlig anderes !
Dead meinte GENAU das - du hast dich wieder mit "ungefährer Wert" rausgeredet
-
Dead meinte GENAU das - du hast dich wieder mit "ungefährer Wert" rausgeredet
Dann lese den Beitrag mal richtig, der hat was anderes noch gemeint !Dann ist der Titel und die erste Zeile in der Include also nur zufällig dahin gekommen?
Interessant
Ja natürlich -.-Ohne kontext macht das ja auch keinen Sinn - statt static new benutzen - ihr einen vernünftigen Namen geben, so das sie im Script auch verwendbar ist.
Das hab ich gemeint
Ja ist sowasWo ist hier bitte die Logik?
Die Logik ist die, dass h_ID den Wert der höchsten playerid hat, was ja auch zutrifft...Sinnvoll wäre es hier h_ID = playerid+1; zu nehmen,
da sonst einfach ein Slot fehlt
Ja, müsste man dann wohl so machen... -
Zitat von »BlackAce«
Wo ist hier bitte die Logik?Die Logik ist die, dass h_ID den Wert der höchsten playerid hat, was ja auch zutrifft...
Er möchte dir klar machen das wenn playerid = 0 und h_id = 0 ist das die Schleife dann NICHT ausgeführt wird! -
Er möchte dir klar machen das wenn playerid = 0 und h_id = 0 ist das die Schleife dann NICHT ausgeführt wird!
Er hat nach der Logik hinter der Abfrage gefragt und das ist sie -.-Das er das damit meint ist mir auch klar, schreibe ich doch im Zitat drunter...
-
Mein Fehler
Aber wie man sieht, kann man um "schnelligkeit" und nutzen immer streiten -
Ja ist sowas
Sicherlich nicht - ein Funktionsaufruf dauert länger als eine Variable auszulesen - das ist Grundwissen mein lieber
Du hast ja static benutzt - deswegen ist es im Script NICHT nutzbar.Deswegen sollst du new verwenden und ihr einen vernünftigen Namen geben - sie MAXID - oder MAX_ID - etwas was man auch wirklich zuordnen kann