1. Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

ServerPlugin Welt erstellen und dabei nicht den Main Thread blockieren

Dieses Thema im Forum "Programmierung" wurde erstellt von VooxoPlay, 18. April 2017.

  1. VooxoPlay
    Offline

    VooxoPlay

    Registriert seit:
    20. Oktober 2016
    Beiträge:
    6
    Hey, ich finde leider nichts aktuelles zu der ganzen Geschichte: Wie erstellt man eine Welt ohne den Main Thread zu blockieren heißt ohne das alles einfreezed und man einen kleinen Lag (bei mir 2-4 Sekunden) hat. (Brauche nur einen Ansatz mit dem ich arbeiten kann)
     
    #1
  2. Werbung
    Online

    Werbung

  3. combo
    Offline

    combo

    Registriert seit:
    16. Juli 2012
    Beiträge:
    173
    Minecraft:
    combo5
    Probier doch mal das ganze in einer Runnable auszuführen, vielleicht mit runTaskLater mit einer halben Sekunde Verzögerung oder so.
    Ich hab bisher aber nicht so viel Erfahrung mit Weltgenerierung, falls das der falsche Ansatz ist
     
    #2
  4. VooxoPlay
    Offline

    VooxoPlay

    Registriert seit:
    20. Oktober 2016
    Beiträge:
    6
    Das in einen anderen Thread auslagern(in eine Runnable) funktioniert zwar doch es gibt ein paar Fehler, die halt alle so ziemlich das gleiche sagen: Bukkit mag kein Async, ich schau mal heute Abend ob es Fehler in der Welt gibt die schlimm wären. Das einfachste hab ich natürlich nicht probiert da Bukkit ja sonst auch kein Async mag, dachte ich das geht eh nicht
     
    #3
  5. UnityGaming
    Online

    UnityGaming

    Registriert seit:
    25. Oktober 2015
    Beiträge:
    147
    Ort:
    Hohenfels
    Minecraft:
    FastFelix771
    Wenn das so leicht wäre, dann gäbe es bereits 1000 Plugins die den Standard Generator durch eine asynchrone Version ersetzen.
    Problem dabei ist: Der Mechanismus des Generators ist absolut nicht darauf ausgelegt... es ist zwar mit ein wenig Hirnschmalz und Arbeit möglich, aber die Resultate sind noch immer nicht perfekt.
     
    #4
    • Gefällt mir Gefällt mir x 2
  6. VooxoPlay
    Offline

    VooxoPlay

    Registriert seit:
    20. Oktober 2016
    Beiträge:
    6
    Die Welt wurde ja generiert, mein einziges Ziel ist es ja das ich die Welt betreten und verändern kann, die die ich davor erstellt habe kann man betreten und ist eine Standard Welt.
     
    #5
  7. Malfrador
    Offline

    Malfrador

    Registriert seit:
    16. Juni 2013
    Beiträge:
    627
    Minecraft:
    Malfrador
    DungeonsXL (https://github.com/DRE2N/DungeonsXL) tut genau das (und zwar laut Dev nochmal mehr als Multiverse), funktioniert bislang auch problemlos. Am besten schaust du dir da mal den Code an.
     
    #6
  8. Bamas
    Offline

    Bamas

    Registriert seit:
    30. März 2016
    Beiträge:
    18
    #7
  9. BlackHole
    Offline

    BlackHole

    Registriert seit:
    1. Juli 2012
    Beiträge:
    174
    Minecraft:
    BlackHole
    Evtl. die Spawnchunks sehr klein setzen. Üblich sind hier 16*16 Chunks, die beim Erstellen einer neuen Welt sofort erzeugt werden.
     
    #8
    • Gefällt mir Gefällt mir x 1
  10. Kroseida
    Offline

    Kroseida

    Registriert seit:
    28. September 2015
    Beiträge:
    60
    Ort:
    /root/
    Minecraft:
    Kroseida
    Hallo,

    vor einiger Zeit habe ich eine spigot.jar für einen fast start(start unter 200ms) modifiziert.
    Hierbei habe ich den teil das Welten ladens einfach abgeschaltet, evtl. hilft dir das?

    Simpel gesagt, du erstellst mit reflection eine Welt und fügst sie in bukkit/spigot ein.
    Wie genau das klappt kann ich nicht sagen, muss ich später mal schauen.

    Mit freundlichen Grüßen
    Kroseida
     
    #9
    • Gefällt mir Gefällt mir x 1
  11. VooxoPlay
    Offline

    VooxoPlay

    Registriert seit:
    20. Oktober 2016
    Beiträge:
    6
    Erstmal sorry, dass ich nicht geantwortet hab, aber habe derzeit das Projekt pausiert. Werde dennoch die Ratschläge nicht vergessen und später mal berichten.
     
    #10
  12. UnityGaming
    Online

    UnityGaming

    Registriert seit:
    25. Oktober 2015
    Beiträge:
    147
    Ort:
    Hohenfels
    Minecraft:
    FastFelix771
    Du könntest evtl. die passenden Standardmethoden nachbauen und das Generieren der Chunk Sections auf mehrere Threads aufteilen, während die Methode blockt bis alle Sections fertig sind.

    *Könnte* ein kleines Speedup geben, aber obs das bringt... hm.
    Dieser kleine Spike ist immer noch da und Threads haben auch einen gewissen, kleinen Overhead.

    Was mir mal in den Kopf kam, wo ich aber noch am forschen bin ist:
    Die Methode zum Chunk generieren wird aufgerufen;
    Ich bereite das Array für die Blockdaten vor, trage es in einen Queue ein und gebe das leere Array sofort zurück. => Ein Void Chunk.

    Nun wird aus diesem Queue allerdings eins der Chunk Arrays genommen und Stück für Stück async befüllt.
    Danach ein ChunkSave getriggert und Chunk Updates an die Spieler gesendet.

    Das würde die Chunks instant generieren (aus Sicht des Servers, so dass er sich anderen Aufgaben widmet) während die richtigen Blöcke Stück für Stück hinterher generiert werden. Aber eben trotzdem so zackig, dass das nicht großartig auffallen dürfte.

    Ähnlich dem Prinzip von AsyncWorldEdit bzw. FAWE.
    Dort gibt es ja soweit ich mich erinnere sogar eine Chunk-API welche direkte Bearbeitungen vornimmt.
    Ich glaube aber das war mit den Chunk Dateien anstatt den Arrays dahinter - wobei ich sowieso noch nicht weiß ob das so geht.

    Das wäre meine Idee dazu^^

    Am coolsten und einfachsten wäre es natürlich, wenn man sich hinsetzt und z.B. den FAWE Code mal durchsucht nach dieser Chunk API um zu sehen wie die das machen und dann mit diesen Mitteln quasi einen Non-Blocking Asynchronous Chunk Generator baut indem man Void Chunks erstellt und im Nachhinein bequem mit der Datei oder den Arrays (je nachdem was von beiden möglich bzw. besser ist) "spielt" und dann einfach den Chunk refreshen lässt und Spielern Updates sendet.

    Allerdings ist das eher graue Theorie, ob das so gut läuft wie es klingt... who knows.
    Ob's das braucht... hmm depends.

    Allerdings glaube ich, dass sich das grade bei mehreren Welten, besonders frischen Farmwelten sehr gut machen täte und auch das vorgenerieren bis zum WorldBorder ersparen täte => weniger Patz nötig etc.

    Was ist eure Meinung zu dieser Idee, kann das laufen?
    Hab mich in diesen Teil von MC noch nicht so arg reingekniet... jedenfalls in keine komplexen Generatoren etc.
     
    #11
  13. VooxoPlay
    Offline

    VooxoPlay

    Registriert seit:
    20. Oktober 2016
    Beiträge:
    6
    #12
  14. UnityGaming
    Online

    UnityGaming

    Registriert seit:
    25. Oktober 2015
    Beiträge:
    147
    Ort:
    Hohenfels
    Minecraft:
    FastFelix771
    Sieht gut aus... genau sowas meine ich.
    Ich will gar nicht wissen was für einen (vermutlich) Hardcore Crap der FAWE Author fabriziert um das so ans Laufen zu kriegen, aber solange es funktioniert ignoriere ich das einfach mal. :p

    Asynchrones Laden von Welten sieht auch sehr interessant aus.
     
    #13
  15. VooxoPlay
    Offline

    VooxoPlay

    Registriert seit:
    20. Oktober 2016
    Beiträge:
    6
    Hab nur die API nach deinem Beitrag gefunden, aber hab mir die ganze Sache noch nicht genau angeschaut darum kann ich noch nix dazu sagen
     
    #14