Jump to content
Unity Insider Forum

Marrrk's Blog

  • Einträge
    8
  • Kommentare
    5
  • Aufrufe
    31.039

UltraTerrain Dev Diary #3


Mark

906 Aufrufe

Die Entwicklung geht gut vorran.

Ich habe die Page Klasse sowie die DataHandler dazu nun fertig implementiert. Die Klasse ist ein Monster was Interface Benutzung angeht

[CODE]

public class Page : IPage, IExtractable, ILockable, IMemoryUsageInformer, IChangeTracker, IPresenceNotifier, IDisposable
{
...
}
[/CODE]

Der Benutzer selbst bekommt nur IPage angeboten, hier mal eine kleine Auflistung was die einzelnen Interfaces machen:

IPage:
[quote]Enthält die zur Page gehörigen Chunks, kennt das VoxelObjekt, den Index im VoxelObjekt und die ausmaße der Page in Voxeleinheiten[/quote]

IExtractable:
[quote]Bietet die Extract und Infuse Methoden an um Datenblöcke zu kopieren oder einzufügen.[/quote]

ILockabla:
[quote]Bietet die Möglichkeit den Zugriff zu locken, was ich fürs Threading benötige.[/quote]

IMemoryUsageInformer:
[quote]Bietet die Möglichkeit an den gebrauchten Speicher in Megabyte, Kilobyte und Byte zu erfahren, für Statistiken.[/quote]

IChangeTracker:
[quote]Weiß über vorgenommene änderungen und die Art der änderung bescheid, zB Voxelwerte wurden verändert oder die Materialdaten.[/quote]

IPresenceNotifier:
[quote]Bietet Methoden an mit denen ich Bereiche von Interesse hervorheben kann, zB kann gesagt werden dass die Kamera sich in einem bestimmten Bereich befinden und die Page würde wenn sie betroffen ist alles nötige tun damit die Kamera alles sehen kann.[/quote]

Am interessantesten für diesen Blogpost ist das letzte erwähnte Interface der [b]IPresenceNotifier[/b].

Dieses Interface wird auch vom VoxelObjekt implementiert und angeboten. Das Voxelobjekt würde dann ausgehend von der tatsächlich per Koordinaten angegebenen Page alle umliegenden Pages ebenfalls benachrichtigen. Je weiter diese Pages sich vom Zentrum entfernen desto weniger dringend ist diese Präsenz Benachrichtigung.

Das Bedeutet, dass nur die Pages mit der höchsten Priorität (direkt das Zentrum+1 Page Umliegend) sofort und blockierend geladen werden. Blockierend bedeutet dass zwar mehrere Threads benutzt werden um die Daten zu laden, der Haupthread aber darauf wartet dass diese Aktionen abgeschlossen wurden.

Weiter entfernt liegende Pages werden nicht blockierend geladen, da diese nicht sofort relevant für das Erlebniss sind.

Diese beiden Reichweiten (Kernbereich+Weitbereich) können im Discriptor vom VoxelObjekt eingestellt werden.

Sollte die letzte Präsenz Benachrichtigung zu lang zurück liegen (die Kamera also zB schon nicht mehr in der Nähe sein), wird je nach Benachrichtigungstyp der zuletzt auftrat, zuerst die Daten komprimiert und in den Speicher gelegt und dann später persistent abgespeichert, ausserdem wird die Page aus dem Speicher entfernt bis sie wieder gebraucht wird.

Diese Zeit ist ebenfalls konfigurierbar über den Descriptor des VoxelObjects.

Das ganze dient dazu ein recht robustes Streaming System zu realisieren welches nur die Daten lädt die auch wirklich wichtig für den Benutzer sind. Bereiche die viel zu weit weg liegen werden nicht in den Speicher geladen und verbrauchen damit keinerlei Platz. Auch ist das System flexibel genug zu entscheiden welcher Typ von Daten gebraucht wird.

Fordert der Benutzer an nur ein Besucher zu sein werden keine Voxeldaten geladen, wenn bereits alle nötigen Geometrien (Meshs) erzeugt wurden. Sollten die MEshs noch nicht erzeugt worden sein so werden die Chunks (Chunks sind Unterelemente der Pages welche die Meshs liefern) die Page auffordern alles nötige nachzuladen damit die Daten generiert werden können.

Fordert der Benutzer an sowohl Besucher als auch Veränderer zu sein so werden gleich die Voxeldaten mitgeladen um auf Aktionen des Benutzers sofort reagieren zu können.

0 Kommentare


Recommended Comments

Keine Kommentare vorhanden

Gast
Kommentar schreiben...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...