Jump to content
Unity Insider Forum

Terrain: TerrainData.SetAlphamaps(Performance-Probleme)


John

Recommended Posts

Hallo Leute,

 

ich hab grade versucht mit dem TerrainData.SetAlphamaps Realtime auf das Terrain veränderungen vorzunehmen.

 

Doch es ruckelt jedesmal beim refreshen vom Terrain. Ist auch Nachvollziehbar den er muss bei mir 6-Texturen refreshen.

 

Hat jemand vielleicht einen Tipp/oder auch das Problem gehabt und kann mir einen Lösung/Idee verraten wie man das besser lösen kann?(bzw. das problem beheben kann)

 

Mfg.

John

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja aber dadurch wird ein hässlicher Effekt ausgelöst. (die Texture wird immer heller)

Ich hab die laggs ein wenig eingedämpt. In dem ich nicht die ganze Texture lade/Verändere sondern nur den Bereich der geändert wird.

Vorerst funktioniert es besser, aber ist noch immer noch nicht optimal.

 

Mfg.

John

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 years later...

Ich hole den Thread mal wieder hoch, da ich mich derzeit mit dem selben Problem herumschlage.

Ich möchte ingame Pfade auf das Terrain zeichnen. Das habe ich per TerrainData.SetAlphamaps realisiert.
Die Pfade sind in einige kleinere Abschnitte unterteilt, da sie über mehrere Grid-Nodes hinweg gezeichnet werden. Entsprechend sind die einzelnen Updates der Alphamaps auf kleinere Bereiche beschränkt. Inzwischen habe ich das ganze sogar testweise in eine Coroutine gepackt, die je Frame nur einen kleinen Bereich der Alphamaps aktualisiert. Hierbei habe ich natürlich keine Hänger im Sekundenbereich mehr, dafür baut sich der Pfad aber halt sichtbar stückweise auf, was ich ja eigentlich nicht möchte. Weiterhin ist die Performance trotzdem absolut inakzeptabel. Das Spiel läuft bei mir mit 60-70fps. Sobald ein Weg gezeichnet wird, sinkt die Framerate auf ca. 6-8fps.

Gibt es hierfür inzwischen eine bessere Lösung?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wir hatten letztens ein "ähnliches" Problem, es könnte sein, daß es bei dir ein ähnliches Phänomen gibt, zumindest wäre es eine Überprüfung wert. Ich gehe mal davon aus, du rufst nach .SetAlphamaps nicht selbst "AssetDatabase.SaveAssets" auf. Es könnte aber sein, daß ein anderes Skript, Editorskript oder Asset dies tut. Sobald dieser Aufruf passt, wird das Terrain neu berechnet und damit droppt die FPS extrem. Das Problem ist, daß ein Aufruf von ".SetAlphamaps" das Terrainasset als "Dirty" markiert und ein Aufruf von "AssetDatabase.SaveAssets" das Terrainasset neu speichert und dann neu berechnet.

Ansonsten ist eine Änderung der Alphamaps in jedem Frame natürlich generell keine gute Lösung und kann ggf. auch so zu Performanceproblemen führen. Es ist zu befürchten, daß nach einer Änderung der Alphamaps ebenfalls das Terrain neu berechnet werden muss, d.h. die Terrainchunks müssen neu erzeugt werden etc.
Die Frage wäre dann, warum du die Alphamap permanent ändert musst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe die Projektmappe nach SaveAssets  durchsucht und keine Treffer erhalten. Allerdings werden die Änderungen des Terrains immer gespeichert. Soll heißen: Wenn ich im Play Mode (ingame) Änderungen an den Alphamaps vornehme, sind diese auch noch nach beenden des Play Modes vorhanden. Der Lag (ca. 60 - 100ms) kommt übrigens von Terrain.GenerateBasemap.

Warum ich häufig Änderungen an den Alphamaps vornehmen muss? Bei dem Spiel handelt es sich um ein Aufbaustrategiespiel und dort werden unter anderem Wege gebaut, Geländeeigenschaften geändert usw. Das geschieht nun mal zur Laufzeit während des Spiels und das alles mit Meshes abzubilden, wird nicht nur kompliziert (aufgrund des unebenen Terrains), sondern dann sicherlich auch kritisch bezüglich des Poly-Counts.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich vermute dann mal "SaveAssets" ist nicht das Problem, im Profiler würde sich dann auch eine andere Methode zeigen. Daher denke ich, daß durch die Änderung der Alphamaps zumindest Teile des Terrain neu berechnet werden müssen und das Terrain ist denke ich leider nicht auf Laufzeitänderungen ausgelegt. Die einzige Lösung die ich hier sehe, sind die Bereiche der Änderung stark zu begrenzen und die Häufigkeit der Änderungen.

Laut deinen Ausführungen hast du das bereits getan, d.h. der Methode "SetAlphamaps" nur die Bereiche der Alphamap übergeben die auch tatsächlich geändert werden sollen.
Ich würde SetAlphamaps maximal 1-4x pro Sekunde aufrufen und die Änderungsbereiche nur auf die Wege beschränken. Wenn du beides beachtest sollte die FPS normalerweise wieder steigen.

Zudem könntest du eine Änderung des Spielers auch cachen, d.h. du lässt den Spieler zwar eine Straße bauen, zeigst aber nur eine Art Gizmo an. Wenn der Teil der Straße soweit fertig ist, dann wird die Änderung permanent gemacht und SetAlphamaps aufgerufen. Damit rufst du SetAlphamaps nur 1x auf und nicht x-mal pro Sekunde. Stell dir den Aufruf von SetAlphamaps wie den Bake-Button in Unity vor ... den kannst du auch nicht x-mal pro Sekunde aufrufen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, so ähnlich habe ich es nun gemacht.

Die Abschnitte des Weges werden über einen Pathfinding-Algorithmus generiert, dann auf die aktuelle Basemap geschrieben und zum Schluss der benötigte Teil der Alphamaps ersetzt. Das ganze geht jetzt auch innerhalb eines Frames ohne übertriebene Ruckler. Falls jemand das gleiche Problem hat, kann ich das ganze auch gern noch mal im Detail erläutern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 month later...

Guten Tag,

derzeit arbeite ich an einem Karteneditor. Dieser soll natürlich auch die möglichkeit enhalten das Terrain zu bemalen. Dabei entstehen starke ruckler. Deshalb bitte ich um eine erläuterung wie sie das Problem der Performance ruckler beseitigt haben.

 

Gruß ick

Am 30.10.2017 um 15:21 schrieb GaRv3:

Ja, so ähnlich habe ich es nun gemacht.

Die Abschnitte des Weges werden über einen Pathfinding-Algorithmus generiert, dann auf die aktuelle Basemap geschrieben und zum Schluss der benötigte Teil der Alphamaps ersetzt. Das ganze geht jetzt auch innerhalb eines Frames ohne übertriebene Ruckler. Falls jemand das gleiche Problem hat, kann ich das ganze auch gern noch mal im Detail erläutern.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wichtig ist TerrainData.SetAlphamaps nur für den Teilausschnitt aufzurufen und möglichst nicht jedes Frame. Bei jedem Aufruf wird intern das Array durchlaufen und je größer der Bereich desto mehr wird die CPU belastet. Soll heißen die Änderungen an der Splatmap intern aufsammeln (und nicht für jeden Ministrich) und dann SetAlphamaps mit den geänderten Mapdaten aufrufen. Zudem würde ich SetAlphamaps vielleicht nur jede Sekunde 1x aufrufen, tut man dies öfter blockiert man den Framezyklus zu stark. Zusammenfassend, kleine Bereiche übergeben und nicht jedes Frame aufrufen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...