專案需在 WPF 中呈現 3D 戶型圖旋轉效果。因即時 3D 渲染效能不足,改用預先渲染的 360 張圖片序列,透過滑鼠移動切換 Image.Source 模擬旋轉。但直接切換檔案路徑會造成嚴重卡頓,本文記錄優化歷程。
| 方案 | 記憶體 | 首次呈現 | 再次呈現 |
|---|---|---|---|
| List<byte[]> | 1360MB | 35ms | 15ms |
| List<ImageSource> | 1300MB | 30ms | 15ms |
BitmapImage 並 Freeze(),存入 List<BitmapImage>。Image 控制項(或寫入 WriteableBitmap),強制 GPU 上傳紋理。BitmapImage 指派給顯示用 Image.Source,無需重新解碼。// 預載與 Freeze
var images = new List();
foreach (var path in files)
{
var bmp = new BitmapImage();
bmp.BeginInit();
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.UriSource = new Uri(path);
bmp.EndInit();
bmp.Freeze(); // 跨執行緒可用
images.Add(bmp);
}
// 預熱(可在啟動畫面執行)
Task.Run(() => {
foreach (var img in images) { dummyImage.Source = img; }
});
// 旋轉時切換
mainImage.Source = images[currentIndex];
WPF 的影像解碼與 GPU 上傳是主要瓶頸。**預先解碼 + Freeze + 預熱上傳** 是解決大量高解析度圖片序列播放的關鍵。