Hopalong - Fraktal

    • VB.NET

    Es gibt 84 Antworten in diesem Thema. Der letzte Beitrag () ist von zn-gong.

      Der UpdateLoop sorgt dafür, dass alle Objekte im Spiel regelmäßig geupdatet werden. In diesen Loop kommt die Logik.
      Das zeichnen findet dann im RenderLoop statt, der ebenfalls in einer Dauerschleife läuft. Dort gibts aber keine Stopwatch, da die Renderer entweder so schnell wie möglich oder mit VSync arbeiten können (mehr dazu in der nächsten Version).

      Artentus schrieb:

      da die Renderer entweder so schnell wie möglich
      , aber warum wäre dein Renderer jetzt schneller als meiner (sofern man meins als Renderer anerkennt) ?

      Tut mir leid wenn ich dein Projekt damit nieder mache, ich finde das wirklich beeindruckend und respektiere die Arbeit dadrin ! :thumbup: Ich wills nur verstehen :s
      »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
      Es ging dir doch darum, Multithreading umzusetzen, oder nicht? So gehts. Versuch selbst einfach mal, GDI+ in nem Nebenthread zu benutzen, funktioniert nicht so ohne weiteres.
      Außerdem will ich dir nahebringen, wie man Logik und Anzeige voneinander trennen sollte.
      So da bin ich wieder ^^

      Ich habe jetzt etwas deiner Lib bei mir eingebastelt, @Artentus, aber bin schließlich nicht so ganz zu dem Ergebnis gekommen -.- :D

      Also, mir scheint es etwas komplizierter zu sein, da in deiner Lib ja nur das Grundmodell ist.
      Es gibt in meinem Projekt zwei Klassen, einmal natürlich die der Form, und einmal eine Fraktal-Klasse, der man Parameter zuweisen kann und die das Fraktal generiert und auch gemalt hatte. Im Mainthread starte ich im Button-Click-Event zwei Threads, einmal zum Generieren (UpdateThread), einmal zum Zeichnen (DrawingThread). Der UpdateThread ruft eine Sub in der Fraktal-Klasse auf, mit der die Punkte / Farben berechnet werden. Diese werden dann in einer List(Of PointF) und List(Of Color) global gespeichert, sodass der DrawingThread darauf zugreifen kann. Dieser geht alle Items der PointList durch, malt den Punkt mit der Farbe aus der ColorList, und zwar in die Bitmap aus der Fraktal-Klasse (scheiße ist das kompliziert 8|). Danach wird das Item aus beiden Lists gelöscht.

      Leider crasht das ganze, denn wenn ich einmal auf den Button klicke, ändert sich nichts am Image (außer dem schwarzen Hintergrund und manchmal ein paar Punkte 8|) und scheinbar tickt der Timer auch nicht (Somit wird die PB auch nicht geupdated). Wenn ich jetzt das zweite mal auf den Button Klicke, bekomme ich eine "System.IndexOutOfRangeException" beim löschen der Items aus den Lists, den Item 0 ist angeblich nicht innerhalb der Range, obwohl der Count beider Lists weit über 100000 liegt (was auch nicht sein kann! -.-).

      Meine Überlegung ist es, dass ich nicht immer Item 0 löschen kann, solange Count > 0, weil das nicht schnell genug nachrückt, weiß ich aber nicht.


      Anbei mal die drei Classes, sonst checkt ihr ja gar nicht was ich von euch will :D
      Dateien
      »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
      Hm, du hast halt alles aus meiner Lib so ineinander verwoben, es war aber durchaus meine Absicht, alles so schön voneinander loszulösen. Und vor allem ist auch wichtig, dass nicht die Form der Mittelpunkt der Anwendung ist, die Form dient nur zur Darstellung.
      In dem Grundgedanken meiner Lib würde das Fraktal IGameObject implementieren.

      Artentus schrieb:

      du hast halt alles aus meiner Lib so ineinander verwoben, es war aber durchaus meine Absicht, alles so schön voneinander loszulösen

      Hab ich... ? :s

      Artentus schrieb:

      nicht die Form der Mittelpunkt der Anwendung ist

      Wie soll ich das coden ? Also soll der Mainthread nicht die Form sein oder wie ? ?(

      Artentus schrieb:

      das Fraktal IGameObject implementieren

      Aber in der Klasse steht doch nix drin :$ :huh:
      »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
      Was ist jetzt eigentlich dein Ziel: Eine schön anzusehende, schnelle und flüssige Animation, dafür halt nicht sofort, sondern mit etwas Zeitverzögerung am Anfang oder lieber ein sich direkt nach dem Button-Klick "Live" bildendes Fraktal?
      @Artentus: Scheinbar nicht :/ Schade eig, ich lerne gern sowas :D

      @nafets3646:
      Um ehrlich zu sein, frage ich mich das auch mittlerweile, schließlich funktionieren alle anderen Fraktale super (ist aber auch ein anderer Algorithmus).
      Ich denke ich bleibe aber bei der Animation, egal obs ne kurze Rechnungszeit braucht oder nicht :)
      »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
      Ich würds ja gerne erklären, aber dann würde ich nächstes Jahr immer noch hier sitzen. Man kann einfach kein Tutorial über eine Engine machen, man muss ganz alleine darauf kommen, wie sowas geht. Ja, das meine ich tatsächlich so. Irgend wann, wenn man lange genug am Ball bleibt und intensiv übt, kommt einem sowas dann schon von ganz allein in denn Sinn (natürlich ist meine Engine bei weitem nicht perfekt, es ist wohl immer noch eine sehr einfach gehaltene Möglichkeit, sowas zu realisieren).

      Artentus schrieb:

      Man kann einfach kein Tutorial über eine Engine machen, man muss ganz alleine darauf kommen, wie sowas geht.
      Halte ich für totalen Unfug.
      Imo, alles was man lernen kann, kann man auch erklären.
      Sind ja keine mystischen Erfahrungen oder sowas ;)

      Kann sein, dass Grundlagen nachzuarbeiten sind, auch in großem Maßstab. Darauf kommt man imo recht schnell, wenn man ein lauffähiges Beispiel verfügbar hat, weil daran kann man genau die Codezeilen benennen, die man nicht versteht.
      Aber viel üben, bis man von selbst drauf kommt - nope.
      na, aber trotzdem musst du es erklären können.

      stimmt natürlich schon, dass man auch Dinge lernen kann, die einem keiner erklärt - Pionier-Arbeit also. Aber sobald die Pionier-Arbeit einmal geleistet ist, kann der Pionier erklären wies geht.
      Bei wissenschaftlicher Pionier-Arbeit ist das nicht nur für die Nachfolger eine enorme Vereinfachung, sondern auch der Prüfstand für die Stimmigkeit der erarbeiteten Ergebnisse.

      Aber ich glaub auch garnicht, dass fürs Entwickeln einer Engine soo viel Pionier-Arbeit zu leisten ist. Engines gibts ja bereits, und also gibts auch KnowHow dazu.
      Kann natürlich sein, deine Engine ist besonders originell, und daher besonders einfach zu verwenden, oder bietet neue Möglichkeiten. Aber auch dann musst du erklären können, wie sich deine Engine von anneren abhebt.

      Edit: Aber das führt auch bisserl weg. Du musst ja nicht erklären, wie man eine Engine programmiert, aber zumindest solltest du erklären können, wie man deine Engine benutzt. Das kannman den Leuts nicht hinklatschen und sagen: "Nu üb man damit, bis du drauf kommst!"

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

      Ich hab nie behauptet, dass ich ein Meisterwerk geschaffen hätte, ganz im Gegenteil. Die Engine entwickle ich deshalb, weil ich besser werden will, als Übung sozusagen. und ja, natürlich habe ich mir einiges dazu angesehen, aber das bezog sich alles nur auf Theorie, nicht auf die tatsächliche Umsetzung im Code. Die entspringt ganz und gar meiner eigenen Vorstellung.
      Was ich sagen will ist, es reicht nicht bloß, ein Ziel vor Augen zu haben (das ist natürlich auch wichtig), man muss sich auch (zumindest im Groben) vorstellen können, wie man dorthingelangt. Und ein Tutorial hilft einem in diesem Fall nicht wirklich weiter, denn ich bin der Meinung, solange man ein Problem nicht selbst lösen kann, kann man auch nicht vollkommen verstehen, was ein anderer sich bei der Problemlösung gedacht hat (Problem meint hier natürlich ausschließlich im programmiertechnischen Sinne).
      Da ich nun mine eigene Engine entwickelt habe (oder eigentlich noch entwickle) fällt es mir nun auch viel leichter, bei anderen Engines durchzublicken, da ich nachvollziehen kann, was sich der Ersteller bei bestimmten Dingen gedacht haben könnte. Wenn ich einfach nur nen Code hingelegt bekommen würde, dann wüsste ich nicht um die Probleme, die der Entwickler zu lösen hatte und könnte deswegen auch seine Lösungswege nicht nachvollziehen.
      Ich will damit nicht sagen, dass man ohne lernen auskommt, ich selbst musste ja auch einiges lernen, bevor ich sowas machen konnte, aber imo reicht es aus, seinen Geist zu schulen in "Programmierbahnen" denken zu lassen, um ein guter Programmierer zu werden. Beim Programmieren muss man eben auf eine ganz spezielle Art und Weise denken, was man so absolut nicht gewohnt ist, aber wenn mans schafft, dann ergibt sich der Rest eigentlich von selbst. Ich muss (meistens, komplizierte Fälle ausgenommen) nicht mehr wirklich über den Code nachdenken, den ich schreibe, ich habe einfach einen Plan in meinem Kopf, wie ich das Problem lösen möchte, und der Code ergibt sich dann von selbst.

      Wie man die Engine benutzt, kann man übrigens im Beispielprojekt sehen. Klar, dass das nicht funktioniert, wenn man einfach nur Teile der Engine nimmt und sie irgendwie notdürftig zusammenflickt.
      Okay Artentus, gewonnen ;)

      Ich werde mich mal mit Engines auseinander setzen, und dann mal sehen, wie ich das dann umsetze.
      Vielen Dank!

      ErfinderDesRades schrieb:

      Kann sein, dass Grundlagen nachzuarbeiten sind, auch in großem Maßstab

      Was zählst du denn noch alles zu Grundlagen wenn ich mal fragen darf? ^^
      »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais