Jump to content
Unity Insider Forum

Diese bösen Draw Calls


Ricky-W

Recommended Posts

Mal zusammengefast wen man jetzt eine riesen Welt hat und diese einigermaßen schön gestaltet hat,

muss diese exportier und zerschnibbelt werden, dann müssen da massenweise kleine Stückchen einzeln bemahlt werden.

 

1.Wir das nicht Problematisch bei einer sehr großen Welt die aus kp 200 vieleicht sogar 600 Stücken besteht?

(Auch wen durch LOD nur 10-12 Sichtbar sind)

 

Korrekt. Das wird problematisch. Deswegen verwendet man für solch grosse Welten normalerweise auch keine Meshterrains. Sondern gestreamate Heightmap Terrains. Da ist dann nur die Heightmap als Datensatz interessant. Eine einfache Greyscale Textur. Aber im Prinzip kannst du auch Meshteile streamen.

 

2.Wird das nicht auffälig wen ständig Texturkanten am Terrain-Ende sind?

 

Das Problem hättest du auch mit einem Heightmapterrain. Wenn das sauber gemappt und gepinselt ist sollte der übergang nicht arg zu sehen sein.

 

3.Braucht man nicht eine UVW map um Hölen und Felsübersprünge ordentlich zu bemahlen?

 

Jopp. Wie gesagt, das Ding muss gemappt sein.

 

4.Gibt das nicht Probleme beim Workflow wen man ständig umschalten muss zwischen den einzelnen Bereichen und das man beim

genauern anpassen des Terrains ständig neu exp/Importieren sowie neu zerschnibbeln muss?

 

Genaues Anpassen des Terrains sollte schon vor dem importieren passieren. In deinem Modeler.

 

5.Anmahlen kann man ja eigentlich erst ganz zum schluss, währe das nich scheiße wen man dann fast fertig ist, und dann alles nochmal machen muss weil man ne höhenänderung irgetwo vornehmen muss?

 

Fürs bemalen musst du keine Geometrie mehr ändern. Die sollte wie gesagt schon vor dem importieren passen.

 

Also für kleinere bis mitlerre Terraingrößen find ich es noch verwendbar, aber bei MMO größen wird der Worflow glaube ich zu stressig und man kann sich garnich mehr richtig kreativ ausleben weil man die ganze Zeit mit der Technik rumdadeln muss...

(Denke ich)

 

Jopp, es ist deutlich mehr Arbeit ein Meshterrain zu züchten als ein Heightmap Terrain. Drum überlege wer sich ewig bindet ... ;)

 

Bei meinem Alister hatte ich keine andere Wahl. Meine Spielmechanik verträgt sich nicht mit Heightmap Terrains :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie viele Terrain angezeigt werden, kann man noch immer entscheiden (wobei dies nicht über LOD läuft, sondern vom Server gesteuert wird ;)).

 

Das Problem mit den Textur Kanten verstehe ich. Vor allem um so mehr Terrains wir haben, um so mehr muss angepasst werden.

Aber dies sollte ja prinzipiell nur einmal gemacht werden müssen.

 

Wie würdet ihr sinnvoll Höhlen bei einem Unity Terrain erstellen?

Ich kenne bisher nur die Depth Mask Methode. Gibts da evtl noch andere?

Funktioniert diese Methode überhaupt zu 100%? Wir hatten bisher immer das Problem, dass bei reingehen in eine Höhle alles super passt, sobald man aber raus geht, flackert das Terrain kurz durch. -.-

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kurze Info für die die es Interessiert.

Wir sind zu dem Ergebnis gekommen, dass wir beide Systeme verwenden.

Wir haben ein Grund-Terrain, welches per Heightmap in Unity erstellt wird.

Alle anderen Themen die oberhalb oder unterhalb des Grund-Terrains sind, werden per Mesh gemacht.

 

Wir werden zusätzlich das Unity Terrain als Mesh exportieren und dort dann die Höhleneingänge sowie Felsvorsprünge etc. zu einem Mesh zusammenfassen, damit wir nur ein Mesh Terrain am Server haben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So nun bin ich wieder einmal Ratlos oder auch zu dämlich :blink: .

Es sollte doch so sein: 1 Material = 1 Draw Calls, 2 Objekte mit dem selben Material = 1 Draw Calls ( außer eines wird anders Beleuchtet dann 2 Draw Calls)

Aber wieso ist es, wenn ich ein Objekt kopiere und einfüge, dass es dann bis zu 6 Draw Calls mehr sind, wo es eigentlich gleich bleiben sollte? :unsure: Siehe Bild (Hütte ist doppelt)

Lg

Ricky-W

post-1076-0-82368400-1362505879_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bin mir auch nicht zu 100% sicher, würde aber sagen, dass jedes Objekt ein eigenen DrawCall erzeugt. jedes Material auch eines. Wenn du nun 2 Objekte hast, welche auf das selbe Material zugreifen, müssten 3 DrawCalls rauskommen.

Wenn beide Objekte unterschiedliche Materials verwenden kommen natürlich pro Material 1 DrawCall dazu.

 

Wie du schon sagst, werden bei unterschiedlicher Belichtung weitere DrawCalls erzeugt.

Um aber aus 2 Objekten 1 DrawCall zu machen, müsstest du sie zu einem Objekt machen (Combine Meshes).

Wie gesagt, nicht zu 100% sicher, denke aber das so gelesen zu haben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Selsbt wenn du 2mal das gleiche Modell hast, wird nur gebatcht, wenn es eine bestimmte Anzahl an Polygonen nicht überschreitet.

Muss selbst erst nachschauen, wieviel genau das ist, aber ich denke mal, deine Hütte überschreitet diese Anzahl.

 

€dit:

Gefunden:

 

Batching dynamic objects has certain overhead per vertex, so batching is applied only to meshes containing less than 900 vertex attributes in total.

 

http://docs.unity3d.com/Documentation/Manual/DrawCallBatching.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

THX für die Antworten, ein Freund hat ein Script gefunden Draw Calls Optimizer und testet es (da ist er von 10.000 DrawCalls auf 80 runter), nur was mich depremiert hat, das ich es anscheinend falsch verstanden habe, also ich dachte auch wenn es 10 Objekte habe und nur ein Material, dann wäre es nur ein Draw Calls (außer wenn Licht ecc.), leider ist es nicht so. Bei mir ist das Schiff 4 Draws wert :) und bei einem anderen habe ich gelesen ein Buch 7 :blink: , also komm ich ja noch billig davon B) . Aber was noch stand, 5 Draw Calls kosten ein FPS, aber warum habe ich mehr FPS bei dem Bild wo mehr Draws sind, müsste ja umgekehrt sein :( .

LG

Ricky-W

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Info mit den 5 Drawcalls / Frame kannst du nicht so ohne Weiteres festmachen.

Bei einem IPad 1 ist das so, da wird die Grafik aber ganz anders erzeugt als bei einer Grafikkarte im PC.

 

10.000 Drawcalls ist aber echt mal ein Wort! Das muss man erstmal schaffen. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jedes unabhängige Mesh bedeutet ein Drawcall. Jedes Material auch. Vier Hütten mit gleichem Material, aber unabhängig von einander? Vier Drawcalls. Einfach eigentlich :)

 

Nun etwas komplizierter: wenn zum Beispiel ein Projector Shadow (Blobshadow) ein Mesh streift (oder besser gesagt dessen Boundingbox), dann wird das Objekt noch mal gezeichnet. Ein Mesh mit einem Material das von einem Projektorshadow gestreift wird: zwei Drawcalls. Ein Objekt, ein Material plus vier Projektorshadows: fünf Drawcalls.

 

Und jedes Licht das da noch im Spiel ist verdoppelt die Drawcalls noch.

 

10.000 Drawcalls ist aber echt mal ein Wort! Das muss man erstmal schaffen. :)

 

Och ... Tausend schafft man spielerisch. Dann noch zehn Pointlights dazu ... :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke, jetzt habe ich es verstanden (zumindest besteht die Hoffmung), höchstwahrscheinlich ist Blobshadow oder sowas standartmäßig eingestellt und darum habe ich 4 Draw Calls bei mein Modell.

Früher oder später werde ich noch "DER HERR DER DRAW CALLS" :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Soweit mein Wissen reicht, sind Blobshadows ja Schatten die vorher berechnet/Erstellt wurde und dann in einem gewissen Winkel auf die Oberfläche gezeichnet werden.

 

Das müste ja eigentlich viel perfomanter laufen als überall realtime zu haben, zb. in einem Wald.

 

Man könte je nach Winkel der Sonne eine Zerrung in die Schattentextur einbauen so das Sonnenaufgängen und Untergänge simuliert werden können.

 

Die Frage ist wie funktioniert das in Unity und wie setzt man das um?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Gezerrt wird die Textur bei schrägem Einfall soweiso.

Und das mit der Sonne klatt in der Tat wunderbar.

 

Das kriegt die Sonne:

private static var instance : Transform;

function Awake()
{
 instance = transform;
}

static function GetRotation() : Quaternion
{
 return instance.rotation;
}

 

Und das alle BlobShadows:

function LateUpdate()
{
 transform.rotation = NameDesSonnenSkriptes.GetRotation();
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...