Ontwikkelgids voor compatibiliteit van de gegevensformaten LCC en LCC2
Het LCC2-gegevensformaat biedt betere gegevenscompressie en LOD-mechanismen. Het oorspronkelijke LCC-formaat wordt geleidelijk vervangen door LCC2 en de oorspronkelijke LCC SDK (v1.x) wordt geleidelijk niet meer onderhouden. Omdat de oude en nieuwe gegevensformaten sterk verschillen, is de nieuwe LCC SDK (v2.x) niet achterwaarts compatibel met het LCC-formaat. Gegevenscompatibiliteit kan op de volgende twee manieren worden bereikt:
- Gebruik de officiële converter (LccConverter) exe/dll om het LCC-gegevensformaat om te zetten naar LCC2 en gebruik dit vervolgens in de SDK;
- Implementeer compatibiliteit van de gegevensformaten LCC en LCC2 op de applicatielaag.
Deze gids beschrijft voornamelijk de stroom en stappen van het implementeren van compatibiliteit van gegevensformaten op de applicatielaag, dat wil zeggen het tegelijk importeren van twee SDK-versies in hetzelfde Unity-project en het automatisch selecteren van de juiste versie voor rendering en verwerking op basis van het gegevensformaat.
Stap 1: Unity-versie en projectinstellingen
De Unity-versie en projectinstellingen zijn hetzelfde als bij zelfstandig gebruik van de SDK; er is geen extra configuratie vereist. Zie Snelstartgids voor pc en Optimalisatiegids voor projectinstellingen.
Stap 2: De twee SDK-versies importeren
Importeer SDK v1.4.8 en later (v1.4.32 wordt aanbevolen) en SDK v2.0.1 en later via Unity UPM. Na het importeren wordt de v1.x-versie weergegeven als Legacy. De twee SDK-versies kunnen naast elkaar bestaan zonder elkaar te beïnvloeden.
Opmerking:
- SDK v1.4.32 kan worden gedownload van GitHub: https://github.com/xgrids/LCC-Unity-SDK/releases
- De namespace van SDK v1.4.32 is
LCCCore_Legacyen de managercomponent isLCCManager_Legacy; de namespace van v2.x isLCCCoreen de managercomponent isLCCManager.
Stap 3: De scène configureren
Maak een leeg object aan in de scène met de naam LCCController en voeg zowel de LCCManager_Legacy- als de LCCManager-component eraan toe.

Voeg zowel de LCCManager_Legacy- als de LCCManager-component toe aan het LCCController-object
Opmerking:
De Transform-instellingen van het LCCController-GameObject (Rotation.x = -90, Scale.x = -1) lijnen het uit met het coördinatensysteem van de LCC-gegevens. Zie "Coördinatensysteem van LCC-gegevens" in LCC Unity SDK Introductie voor meer informatie over de uitlijning van het coördinatensysteem.
Stap 4: Het MultiSDKController-script schrijven
Maak een nieuw C#-script aan met de naam MultiSDKController.cs met de volgende code:
using LCCCore;
using LCCCore_Legacy;
using System.IO;
using UnityEngine;
public class MultiSDKController : MonoBehaviour
{
public LCCManager_Legacy m_managerLegacy; // voor LCC SDK v1.4.8 en eerder
public LCCManager m_manager; // voor LCC SDK v2.0.0 en later
public string m_FilePath; // LCC-bestandspad
private LCCCore_Legacy.Renderer m_rendererLegacy; // voor LCC SDK v1.4.8 en eerder
private LCCCore.Renderer m_renderer; // voor LCC SDK v2.0.0 en later
private DataType m_dataType; // gegevenstype, gebruikt om te bepalen welke SDK moet worden gebruikt
void Start()
{
string extension = Path.GetExtension(m_FilePath);
if (extension == ".lcc")
{
m_manager.Enable = false; // schakel de manager van v2.0.0+ uit
m_dataType = DataType.LCC;
m_rendererLegacy = m_managerLegacy.GetRender(this.transform);
m_rendererLegacy.Load(m_FilePath, LCCCore_Legacy.PlatformType.PC, onLoadCallback);
}
else if (extension == ".lcc2")
{
m_managerLegacy.Enable = false; // schakel de manager van v1.4.8 en eerder uit
m_dataType = DataType.LCC2;
m_renderer = m_manager.GetRender(this.transform);
m_renderer.Load(m_FilePath, LCCCore.PlatformType.PC, onLoadCallback);
}
}
private void onLoadCallback()
{
Debug.Log("gegevens geladen !!!");
}
// Voorbeeld van een methodeaanroep: bepaal op basis van het gegevenstype op welke SDK-renderer moet worden geopereerd
public void onRenderPointClick()
{
if (m_dataType == DataType.LCC)
m_rendererLegacy.SwitchRenderMode(LCCCore_Legacy.RenderMode.PointCloud);
else if (m_dataType == DataType.LCC2)
m_renderer.SwitchRenderMode(LCCCore.RenderMode.PointCloud);
}
void OnDestroy()
{
if (m_dataType == DataType.LCC)
m_rendererLegacy?.Dispose();
else if (m_dataType == DataType.LCC2)
m_renderer?.Dispose();
}
public enum DataType { LCC, LCC2 }
}
Opmerking:
- De bestandsnaam van het script moet overeenkomen met de klassenaam (
MultiSDKController.cskomt overeen metclass MultiSDKController), anders kan het niet aan een GameObject worden toegevoegd.- De twee versies hebben verschillende namespaces (
LCCCoreenLCCCore_Legacy). Bij het gebruik van typen met dezelfde naam, zoalsRenderer,PlatformTypeenRenderMode, moet je de namespace als voorvoegsel toevoegen om ze te onderscheiden.- Het voorbeeld bepaalt het gegevensformaat aan de hand van de bestandsextensie (
.lcc/.lcc2) en selecteert de bijbehorende SDK-versie.
Stap 5: Het script toevoegen en eigenschappen instellen
- Voeg het
MultiSDKController.cs-script eveneens toe aan het LCCController-object in de scène. - Sleep in het Inspector-venster de LCCManager- en LCCManager_Legacy-componenten naar de bijbehorende scripteigenschappen.
- Vul het LCC- / LCC2-bestandspad in bij de eigenschap File Path van het script.

Voeg het MultiSDKController-script toe en stel de eigenschappen in de Inspector in
Wanneer je de code nu uitvoert, wordt automatisch de bijbehorende SDK-versie gebruikt voor rendering op basis van het LCC-gegevensformaat, waarmee compatibiliteit van gegevensformaten wordt bereikt.
Belangrijkste stappen
De belangrijkste stappen voor het implementeren van compatibiliteit van de gegevensformaten LCC en LCC2 op de applicatielaag:
- Importeer zowel de v1.x- (Legacy) als de v2.x-SDK-versie via UPM; de twee kunnen naast elkaar bestaan.
- Voeg zowel de
LCCManager_Legacy- als deLCCManager-managercomponent toe aan hetzelfde object. - Selecteer de manager van de bijbehorende versie om een renderer aan te maken en gegevens te laden op basis van het gegevensformaat (bestandsextensie
.lcc/.lcc2). - Schakel nadat is bepaald welke versie wordt gebruikt de manager van de andere versie uit (
Manager.Enable = false). - Geef bij het wisselen van gegevens of bij vernietiging de momenteel gerenderde gegevens vrij via
Renderer.Dispose().
Opmerkingen bij compatibiliteit van gegevensformaten
Gelijktijdige rendering van LCC en LCC2 wordt niet ondersteund. Daarom moet je bij het wisselen van gegevens eerst de momenteel gerenderde gegevens vrijgeven (roep
Renderer.Dispose()aan), anders kunnen er geheugen- en videogeheugenlekken ontstaan.Schakel de ongebruikte Manager uit. Nadat is bepaald welke SDK-versie wordt gebruikt, kun je het beste het Manager-object van de andere SDK-versie uitschakelen (
Manager.Enable = false), anders kan dit enige ineffectieve prestatieoverhead veroorzaken.De API-interfaces zijn consistent, maar je moet de juiste Renderer aanroepen. De API-interfaces van de twee SDK-versies zijn precies hetzelfde (in v2.x zijn veel API's verplaatst naar de Manager-klasse; zie de API-handleiding), maar je moet ervoor zorgen dat je de Renderer van de juiste versie aanroept (
m_rendererLegacyofm_renderer). Bovendien ondersteunen v2.0.0 en later geen kleuraanpassing en opslaan van knipgegevens meer, en zijn ook enkele andere API's verouderd; raadpleeg de ontwikkelaarsdocumentatie van de betreffende versie.
Gerelateerde API's
Deze oplossing omvat voornamelijk de manager- en renderer-API's van de twee SDK-versies. Hieronder wordt v2.x (LCCCore) als voorbeeld gebruikt; v1.x (LCCCore_Legacy) heeft dezelfde interface met alleen een andere namespace.
LCCManager.Enable
// Eigenschap
public bool Enable { get; set; }
De in-/uitschakelaar van de manager. Door deze op false in te stellen wordt de manager van die SDK-versie uitgeschakeld, waardoor ineffectieve prestatieoverhead door gelijktijdig werken met de andere versie wordt vermeden.
Gebruiksvoorbeeld:
// Schakel bij gebruik van LCC2-gegevens de Legacy-manager uit
m_managerLegacy.Enable = false;
Opmerkingen:
- Nadat is bepaald welke versie wordt gebruikt, wordt aanbevolen om de manager van de andere versie uit te schakelen.
GetRender
// Retourwaarde: Renderer → renderinstantie, null bij mislukking
public Renderer GetRender(Transform _transform)
Maakt een renderinstantie aan en bindt deze aan de opgegeven Transform.
| Parameter | Type | Beschrijving |
|---|---|---|
_transform | Transform | De Transform waaraan de renderinstantie wordt gekoppeld |
Gebruiksvoorbeeld:
m_renderer = m_manager.GetRender(this.transform);
Opmerkingen:
- Moet worden aangemaakt via de manager van de bijbehorende versie om ervoor te zorgen dat de renderer overeenkomt met het gegevensformaat.
Renderer.Dispose
// Retourwaarde: void
public void Dispose()
Vernietigt de renderinstantie en geeft alle GPU-resources en geheugen vrij. De instantie kan na vernietiging niet opnieuw worden gebruikt.
Gebruiksvoorbeeld:
m_renderer?.Dispose();
Opmerkingen:
- Voordat je van gegevens wisselt, moet je de huidige gegevens eerst vrijgeven, anders kunnen er geheugen- en videogeheugenlekken ontstaan.
- Na het aanroepen wordt de Manager automatisch op de hoogte gesteld om de verwijzing te verwijderen.
- Het wordt aanbevolen om het aan te roepen wanneer het object wordt vernietigd (
OnDestroy).