渲染性能優化指南
本指南幫助在不同性能等級的設備上調優 SDK,獲得流暢的 3DGS(3D Gaussian Splatting)渲染體驗。
1. 關閉抗鋸齒
Three.js 的 WebGLRenderer 默認不啟用抗鋸齒。如果你的項目中開啟了 antialias: true,在性能敏感場景建議關閉:
const renderer = new THREE.WebGLRenderer({ antialias: false });
為什麼可以關閉? 3DGS 的每個高斯點本身就是一個平滑衰減的半透明橢圓,大量橢圓疊加後邊緣天然平滑,不需要額外的多重採樣抗鋸齒(MSAA)。關閉 MSAA 可減少 GPU 對每個像素的採樣次數(通常從 4 次降為 1 次),提升渲染幀率。
Cesium 用户:Cesium 的 Viewer 默認不開啟 MSAA,無需額外操作。
2. 降低渲染分辨率
通過降低設備像素比,可以成比例減少 GPU 需要處理的像素總數。這是對 GPU 填充率瓶頸最有效的手段。
Three.js:
// High-performance device: use native pixel ratio
renderer.setPixelRatio(window.devicePixelRatio);
// Mid-range device: cap pixel ratio
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 1.5));
// Low-end device / mobile: fixed 1x rendering
renderer.setPixelRatio(1.0);
Cesium:
const viewer = new Cesium.Viewer('container', {
// Control rendering resolution via resolutionScale
resolutionScale: 1.0 // Use 1.0 for low-end devices; use window.devicePixelRatio for high-end
});
性能差異參考(以 1080p 邏輯分辨率為例):
| 像素比 | 實際渲染像素 | 相對開銷 |
|---|---|---|
| 1.0 | 1920×1080 ≈ 207 萬 | 1× |
| 1.5 | 2880×1620 ≈ 466 萬 | 2.25× |
| 2.0 | 3840×2160 ≈ 829 萬 | 4× |
| 3.0 | 5760×3240 ≈ 1866 萬 | 9× |
高 DPI 屏幕(如 Retina)的
devicePixelRatio通常為 2 或 3,降低到 1.0 可獲得 4~9 倍的片元處理性能提升,代價是渲染畫面變模糊。
3. 限制最大渲染點數 — setMaxSplats
這是最重要的性能調節參數。 它控制每幀參與渲染的高斯點總數上限。
lccObj.setMaxSplats(3000000); // Max 3 million splats per frame
SDK 的 LOD 調度器在每幀遍歷場景的空間索引,按距離和視錐選出需要渲染的節點。當總點數超過此限制時,調度器會從遠處或低優先級的節點開始丟棄,直到總點數滿足限制。
取值參考:PC 端 90 萬 ~ 1000 萬,移動端 50 萬 ~ 260 萬,根據設備性能選擇。詳見文末設備分檔推薦配置。
4. 限制單節點最大點數 — setMaxNodeSplats
控制單個空間節點的最大渲染點數。超過此閾值的節點會被自動降級到更粗糙的 LOD 等級。
lccObj.setMaxNodeSplats(1500000); // Max 1.5 million splats per node
為什麼需要這個參數? 在大型場景中,建築密集區等高密度區域的單個節點在最高 LOD 下可能包含數百萬個高斯點。如果不限制,相機靠近時一個節點就會佔滿整個渲染預算,導致其它區域沒有預算可用。這個參數讓渲染預算的分配更均勻。
取值建議:通常設為 setMaxSplats 值的 1/3 ~ 2/3,具體取決於場景密度和檔位。詳見文末設備分檔推薦配置。
5. 限制渲染起始 LOD — setStartLod
控制最高精度等級。LOD 0 為最精細,數值越大精度越低。
lccObj.setStartLod(0); // Finest quality (desktop default)
lccObj.setStartLod(1); // Skip finest level (mobile default)
lccObj.setStartLod(2); // Skip first two levels (very low-end devices)
SDK 對場景數據進行了多級 LOD 構建。LOD 0 包含完整精度數據,LOD 1 約為 LOD 0 的 1/2 點數,以此類推逐級遞減。setStartLod 限制調度器可選擇的最低 LOD 等級:設為 1 表示即使相機貼近物體,也不會加載 LOD 0 數據。
性能影響:
| 設置 | 近處精度 | 渲染點數減少 | 適用場景 |
|---|---|---|---|
setStartLod(0) | 最高 | — | PC 高端 |
setStartLod(1) | 中等 | 約 50% | PC 中端及以下、移動端全檔位 |
setStartLod(2) | 較低 | 約 75% | PC / 移動端低端 |
6. 限制最大渲染距離 — setMaxDistance
控制從相機出發的最大渲染距離,單位為米。超出此距離的內容不會被下載、解壓和渲染。
lccObj.setMaxDistance(200); // Desktop default
lccObj.setMaxDistance(100); // Mobile default
減小最大距離可以減少可見節點數量,降低網絡下載、CPU 排序和 GPU 渲染的全鏈路開銷。適合室內或近距離瀏覽場景。
注意:SDK 內置了高度自適應機制——當相機升至高空(> 20 米)後,會自動放寬距離限制,使俯瞰視角能看到更遠的範圍。
取值參考:
| 平台 | 範圍 |
|---|---|
| PC | 100 ~ 240 |
| 移動端 | 80 ~ 110 |
詳見文末設備分檔推薦配置。
7. LOD 自動優化 — setLodAutoLevelUp
啟用後,SDK 會在渲染預算有餘裕時自動提升部分節點的精度。
lccObj.setLodAutoLevelUp(true); // Enable (recommended for mid-to-high-end devices)
lccObj.setLodAutoLevelUp(false); // Disable (recommended for low-end devices or stable frame rate)
當實際渲染點數低於 setMaxSplats 的限制時(比如相機看向空曠區域),自動優化機制會把剩餘預算分配給近處節點,自動加載更高精度的 LOD 數據來補充細節。
權衡:開啟後畫質更好,但可能觸發額外的數據下載和解壓,在低端設備上有可能導致偶爾的幀率波動。
8. 球諧光照 — useShcoef
球諧光照(Spherical Harmonics,SH)讓高斯點的顏色能夠隨觀察角度變化,呈現更真實的反光和光澤效果。SDK 默認關閉。
// Check if data contains SH coefficients before enabling
if (lccObj.hasShcoef()) {
lccObj.useShcoef(true, (percent) => {
console.log('SH loading: ' + (percent * 100).toFixed(1) + '%');
});
}
// Disable
lccObj.useShcoef(false, () => {});
開啟效果:
- 物體表面的反光、光澤隨視角自然變化
- 渲染品質顯著提升,尤其是對金屬、玻璃、漆面等高光材質
性能代價:
- GPU 顯存增加,需要額外存儲 RGB 球諧係數
- GPU 頂點着色計算量增加,需要額外計算 15 個球諧基函數
- 對於LCC格式,需要額外下載 SH 數據文件
建議:僅在高端桌面設備上開啟。移動端不建議使用。
9. 其它優化選項
本地緩存(IndexedDB)
通過 useIndexDB: true(默認開啟)啟用本地數據緩存。二次訪問同一場景時直接從本地讀取,大幅減少加載時間。
LOD 平滑過渡
LCC2 支持 LOD 平滑過渡(默認開啟),減少 LOD 切換時的視覺跳變:
lccObj.setSmooth(true); // Enable (default)
lccObj.setSmooth(false); // Disable
該功能通過約束相鄰空間節點的 LOD 差異,消除精度斷層。CPU 開銷極小,建議保持開啟。
設備分檔推薦配置
PC
| 檔位 | splatCount | nodeSplatCount | distance | startLod | devicePixelRatio |
|---|---|---|---|---|---|
| High | 10,000,000 | 6,000,000 | 240 | 0 | 原生 dpr |
| MidHigh | 4,200,000 | 1,500,000 | 220 | 1 | 原生 dpr |
| Balance | 2,200,000 | 1,000,000 | 200 | 1 | dpr > 1 ? 1.4 : dpr |
| MidLow | 1,800,000 | 700,000 | 150 | 2 | 1 |
| Low | 900,000 | 400,000 | 100 | 2 | dpr > 1 ? 0.8 : 0.5 |
Mobile
| 檔位 | splatCount | nodeSplatCount | distance | startLod | devicePixelRatio |
|---|---|---|---|---|---|
| High | 2,600,000 | 1,000,000 | 110 | 1 | 原生 dpr |
| MidHigh | 1,800,000 | 800,000 | 100 | 1 | 原生 dpr |
| Balance | 1,000,000 | 600,000 | 90 | 1 | dpr > 1 ? 1.2 : dpr |
| MidLow | 800,000 | 400,000 | 80 | 2 | 1 |
| Low | 500,000 | 300,000 | 80 | 2 | 0.8 |