Przewodnik konfiguracji parametrów wydajności renderowania
Przegląd
Aby dostosować się do urządzeń o różnym poziomie wydajności, LCC Unity SDK udostępnia kilka parametrów konfiguracji wydajności renderowania. Są one rozmieszczone na klasie LCCManager i klasie Renderer, obejmując głównie następujące metody:
| Klasa | Metoda | Cel | Moment wywołania |
|---|---|---|---|
LCCManager | SetMaxBufferSplat | Ustaw maksymalną pojemność bufora (alokowaną raz na GPU) | Musi być przed dowolnym Renderer.Load() |
LCCManager | SetFullRenderSplat | Ustaw próg liczby Splatów między renderowaniem pełnym/fragmentowym | Musi być przed Load() |
LCCManager | SetMaxRenderSplats | Ustaw całkowitą liczbę Splatów renderowanych na ekranie w renderowaniu fragmentami | W dowolnym momencie podczas renderowania fragmentami |
LCCManager | SetStartLod | Ustaw początkowy poziom LOD | Działa w czasie działania, po Load() |
LCCManager | SetDetailLevel | Ustaw poziom szczegółowości renderowania (dostrajanie precyzji renderowania) | Można dostosowywać dynamicznie w czasie działania |
Renderer | SetRenderAll | Ustaw, czy wymusić pełne renderowanie | Musi być przed Load() |
Uwaga:
Spośród powyższych parametrów jednostki metod związanych z liczbą Splatów (
SetMaxBufferSplat,SetFullRenderSplat,SetMaxRenderSplats) są wszystkie w dziesiątkach tysięcy, tj. przekazana wartość × 10000 = rzeczywista liczba Splatów.
Uwaga:
SetMaxBufferSplat ustawia maksymalną przestrzeń bufora pamięci CPU i pamięci wideo GPU dostępną do renderowania, natomiast SetMaxRenderSplats ustawia liczbę prymitywów Splat renderowanych na ekranie podczas renderowania strumieniowego fragmentami. Dlatego jeśli wartość ustawiona przez SetMaxRenderSplats przekracza wartość ustawioną przez SetMaxBufferSplat, zostanie przycięta.
Tryby renderowania SDK
Aby dostosować się do różnych danych i platform, SDK ma 3 główne tryby renderowania. Zrozumienie trybów renderowania jest warunkiem prawidłowego ustawiania parametrów wydajności, ponieważ różne parametry działają tylko w określonych trybach.
- Tryb SingleRender (domyślny): używany głównie na PC/Mac. Ten tryb nie pozwala na tworzenie wielu Rendererów, co oznacza, że naraz można renderować tylko jedną scenę LCC. Gdy ilość danych jest mała i spełnia wymagania, dane będą renderowane w pełni (ładowane są pełne dane LOD0, bez dynamicznego przełączania LOD, najlepsza jakość renderowania); gdy prymitywy Splat LOD0 przekraczają całkowitą ilość, którą można w pełni wyrenderować, dane będą renderowane fragmentami, przy użyciu mechanizmu dynamicznego strumieniowego renderowania LOD w czasie działania do renderowania bardzo dużych scen.
- Tryb MultiRender: używany głównie na PC/Mac. Ten tryb pozwala na mieszane renderowanie wielu scen LCC w czasie rzeczywistym; wszystkie dane sceny będą renderowane fragmentami przy użyciu mechanizmu dynamicznego LOD.
- Ścieżka renderowania fragmentami: na platformach Mobile (iOS / Android), VR (Pico 4 / Quest 3) oraz dla źródeł danych HTTP na PC/Mac używana jest ścieżka renderowania fragmentami, wykorzystująca mechanizm dynamicznego LOD.

Relacja między trzema trybami renderowania SDK a ścieżkami renderowania pełnego / fragmentowego
Renderowanie pełne a renderowanie fragmentami:
- Renderowanie pełne: ładuje i renderuje pełne dane LOD0 naraz, najlepsza jakość obrazu, włączane tylko w trybie SingleRender na PC/Mac, gdy ilość danych LOD0 spełnia warunki.
- Renderowanie fragmentami: dynamicznie ładuje dane poziomu LOD zgodnie z frustum kamery renderującej, kontroluje liczbę Splatów na ekranie i dostosowuje się do środowisk sprzętowych o ograniczonej pamięci wideo i wydajności.
Wartości domyślne SDK
Wartości domyślne, minimalne dozwolone wartości i maksymalne dozwolone wartości dla każdej platformy są następujące (jednostka: dziesiątki tysięcy):
| Element | Wartość domyślna | Minimalna dozwolona wartość | Maksymalna dozwolona wartość | Uwagi |
|---|---|---|---|---|
| Bufor globalny | PC/Mac: 3000 Mobile: 300 VR: 100 | 100 | PC/Mac: 4450 Mobile: 600 VR: 200 | Sterowany przez SetMaxBufferSplat() |
| Próg pełnego renderowania | 2500 | 100 | 4450 | Sterowany przez SetFullRenderSplat(); działa tylko dla trybu SingleRender na PC/Mac |
| Liczba renderowanych na ekranie w trybie fragmentowym | PC/Mac: 2000 Mobile: 200 VR: 60 | 10 | —— | Sterowana przez SetMaxRenderSplats(); maksymalna wartość jest ograniczona ilością bufora globalnego |
| Czy wymusić pełne | Nie | —— | —— | Działa tylko na PC/Mac i tylko dla trybu SingleRender |
Strategia konfiguracji PC/Mac
Dla PC/Mac zaleca się konfigurowanie parametrów zgodnie z następującymi poziomami jakości (jednostka liczby Splatów: dziesiątki tysięcy):
| Poziom | Bufor globalny | Próg pełnego renderowania | Liczba na ekranie w trybie fragmentowym | StartLOD | Wymuś pełne |
|---|---|---|---|---|---|
| Bardzo niski | 300 | 300 | 300 | 2 | Nie |
| Niski | 1000 | 1000 | 1000 | 1 | Nie |
| Średni | 3000 | 1900 | 1900 | 1 | Nie |
| Wysoki | 3000 | 2500 | 2500 | 0 | Nie |
| Bardzo wysoki | 3000 | 3000 | 3000 | 0 | Nie |
Uwagi dotyczące przełączania poziomów w czasie działania
- Przy przełączaniu między poziomami Średni / Wysoki / Bardzo wysoki możesz pozostawić bufor globalny bez zmian, a logika obsługi jest bardzo prosta: wystarczy ustawić próg pełnego renderowania, liczbę renderowanych na ekranie i StartLOD.
- Przy przełączaniu między poziomami Bardzo niski / Niski a innymi poziomami sytuacja jest bardziej złożona: ponieważ bufor globalny mógł już zostać zaalokowany, musisz najpierw zniszczyć oryginalny bufor globalny, a następnie utworzyć nowy bufor. Ta operacja wymaga zwolnienia wszystkich Rendererów przez
Dispose()i zwolnienia bufora, a następnie ponownego pozyskania Renderera przezGetRender(). - Aktualne zalecenie: ustaw domyślny poziom na Wysoki; przy przełączaniu poziomów pozostaw bufor globalny bez zmian, ale nadal obsługuj przełączanie renderowania pełnego/fragmentowego.
Uwagi
SetMaxBufferSplat()musi być ustawione na samym początku, najlepiej przedGetRender(). Jeśli ustawisz tę wartość po tym, jak scena już działa, musisz zwolnić wszystkie Rendery przezDispose(), a następnie ponownie pozyskać Renderer, aby zadziałało.SetFullRenderSplat()działa tylko dla trybu SingleRender na PC/Mac i musi być ustawione przedLoad().SetMaxRenderSplats()dotyczy całego renderowania fragmentami i można je ustawić w dowolnym momencie, ale musi być późniejsze niżSetMaxBufferSplat()(jeśli ta metoda jest wywoływana).
API wydajności renderowania
SetMaxBufferSplat
// Wartość zwracana: void
public void SetMaxBufferSplat(int _count)
Ustawia maksymalną pojemność bufora GPU (liczbę Splatów). Na ścieżce RenderCore (fragmenty MultiRender / SingleRender) określa rozmiar współdzielonego bufora globalnego; w trybie SingleRender Full Load jest alokowany zgodnie z rzeczywistą ilością danych i nie odwołuje się do tej wartości. Alokowany raz i nie może być modyfikowany dynamicznie.
| Parametr | Typ | Opis |
|---|---|---|
_count | int | Rozmiar globalnego zunifikowanego bufora, w liczbie Splatów 3DGS, jednostka: dziesiątki tysięcy |
Przykład użycia:
lccManager.SetMaxBufferSplat(3000); // 30 milionów punktów (domyślnie PC/Mac)
lccManager.SetMaxBufferSplat(4450); // 44.5 miliona punktów (maksimum PC/Mac)
Opis:
- Jednostka to „dziesiątki tysięcy"; przekazana wartość × 10000 = rzeczywista liczba Splatów.
- Musi być wywołane przed dowolnym
Renderer.Load(), w przeciwnym razie zgłasza błąd i zwraca. - Najpierw należy wywołać
SetPlatformType. - Im większa pojemność, tym większe zużycie pamięci wideo; ustaw w razie potrzeby.
- Limity platform: PC/Mac 44.5 miliona, Android/iOS 6 milionów, VR 2 miliony; minimum 1 milion.
- Wartości domyślne: PC/Mac 30 milionów, Android/iOS 3 miliony, VR 1 milion.
SetFullRenderSplat
// Wartość zwracana: void
public void SetFullRenderSplat(int _count)
Ustawia próg liczby Splatów między renderowaniem pełnym a renderowaniem fragmentami w trybie SingleRender na PC/Mac. Gdy liczba Splatów LOD0 danych jest mniejsza niż ta wartość, używana jest ścieżka pełnego renderowania (dedykowany bufor GPU); w przeciwnym razie używana jest ścieżka renderowania fragmentami.
| Parametr | Typ | Opis |
|---|---|---|
_count | int | Liczba Splatów 3DGS, jednostka: dziesiątki tysięcy |
Przykład użycia:
lccManager.SetFullRenderSplat(2500); // 25 milionów punktów
Opis:
- Jednostka to „dziesiątki tysięcy".
- Obsługiwane tylko na platformach PC/Mac; wywołanie na innych platformach zgłasza błąd i zwraca bezpośrednio.
- Musi być wywołane przed dowolnym
Renderer.Load(). - Najpierw należy wywołać
SetPlatformType. - Zakres wartości
[100, 4450](tj. 1 milion ~ 44.5 miliona).
SetMaxRenderSplats
// Wartość zwracana: void
public void SetMaxRenderSplats(int _count)
Ustawia maksymalną liczbę Splatów renderowanych na ekranie na klatkę w renderowaniu fragmentami. Można wywołać dynamicznie po Load() i jest przycinane przez górny limit ustawiony przez SetMaxBufferSplat. Wywołanie w trybie pełnego renderowania SingleRender nie ma efektu (rejestruje ostrzeżenie i zwraca bezpośrednio).
| Parametr | Typ | Opis |
|---|---|---|
_count | int | Liczba Splatów 3DGS, jednostka: dziesiątki tysięcy; minimum 100 tysięcy, maksimum nieprzekraczające rozmiaru bufora ustawionego przez SetMaxBufferSplat() |
Przykład użycia:
lccManager.SetMaxRenderSplats(2000); // 20 milionów punktów
Opis:
- Jednostka to „dziesiątki tysięcy"; przekazana wartość × 10000 = rzeczywista liczba Splatów.
- Można dostosowywać dynamicznie w czasie działania.
- Nie może przekraczać górnego limitu pojemności ustawionego przez
SetMaxBufferSplat(po przekroczeniu jest automatycznie przycinane i rejestruje ostrzeżenie). - Dostosowywanie w czasie działania nie jest obsługiwane w trybie pełnego renderowania SingleRender.
SetStartLod
// Wartość zwracana: void
public void SetStartLod(int lod)
Ustawia punkt początkowy rozwijania LOD (indeksowany od 0). 0 oznacza najdrobniejszy; im większa liczba, tym grubszy poziom. Ta metoda działa w czasie działania i musi być wywołana po Load().
| Parametr | Typ | Opis |
|---|---|---|
lod | int | Początkowy poziom LOD, zakres [0, 10], 0 jest najdrobniejszy |
Przykład użycia:
lccManager.SetStartLod(0);
Opis:
- Działa tylko dla renderowania fragmentami, zakres
[0, 10], automatycznie przycinane po przekroczeniu. - Rzeczywisty efektywny górny limit jest ograniczony przez
totalLevelsdanych. - SDK działa natychmiast po wywołaniu.
SetDetailLevel
// Wartość zwracana: void
public void SetDetailLevel(float sse)
Ustawia poziom szczegółowości renderowania, używany do dostrajania precyzji renderowania. Im większa wartość, tym drobniejsze renderowanie i wyższy koszt wydajności.
| Parametr | Typ | Opis |
|---|---|---|
sse | float | Współczynnik podziału, zakres [1, 100]. 1 = najgrubszy (brak doprecyzowania nawet z bliska), 100 = najdrobniejszy (wszystkie poziomy doprecyzowane do najniższego) |
Przykład użycia:
lccManager.SetDetailLevel(50f); // Średnia precyzja
Opis:
- Ten parametr służy do dostrajania szczegółowości sceny, dotyczy tylko renderowania fragmentami, domyślnie 40, zakres
[1, 100], automatycznie przycinany po przekroczeniu. - Używa mapowania logarytmicznego: zakres niskich wartości jest wrażliwy na zmiany, a zakres wysokich wartości zmienia się łagodnie.
- Można dostosowywać dynamicznie w czasie działania.
SetRenderAll
// Wartość zwracana: void
public void SetRenderAll(bool _renderAll)
Metoda klasy Renderer. Ustawia, czy ten Renderer wymusza pełne renderowanie, i musi być wywołana przed Load(). Używana tylko dla trybu SingleRender na PC/Mac: w momencie wykonania porównuje ilość danych LOD0 z górnym limitem 44.5 miliona; jeśli LOD0 < 44.5 miliona, dane pełne LOD0 są używane bezpośrednio do renderowania; jeśli LOD0 > 44.5 miliona, to ustawienie jest nieskuteczne (ograniczone maksymalnym GBufferem Unity) i zamiast tego używane jest renderowanie fragmentami.
| Parametr | Typ | Opis |
|---|---|---|
_renderAll | bool | Czy wymusić pełne renderowanie |
Przykład użycia:
renderer.SetRenderAll(true);
renderer.Load(filePath, null, () => Debug.Log("Pełne załadowane"));
Opis:
- Obsługiwane tylko na platformach PC/Mac; wywołanie na mobilnych / VR rejestruje ostrzeżenie i zwraca.
- Ustawienie działa przy następnym wywołaniu
Load()i nie wpływa na aktualnie załadowany zestaw danych. - Może być używane razem z właściwością
IsRenderAlldo zapytania o bieżący stan.