Jump to content
Unity Insider Forum

Life Is Good

Members
  • Content count

    691
  • Joined

  • Last visited

  • Days Won

    16

Everything posted by Life Is Good

  1. Life Is Good

    Schöner oder kurzer Code?

    Dann bin ich wohl der einzige hier, der die Klammern des öfteren auch ganz gerne mal weglässt
  2. Life Is Good

    Paralleles Parsen von Textdateien

    Verstehe. Ich hab zu erst vermutet, dass es dann vielleicht am RAM access liegt, aber habe dann mal jemanden um Rat gefragt, der mehr Ahnung von sowas hat als ich. Seine Antwort: Vermutlich ist die Arbeit pro Thread einfach zu klein. Dementsprechend ist die Schleife selbst dein bottleneck. Das kannst du ganz einfach testen, indem du deinen Threads jeweils mehr Arbeit zu teilst. Ansonsten performed dein Importer.ReadFromTextReader eventuell Synchronisation, worauf die Threads dann warten müssen. Viel mehr kann ich dazu leider auch nicht sagen
  3. Life Is Good

    Paralleles Parsen von Textdateien

    Ich bin kein Multithreading Experte, aber hier ein paar Punkte, die mir dazu in den Kopf kommen (Unter der Annahme, dass deine Dateien sich auf einer HDD befinden): Parallel.For teilt die Arbeit automatisch auf so viele Threads auf, wie sie vom schedular bereit gestellt werden. Dein MaxDegreeOfParallelism limitiert also bloß die mögliche Anzahl an gleichzeitigen Operationen. Die Threads können natürlich bloß genutzt werden, wenn sie verfügbar sind. Falls also sonderlich viel Aerbeit im Hintergrund verrichtet wird, stehen sie vielleicht schlichtweg nicht zur Verfügung Von HDDs kann man meist nicht wirklich parallel lesen. Die Leseanfragen werden vom HDD Controller / Treiber geordnet und der Reihe nach abgearbeitet (was meist aber dennoch einen performance boost bringt) HDDs erlauben weniger Leseanfragen als SSDs
  4. Life Is Good

    Berufliche Zukunft

    Mir ist dein anderer Thread dazu aufgefallen, also dachte ich mir, ich lass auch mal ein paar Worte fallen. Was das Alter angeht haben die anderen ja schon einiges gesagt. Das ist ziemlich irrelevant. Aus meiner Erfahrung ist das eine Eigenschaft von guten Programmierern. Die nehmen meistens Worte sehr genau. Ansonsten ist ein guter Programmierer meiner Meinung nach kein professioneller "Code-Schreiber", sondern ein Problemlöser. Probleme elegant und effizient zu lösen erfordert zum einen die Fähigkeit abstrakt zu denken, vor allem aber erfordert es Kreativität. Die guten Programmierer, die ich kennengelernt habe, denken oft outside of the box. Selbstreflexion ist ebenfalls eine wichtige Eigenschaft eines solchen Programmierers. Dabei geht es darum zum einen offen zu sein für neue Ansätze. Viele Programmierer, die leider oft auch in Senior Positionen sind, glauben, weil sie das seit 20 Jahren machen wissen sie alles. Aber man lernt niemals aus. Zum anderen treibt sie einen an sich selbst zu verbessern. Die besten Programmierer, die ich kenne, beschweren sich nicht bloß über fremden, sondern meistens über ihren eigenen Code Erfahrung ist natürlich viel Wert und über Programmierung gibt es viel zu wissen, aber im Endeffekt ist die Programmierung bloß eine weitere, anlernbare Fähigkeit, die auf solche Charaktereigenschaften aufbaut.
  5. Life Is Good

    Static und Nicht Static

    Achso, ja dann macht das mit dem Parameter natürlich keinen Sinn. Also die lange Lösung lautet: Vermutlich ist static hier eben einfach nicht angebracht. Das ist halt eine Frage von Architektur. Die kurze Lösung: Du kannst das ganze ein bisschen dribbeln, wenn du unbedingt willst, und halt ne separates statisches Feld anlegen und dann irgendwann iconSprites dem zuweisen. Z.B. in der Start Methode.
  6. Life Is Good

    Static und Nicht Static

    Die einfachste Lösung: Übergib iconSprites als Parameter. Ich seh keinen Sinn dahinter, dass sprite überhaupt in der Methode ist, also nimm das am Besten raus. public static Sprite MinimapSpriteIcon (int icon, Sprite[] iconSprites) { // iconSprites[icon] macht genau das selbe wie dein switch statement.... return (icon < iconSprites.Length) ? iconSprites[icon] : null; } Die Initialisierung von iconSprites da oben mit public Sprite[] iconSprites = new Sprite[0]; Ist auch überflüssig. Unity initialisiert serialisierte Felder von selbst. Falls dein Code ziemlich genau so aussieht, kannst du auch einfach direkt iconSprites[icon] wo auch immer machen, und dir die ganze Methode sparen.
  7. Life Is Good

    Mac oder Windows?

    Metal soll tatsächlich ziemlich gut designed sein und laufen. Ist also eine gute Alternative zu bestehenden Grafik APIs. Ansonsten läuft auch Vulkan mitlerweile auf MacOS. https://github.com/KhronosGroup/MoltenVK Bei dem Preis würde ich aber persönlich auch eher zu nem Windows PC greifen
  8. Life Is Good

    Entity Component Systems & Data Oriented Design In Unity

    Hab das repository mal aktualisiert, und die 3 Themengebiete auf 3 unterschiedliche PDFs aufgeteilt. Ich glaube das wirkt einfach besser, und überfordert nicht so sehr. https://github.com/LifeIsGoodMI/ECS-And-DoD-In-Unity Hier auch nochmal im Anhang. ECS_StartGuide.pdf ECS_Unity_Article.pdf The_Core_Of_Unitys_ECS_Documentation.pdf
  9. Ich hab einen nicht so kurzen Artikel über Unity's Implementation eines Entity Component System (ECS) Model & Data Oriented Design (DoD) geschrieben. Es ist keinerlei Vorwissen über ECS oder DoD erfoderlich. Der Artikel behandelt die Prinzipien von ECS, DoD, beinhaltet eine eigene kleine Dokumentation über die fundamentalen Konzepte von Unity's ECS und enthält einen kleinen Start Guide, indem ich Stück für Stück zeige wie man ein sehr simples "Spiel" umschreiben kann. Am Ende kommt dann noch ein kleiner, kritischer Kommentar zu Unity. Sowas muss man natürlich nicht am Stück lesen, man kann da durch springen wie man will. Ihr findet den Artikel und das Unity Projekt auf meinem GitHub Account: https://github.com/LifeIsGoodMI/ECS-And-DoD-In-Unity Ausserdem scheints so, als würde GitHub's PDF Viewer keine Hyperlinks unterstützen, also hab ich die PDF hier noch einmal zusätzlich angehangen. ECS_DoD_Unity.pdf
  10. Life Is Good

    Lightmaps Größe

    2048^2 * 64 = 268435456 bit = 33,5 mb Was wird dir denn im Explorer, und in Unity angezeigt ?
  11. Life Is Good

    Lightmaps Größe

    Das hängt auch sehr stark von deiner Szene ab. Je komplexer deine Geometrie und je spärlicher beleuchtet diese ist, desto höher die Auflösung die du haben willst. Tatsächlich sinds nach der Rechnung bloß knapp 33mb Ich schätze mal, dass texels & scaling da auch noch irgendwie in die Rechnung mit reingehen.
  12. Ich hab den Algorithmus ein wenig angepasst, um das Problem mit den weichen Ecken zu lösen. Im Grunde schau ich mir einfach die vertices an, die nicht ganz korrekt sind, addier alle Normalen zusammen (nennen wir das Ergebnis einen Vektor A) und interpoliere dann von diesem Vertex aus in die Richtung A bis die SDF an diesem Punkt = 0 ist. Ich musste allerdings einen kleinen Bias einbauen, aber ich denke das sind einfach bloß Genauigkeitsprobleme, da die Implementation aktuell komplett auf floats setzt. Die schwarzen Linien am Ende zeigen das Ergebnis der Normalen (Vektor A) bei den Vertices, die zunächst gesmoothed wurden. Ich werd noch mehr testen müssen, um zu schauen, ob die Lösung so allgemein aufrecht erhalten werden kann.
  13. Hey, Ich experimentier aktuell mit meiner eigenen Idee rum, Oberflächen aus Distanzfunktionen (signed distance function, SDF) zu generieren. Ihr könnt meinen Ansatz in diesem Thread verfolgen, falls ihr euch für so Voxel Zeugs interessiert: https://www.gamedev.net/forums/topic/697431-a-novel-approach-to-non-manifold-dual-contouring/ Im Grunde gehts darum Eckpunkte (vertices) durch Schnittpunkte von Oberflächenkanten (surface edges) ausfinding zu machen. Die 2D Methode scheint ohne probleme zu funktionieren, und ermöglicht so auch scharfe geometrische Features wie Ecken. (dabei ist's auch deutlich einfacher zu verstehen, als 2D Dual Contouring) Mit dem 3D Ansatz bin ich aktuell noch ein wenig am kämpfen, aber erste Ergebnisse gibts dazu auch schon, wie ihr hier nochmal sehen könnt:
  14. Life Is Good

    Profiler (Memory)

    Ich glaube tatsächlich, dass Unity EditorWindows auch als Mesh zählt / rendert. Wenn man ein EditorWindow bewegt (z.B. der Profile) steigt die Anzahl an Meshs sofort an (also genau dann, wenn für das EditorWindow OnGUI aufgerufen wird) Ansonsten schätze ich mal, das Unity auch ein bisschen subdivision betreibt. Vielleicht wenn ein Mesh beispielsweise nur teils im View Frustum ist.
  15. Life Is Good

    Lightmaps Größe

    Klingt relativ normal. Wenn es um Effizienz geht willst du grundsätzlich lieber einige wenige große Dateien. Einige größere Dateien können schneller geladen werden als haufenweise kleine Dateien. Das merkst du besonders, wenn du z.B. mal den Fehler machst, beim hoch / runterladen eines Projektes den Lib Ordner mit zu nehmen
  16. Life Is Good

    Shader Graph

    Nein, Shader Graph wird nur mit den neuen SRPs kompatibel sein. Der Built-In Renderer bleibt natürlich noch ne ganze Weile drin, aber früher oder später wird Unity wohl ganz darauf wechseln.
  17. Life Is Good

    Physics.CheckBox will nicht

    Die Execution order zeigt ja, dass Start vor FixedUpdate ausgeführt wird. Aber keine Ahnung ob's daran bei dir liegt. Zeig vielleicht einfach mal deinen ganzen Code, vielleicht ist da irgendwas anderes krumm ¯\_(ツ)_/¯
  18. Life Is Good

    Physics.CheckBox will nicht

    Dann stimmt vielleicht irgendeiner deiner Parameter nicht (vielleicht die Rotation oder collider size ?) Bei mir klappt das ohne Probleme. Edit: Hab gerade erst gesehen, dass du das in der Start machst. Vielleicht wird Start da vor dem 1. Physikzyklus ausgeführt.
  19. Life Is Good

    Physics.CheckBox will nicht

    Hast du einfach nur 2D Ansicht in deiner Scene View an, oder benutzt du 2D Box Collider ? Falls letzteres der Fall ist, würde ich mal davon ausgehen, dass Checkbox bloß 3D Collider überprüft.
  20. Life Is Good

    Lightning Realtime und Baking

    Baking ist statisches Licht, ja. Unitys realtime GI ist aber nicht rein realtime, muss teils also trotzdem vorberechnet werden. Das musst du weiterhin offline machen. Übrigens: Lightning ist der Blitz was du willst ist Lighting
  21. Life Is Good

    LOD System - Gedanken

    Klar, jede Menge. Die meisten Studios, die ihr eigenes LOD System implementieren, machen das halt passend zu deren Anforderungen. Ich hab leider weder zu Unity, noch zu UE4 was genaues gefunden. Aber wenn du willst, könntest du ja selber nachschauen wie UE4 das löst, der Code ist schließlich open source. Soweit ich das sehe, gibt es 2 große Ansatzpunkte: - Du hast eine Mesh Funktion, die beim Rendern direkt die Distanz zur Kamera zurückliefert (könnte gut sein, dass Unity das intern macht) - Du nutzt eine Datenstruktur, mit der du deine Welt in Bereiche einteilst, die du dann komprimieren kannst Ersteres ist vermutlich raus, wenn du nicht gerade deine eigene Renderpipeline schreiben willst. Datenstrukturen gibt es jede Menge für sowas. Das Stichwort hier ist: Spatial Data Structures Ein paar Beispiele: - Octree - KD-Tree - B-Tree - Bounding Volume hierarchy etc. Für normale Meshs würde ich das vermutlich nutzen, ja. Um eine andere Lösung würde ich mich erst kümmern, wenn ich damit an die Grenzen komme. Hier eine gute Präsentation, wie die solche Probleme in Infamous: Second Son angegangen sind. https://archive.org/details/GDC2014Bentley
  22. Life Is Good

    LOD System - Gedanken

    Ich hab noch nie mein eigenes LOD-System geschrieben(zumindest nicht für polygon Meshs) aber was du da machst klingt so, als würdest du eher das Gegenteil erreichen. Dass du bei 330 Collidern keine Framedrops hast, bestätigt kein gutes Ergebnis. So eine moderne Engine sollte locker ein paar zehntausend collider ohne probleme handhaben können. Das heißt aber auch nicht, dass was du da machst effektiv ist. Du hast schon allein dadurch einen riesen Overhead, dass jeder dieser Trigger OnTriggerExit und OnTriggerEnter implementiert. Auch in der Innenstadt würde ich mal vermuten, dass der Fall, dass ein Gebäude nicht ganz aber soweit verdeckt ist, dass du ein geringeres Detaillevel anzeigen willst, ziemlich selten ist. Ich gehe davon aus, dass deine Methode nicht wirklich nach oben skaliert. Dein CPU Overhead gleicht vermutlich wieder die gesparte GPU Zeit aus / übersteigt sie. Aber wenn du es genau wissen willst, schalt den Profiler an ¯\_(ツ)_/¯ Klingt übrigens nach dem typischen Indie-Problem. Statt das tatsächliche Spiel zu entwickeln, arbeitet man an Zeug drumherum, das man gar nicht braucht.
  23. Life Is Good

    Bild -> Terrain

    Kommt drauf an. Willst du Unity's Terrain System nutzen, oder einfach bloß ein Mesh draus generieren ? Im 1. Fall willst du daraus vermutlich ne Heightmap machen. Also deine Grafik auslesen, in ne Heightmap schreiben und die aufs Terrain werfen. Im 2. Fall könntest du ein Grid über die Grafik legen und Marching Squares drüber laufen lassen. Ist beides wohl nicht so ohne weiteres
  24. Ich find die Grafiken toll! Sieht gut aus.
  25. Life Is Good

    NavMesh Agent - die Technik dahinter

    Hiermit kannst du mehrere NavMeshs in der selben Szene haben: https://github.com/Unity-Technologies/NavMeshComponents (Falls das noch nicht mit Unity mitkommt, hab das NavMesh schon ne Weile lang nicht mehr benutzt) Es schneidet einfach die Fläche raus, die dein Hinderniss besetzt. Unter Umständen kann das dazu führen, dass es neuberechnet werden muss, ja. Ich glaube aber nicht, dass das gesamte NavMesh neuberechnet wird. (ich hab's aber auch nicht getestet) NavMeshs sind aber generell auch eher weniger für dynamische Umgebungen geeignet. Das letzte was du machen willst, ist 1250 Trigger nur dafür in deiner Szene zu haben Du kannst also entweder einfach das NavMesh nutzen, normale Waypoints selbst überall in deiner Welt verteilen oder du musst dich nun mal mit Pathfinding auseinander setzen. So ein Open World Spiel entwickelt sich nun mal nicht von selbst!
×