Beiträge von Tjong

    Achso wenn du "länger" auf die Zeit beziehst, die es zur Entwicklung braucht dann muss ich dir zustimmen, wenn man an jeder Ecke nur rumoptimieren würde, würden sich Entwicklungszeiten mit der Zeilenanzahl expotential erhöhen. Aber so ein paar simple Sachen gehen ja schon, vor allem wenn sie schon so wie hier bereitgestellt werden und nicht selber entwickelt werden müssen. Und länger macht ja mein Beitrag dein Skript nicht, es sspart ja sogar nen paar Zeilen weils aus 2 Funktionen nen theoretischen Einzeiler macht, wobei die Anwendung die gleiche ist...

    ich weiß zwar jetzt nicht genau auf welchen Beitrag du dich beziehst, jedoch sind viele Optimierungen auch zur Leserlichkeit und tragen meistens dazu bei, dass das Skript "länger" wird, jedoch nur die .pwn in der .amx ist es dann wieder so als wenn nichts wär (bestes Beispiel Kommentare oder defines)


    Nicht so fiktiv wie man vllt. denkt, es hat wirklich mal jemand im SA-MP Forum diese Funktion im "Useful Functions" Fred gepostet
    Ihr könnt euch sicherlich vorstellen, wie Y_Less danach explodiert ist... :D


    Achja übrigends zur ersten Seite, dass dcmd langsamer sei, als strcmp etc. stimmt natürlich, weils eine neue Funktion aufruft ABER
    in Verbindung mit strcmp wird dann meist strtok verwendet und das ist wiederum der CPU Killer schlecht hin und wenn man beachtet, wieviel übersichtlich dcmd das ganze Skript macht, dann kann man diesen wirklich sehr kleinen Leistungsunterschied ruhig ignorieren...


    So und damit mein Post auch noch etwas Konstruktives an Funktionen hat:


    Sparen von Zeit in Positionsvergleichen


    Eine ziemlich nützliche Funktion, die sehr oft auch von Streamern benutzt wird ist:


    Code
    bool: isInReach(Float: x1, Float: y1, Float: z1, Float: x2, Float: y2, Float: z2, Float: reach)
    {
    	return (getDistanceBetweenPoints(x1, y1, z1, x2, y2, z3) <= reach);
    }
    Float: getDistanceBetweenPoints(Float: x1, Float: y1, Float: z1, Float: x2, Float: y2, Float: z2)
    {
    	return floatsqroot(floatpower(floatabs(floatsub(x1, x2)),2) + floatpower(floatabs(floatsub(y1, y2)),2) + floatpower(floatabs(floatsub(z1, z2)),2));
    }


    Sieht ziemlich professionell und optimiert aus, ist es aber definitiv NICHT.


    Was macht getDistanceBetweenPoints?
    Es rechnet den drei dimensionalen Pythagoras aus, also es zieht die Positionen von einander ab und berechnet den absoluten Wert um die Länge der Strecken zu erhalten, dann werden die Seiten alle mit 2 potenziert und anschließend die Wurzel draus gezogen. Klingt logisch. Ist es auch. Aber nicht effektiv.
    Zuerst einmal könnte man

    Code
    floatpower(floatabs(floatsub(x1, x2)),2)


    durch

    Code
    floatsub(x1, x2)*floatsub(x1, x2)


    ersetzen womit man einen Funktionsaufruf sparen würde. Der wahre Leistungsausbremser ist aber floatsqroot welche in dieser Form sehr ineffektiv ist.
    Natürlich ist diese Funktion von den Entwicklern von Pawn sehr effektiv programmiert worden, jedoch rechnet sie nunmal die Wurzel auf glaub ich 20 Stellen genau aus und das ist halt selbst mit der besten Engine leistungsfordernd.
    Zumal wir ja nichtmal die wirkliche Distanz brauchen, wir brauchen ja lediglich wissen ob die Koordinaten in Reichweite der anderen liegen.
    Durch simple mathematische Termumformungen kann man dann folgendes machen:

    Code
    (getDistanceBetweenPoints(x1, y1, z1, x2, y2, z3)*getDistanceBetweenPoints(x1, y1, z1, x2, y2, z3) <= reach*reach)


    ist exakt das gleiche, beide Seiten wurden mit 2 potenziert, jedoch wird dadurch die Wurzel welche in getDistanceBetweenPoints steckt aufgehoben und wenn man die Funktion nun intern schreibt und weitere Kürzungen von floatpower und floatabs vornimmt die auch überflüssig werden hat man also:

    Code
    bool: isInReach(Float: x1, Float: y1, Float: z1, Float: x2, Float: y2, Float: z2, Float: reach)
    {
    	return (floatsub(x1, x2)*floatsub(x1, x2) + floatsub(y1, y2)*floatsub(y1, y2) + floatsub(z1, z2)*floatsub(z1, z2) <= reach*reach)
    }


    Das ist nun schon um einiges optimierter als am Anfang.
    Aber es geht noch um einiges besser, wir erinnern uns, dass Funktionsaufrufe Zeit kosten also werden auch die floatsubs alle durch ein "-" ersetzt somit haben wir:

    Code
    bool: isInReach(Float: x1, Float: y1, Float: z1, Float: x2, Float: y2, Float: z2, Float: reach)
    {
    	return ((x1- x2)*(x1-x2) + (y1-y2)*(y1- y2) + (z1-z2)*(z1- z2) <= reach*reach)
    }


    Nah dran am Perfekten ABER es geht natürlich immernoch besser und zwar können wir noch einen Funktionsaufruf sparen. Welchen? Richtig "isInReach"
    Also weiter optimiert:

    Code
    #define isInReach(%0,%1,%2,%3,%4,%5,%6) \
    	(((%0 - %3) * (%0 - %3)) + ((%1 - %4) * (%1 - %4)) + ((%2 - %5) * (%2 - %5)) <= %6 * %6)


    So und weiter gehts nicht, dieser Code ist jetzt so weit optimiert, dass er 40 mal schneller ist als der ursprüngliche Code und somit vor allem in Streamern, wo diese Funktion sehr oft aufgerufen wird, einiges an wichtiger Rechenzeit spart
    Ist übrigends nichts was ich rausgefunden habe ._. Sondern Y_Less wie auch fast alle anderen Sachen die mit SA-MP Scripting zu tun haben :D
    Naja ich hoffe mal ich konnt auch mal ein bisschen helfen
    /me legt die wunden Finger in ein Erholungsbad :D

    Genau danke dir du es verbessert hast.


    Und Yoda ich bin.
    Ne jetzt mal ohne Witz, es wird dir 1. keiner helfen und 2. da es ja kein fähiger/netter Admin zu sein scheint, wird er euch wohl kurzerhand bannen, womit wohl eure Aktion ziemlich schnell als gescheitert erklärt werden dürfte...

    ahja und das sehr schlecht gemacht UAC, die Treiberimkomptabilitäten, die 3 mal so hohe Arbeitsspeicherlast und Ideen die bei Konkurrenten geklaut wurden sind gut?
    Sorry aber selbst Bill Gates kann in einem Interview nicht leugnen das Vista ein Fail war fast sogar ein "Epic Fail", viele Leute, darunter auch ich, die ich kenne haben sich dank Vista nach AlternativBetriebssystemen umgeguckt, meiner Meinung nach ist Vista der erste Schritt zum Fall des M$-Monopols was früher oder später kommen wird
    Und ja ich war gezwungen Vista zu benutzen... 2 Wochen im Urlaub, die schlimmsten 2 Computer Wochen meines Lebens...

    lol ist liegt wohl in meiner Wahl welche Linuxdistribution ich mir installiere und da Ubuntu die beste Unterstützung für Hardware usw. bietet und zudem noch ne große Community besitzt welche einem bei Problemen hilft habe ich mich für diese entschieden.
    Welchen Ruf eine Distro hat ist ja wohl ziemlich zweitranging und was das ganze jetzt mit deiner Arroganz zu tun haben soll ist mir jetzt auch nich ganz klar aber naja

    Aber warum machst du dafür:


    1. nen Timer, wenn du es doch besser direkt überprüfen kannst um dem Cheater keine Sekunde auf deinen Server zu lassen
    2. warum übergibts du dann nicht einfach die ID und machst dann GetPlayerName und vergleichst es dann? oO

    lol pwned! :D
    Naja ich muss(te) auch um Siedler II zu spielen DOSBox benutzen, weil eben die 16 bit Befehle falsch umgesetzt wurden, hab aber mittlerweile "Siedler 2.5 Back to the roots" gefunden, ein OpenSource Projekt welche die Siedler II sowohl unter 32 bit als auch unter Linux lauffähig macht :D


    Achja php_exec dein erster Post war ja wohl an Arroganz kaum noch zu überbieten <.<
    Ist ja schön für dich, dass du angeblich soviel weisst aber entweder hilfst du dann den Leuten und sagst was Sache ist und was sie machen können damits funktioniert oder aber -> Fresse halten -.-
    danke

    Ganz einfach du versuchst ein ArrayIndex durch eine String (also durch ein Arry) festzulegen, ein ArrayIndex ist aber ein Integer, und ich frage dich nochmal:
    Warum willst du ein Array mit einem String ansprechen, das ist mit Pawn NICHT möglich, vor allem nicht so dynamisch wie du das gerne hättest, du musst also die playerid des Spielers als Index verwenden oder sie halt per "GetPlayerIDByName" o.ä. suchen

    Das ganze heißt, dass du (oder der Objektstreamer was ich nicht hoffen will) globale Variablen benutzt die "x2", "y2" usw. heißen, bei globalen Variablen ist es immer wichtig "lange" Variablennamen zu nehmen um eben diese Kollisionen mit "kurzen" Lokalvariablen zu vermeiden, zumal weißt du dann auch was "x1" zB. beinhaltet wenn du es "PositionSchiffX" o.ä. nennst


    Die letzte Warning sollte sich ja eigentlich selber erklären, da wird eine Variable überhaupt nicht benutzt. Kannst sie in den meisten Fällen einfach entfernen, oder aber richtig integrieren falls du es vergessen hast

    Mit anderen Worten du willst den Namen des Spielers als ArrayIndex nehmen oder versteh ich das falsch? oO
    Weil das ist zwar in Lua möglich, aber in Pawn nicht. Da musst du auf jeden Fall ein ganzzahligen Index nehmen, also die ID des Spielers

    Liegt wohl daran, dass die Entwickler exakt das selbe Releasedatum wie SA-MP immer angeben:

    Zitat

    It's done, when it's done

    ^^

    lol Kye würd doch niemals zu MTA wechseln, mal ganz davon abgesehen, dass seine Programmierskills Gerüchten zu folge mehr als nur schlecht sind...
    Er hat halt wirklich keine Lust mehr drauf, bleibt aber weiterhin der alleinige Diktator, und kann somit Lizenzen für Server verkaufen um noch Geld draus zu schlagen...
    Spätestens wenn die MTA 1.0 stable rauskommt wirds eh die große Völkerwanderung geben.


    btw.: -> in MTA gibt's schon lange Bots mit reichlich Funktionen -> Klick mich
    Und im Gegensatz zu SA-MP gibts diese Version auch schon jetzt als Download und wird nicht erst wie SA-MP 0.3 nach Duke Nukem Forever rauskommen...

    @ monte


    not !! ;) die nächste samp version wird mta stürzen


    LOL


    viel mehr fällt mir dazu eigentlich nicht ein :D
    Was bringt SA-MP 0.3 ?
    2100 Autos Limit | MTA hat unendlich dank gutem Streamer
    Synchronsierte Autos mit Schaden | Bereits seit MTA: Race vorhanden
    Verschiedene Kampfarten | Jo auch da
    Bots/Peds (vllt. ô_O) | Auch schon lange in den Nightlys drinne
    SetVehicleSpeed | Auch bereits seit MTA: Race drin :D
    Zu dem kommen noch die 5235782 weiteren Funktionen die SA-MP 0.3 nicht haben wird, die aber MTA jetzt schon hat und die schlicht und ergreifende Tatsache, dass SA-MP 0.3 vorraussichtlich erst 2017 erscheinen wird :D

    Ouh stimmt Y_Less war mal wieder im SA-MP Forum oO
    Also kurz vor meinem (erneuten) Ban welche irgendwann im Juni war hatte ich noch geguckt und da war sein letzter Zugriff aufs SA-Mp Forum bereits 4 Monate her...
    Und ja ich weiß es ist übertrieben sie als Nazis darzustellen, war auch nich ganz ernst gemeint ^^