Beiträge von Snail

    Ok was meinen Speedtest angeht, da hatten wir unterschiedliche Absichten.
    Mein Speedtest ruft jedes mal eine neue Zeile/Row auf. --> Kaum schneller als der "original"-Code.
    Du hingegen zielst auf höhere Geschwindigkeit bei der Verarbeitung der Daten ab (mehrere Felder in einer Reihe mittels mysql_fetch_field_row).
    Da geb ich dir recht, da ist dein Code eindeutig schneller, als jedes mal ein neuer Query.


    // edit: @ .ibiq: mein speedtest ist nicht auf die Geschwindigkeit bei der Verarbeitung von daten ausgelegt !

    Der Speedtest ist nicht wirklich aussagekräftig.
    Zum einen hast du einen Fehler bei der Berechnung der Zeit:

    new Tick2=GetTickCount();
    printf("(RFT SQL)Dauer: %dms", r_tests[0][id]);
    r_tests[0][id]=Tick2-Tick;
    Du gibst zuerst "r_tests[0][id]" aus (was standardmäßig 0 ist) und weißt der Variable erst danach einen Wert zu --> Deine Werte sind alle 0ms.


    Außerdem lässt sich dein Speedtest nicht auf die Realität übertragen, da du 1000 mal das selbe Feld abfragst.
    Damit ist klar, dass dein Code "gewinnt", da dein Code nicht jedes mal einen neuen Query abschickt.


    Folgender Code ist ein aussagekräftigerer Speedtest, da jedes mal ein anderes Feld abgefragt wird.

    Spoiler anzeigen
     

    #include <a_samp>
    #include <rtf>
    new r_tests[2][6];
    main(){}
    public OnGameModeInit()
    {
    r_mysql_Connect_To_Database("localhost", "root", "", "datenbank");
    for(new i = 1; i < 6; i++) RichtigerTest(i);
    print("Ergebnisse:");
    for(new i = 1; i < 6; i++) {
    if(r_tests[0][i]<r_tests[1][i])printf("(%d): RFT MySql war: %dms schneller", i, r_tests[1][i]-r_tests[0][i]);
    else printf("(%d): RFT MySql war: %dms langsamer", i, r_tests[0][i]-r_tests[1][i]);
    }
    return 1;
    }

    Spoiler anzeigen
    RichtigerTest(id)
    {
    new str[4], string[65];
    new Tick=GetTickCount();
    for(new i = 0; i < 1000; i++) {
    format(str, 4, "%d", (i+2)); // i+2, da IDs in meiner Tabelle erst bei 2 beginnen
    r_LoadSQLEntrance("tabelle", "ID", str);
    SendClientMessage(0, 0xAFAFAFAA, r_mysql_GetString("FELD"));
    r_UnloadSQLEntrance();
    }
    new Tick2=GetTickCount();
    r_tests[0][id]=Tick2-Tick;
    printf("(RFT SQL)Dauer: %dms", r_tests[0][id]);
    Tick=GetTickCount();
    for(new i = 0; i < 1000; i++) {
    format(string, 128, "SELECT `FELD` FROM `tabelle` WHERE `ID` = '%d'", (i+2)); // i+2, da IDs in meiner Tabelle erst bei 2 beginnen
    mysql_query(string);
    mysql_store_result();
    mysql_fetch_row(string);
    mysql_free_result();
    SendClientMessage(0, 0xAFAFAFAA, string);
    }
    Tick2=GetTickCount();
    r_tests[1][id]=Tick2-Tick;
    printf("(Mysql-Funktion)Dauer: %dms", r_tests[1][id]);
    return 1;
    }

    Ergebnisse:
    [20:07:10] (1): RFT MySql war: 89ms schneller
    [20:07:10] (2): RFT MySql war: 87ms schneller
    [20:07:10] (3): RFT MySql war: 68ms schneller
    [20:07:10] (4): RFT MySql war: 75ms schneller
    [20:07:10] (5): RFT MySql war: 84ms schneller


    Dein Code ist damit bei 1000 MySQL-Abfragen "nur" ~80ms schneller. Es ist also "kein" wirklicher Unterschied erkennbar.


    Desweiteren könnte man noch die Namen der Funktionen ein wenig verbessern.
    "r_mysql_Connect_To_Database" empfinde ich als zu lang.


    Neben der ganzen Kritik gibts natürlich auch ein Lob: Gute Arbeit ;)


    LG Snail

    Ich hoffe ja, das Kalcor bevor 0.3e Offiziel Released wird, noch den Bug mit dem Kicken in OnPlayerConnect fixxt.

    Das ist nicht unbedingt ein SAMP Bug. Das wird wahrscheinlich von Plugins verursacht (http://forum.sa-mp.com/showthread.php?t=323853). Somit wird das vermutlich nicht behoben. Außerdem kann man das Problem einfach mit nem Timer beheben.


    Ein weiterer Hinweis auf ein baldiges Release ist das schließen des "Post new object [model] suggestions here"-Threads.

    Kommt ganz darauf an, wie du es einsetzt.
    OnPlayerUpdate wird pro Spieler bis zu 30 mal pro Sekunde aufgerufen.
    Das entspricht einem Timer, der alle 33 Millisekunden aufgerufen wird und dabei dann alle Spieler durchgeht.


    OnPlayerUpdate eignet sich meiner Meinung nach nur für AFK-Erkennung (Spieler auf dem Desktop) und für Anticheat-Code. Für alles andere würde ich einen Timer nehmen.

    Naja nicht sehr effizient gecodet.

    • OnPlayerUpdate ist für diesen Code ungeeignet !
      Es wird bis zu 28 mal pro Sekunde pro Spieler aufgerufen.
      D.h. Bei 100 Spielern wird OnPlayerUpdate bis zu 2800 mal pro Sekunde aufgerufen !
      Beim Aufruf von OnPlayerUpdate überprüfst du ob der Spieler durch eines der 500 Nagelbänder fährt.
      D.h. Im Extremfall heißt das, dass der Server pro Sekunde 1.4 Millionen Koordinaten vergleichen muss. (Wenn 100 Spieler online und in einem Fahrzeug sind)
    • Prüfe zuerst ob das Nagelband existiert, bevor du die Koordination vergleichst.
    • Beende die For-Schleife wenn man durch ein Nagelband gefahren ist. (break oder return)
      Dein Code läuft da einfach weiter.


    an sonsten ganz ok ;)

    Tausche Gutscheine gegen Kohle:
    • 50 % Rabatt auf Dirt 3
    • 50% Rabatt auf AI War: Fleet Command
    • 50% Rabatt auf Recettear: An Item Shop's Tale
    • 25% Rabatt auf Valve-Spiele

    Es gibt übrigens wieder einen neuen Track:


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.