疑難排解

此頁面列出干擾 Azure 遠端轉譯 的常見問題,以及解決方式。

用戶端無法連線到伺服器

請確定您的防火牆(在裝置、路由器內部等)不會封鎖系統需求中所述的埠。

無法載入模型

載入模型時(例如,透過 Unity 範例)失敗,雖然 Blob 設定正確,但 Blob 記憶體可能未正確連結。 記憶體帳戶連結一章會說明適當的連結。 正確鏈接之後,最多可能需要 30 分鐘的時間,變更才會生效。

有時在鏈接記憶體帳戶期間,不會列出 遠端轉譯 帳戶。 若要修正此問題,請移至 Azure 入口網站 中的ARR帳戶,然後選取左側 設定群組底下的 [身分識別]。 確定 [狀態 ] 設定為 [ 開啟]。 Unity frame debugger

無法透過 SAS 令牌載入模型

如果用戶端應用程式無法透過有效的 SAS 令牌從記憶體載入模型,可能是由 Blob 記憶體上設定的公用網路存取層級 所造成。 只有在已使用 [從所有網络啟用] 選項設定 ARR 模型時,才能從 SAS 令牌載入 ARR 模型: Screenshot of Azure portal settings for public network access level on blob storage.

如果限制為私人端點是必要條件, 則必須連結 記憶體帳戶,而且模型必須透過非 SAS 程式代碼路徑載入,如 這裡所述。

錯誤 'Disconnected: VideoFormatNotAvailable'

檢查您的 GPU 是否支援硬體視訊譯碼。 請參閱 開發計算機

如果您使用的是具有兩個 GPU 的膝上型電腦,則預設可能會執行 GPU,不提供硬體視訊譯碼功能。 若是如此,請嘗試強制您的應用程式使用其他 GPU。 在 GPU 驅動程式設定中,通常可能會變更使用的 GPU。

擷取會話/轉換狀態失敗

傳送 REST API 命令太頻繁會導致伺服器節流並最終傳回失敗。 節流案例中的 HTTP 狀態代碼為 429 (「要求太多」)。 作為經驗法則,後續呼叫之間應該有 5-10 秒的延遲

請注意,此限制不僅會影響直接呼叫時的 REST API 呼叫,也會影響其 C#/C++ 對應專案,例如 Session.GetPropertiesAsyncSession.RenewAsyncFrontend.GetAssetConversionStatusAsync。 有些函式也會傳回儲存以重試時的資訊。 例如, RenderingSessionPropertiesResult.MinimumRetryDelay 指定嘗試另一項檢查之前要等候的秒數。 當可用時,使用這類傳回的值是最佳的,因為它可讓您儘可能頻繁地進行檢查,而不會受到節流。

如果您遇到伺服器端節流,請變更程式代碼以較不頻繁地執行呼叫。 伺服器會每分鐘重設節流狀態,因此在一分鐘之後安全地重新執行程序代碼。

H265 編解碼器無法使用

伺服器可能會拒絕連線併發生錯誤的原因有兩個 codec not available

未安裝 H265 編解碼器:

首先,請務必如系統需求的軟體一節所述安裝 HEVC 視訊延伸模組

如果您仍然遇到問題,請確定您的圖形卡支援 H265,且已安裝最新的圖形驅動程式。 如需廠商特定資訊,請參閱系統需求的開發電腦一節。

編解碼器已安裝,但無法使用:

此問題的原因是 DLL 上的安全性設定不正確。 嘗試觀看以 H265 編碼的影片時,此問題不會顯現出來。 重新安裝編解碼器並不會修正問題。 請改為執行下列步驟:

  1. 使用系統管理員許可權開啟 PowerShell 並執行

    Get-AppxPackage -Name Microsoft.HEVCVideoExtension*
    

    (請注意 '*' 是因為針對某些套件安裝版本,名稱 HEVCVideoExtensions 與 相反 HEVCVideoExtension。 此命令應該輸出 InstallLocation 編解碼器的 ,如下所示:

    InstallLocation   : C:\Program Files\WindowsApps\Microsoft.HEVCVideoExtension_1.0.23254.0_x64__5wasdgertewe
    
  2. 在 Windows 檔案總管中開啟該資料夾

  3. 應該有 x86x64 子資料夾。 以滑鼠右鍵按下其中一個資料夾,然後選擇 [ 屬性]

    1. 選取 [安全性] 索引標籤,然後選取 [進階設定] 按鈕
    2. 選取擁有者的 [變更]
    3. 在文字欄位中輸入 管理員 istrators
    4. 選取 [檢查名稱] 和 [確定]
  4. 針對其他資料夾重複上述步驟

  5. 同時在兩個資料夾內的每個 DLL 檔案上重複上述步驟。 應該有四個 DLL。

若要確認設定現在正確無誤,請針對四個 DLL 執行下列步驟:

  1. 選取 [屬性 > 安全性 > 編輯]
  2. 瀏覽所有群組/使用者的清單,並確定每個群組都有 [讀取] 和 [執行] 權限集(必須勾選允許資料列中的複選標記)

低視訊品質

視訊品質可以透過網路品質或遺漏的 H265 視訊編解碼器來入侵。

使用 MRC 錄製的影片不會反映即時體驗的品質

您可以透過 混合實境擷取 (MRC) 在 HoloLens 上錄製影片。 不過,產生的影片品質比實時體驗差兩個原因:

  • 視訊幀速率上限為 30 Hz,而不是 60 Hz。
  • 影片影像不會經歷 後期重新投影 處理步驟,因此影片看起來會更切碎。

兩者都是錄製技術的固有限制。

成功載入模型之後的黑色畫面

如果您已連線到轉譯運行時間並成功載入模型,但之後只會看到黑色畫面,則這可能會有一些不同的原因。

建議您先測試下列事項,再執行更深入的分析:

  • 是否安裝 H265 編解碼器? 雖然 H264 編解碼器應該有後援,但我們已看到此後援無法正常運作的情況。 請參閱安裝最新圖形驅動程序的系統需求
  • 使用 Unity 專案時,請關閉 Unity,刪除項目目錄中的暫存連結 obj 資料夾,然後再次載入/建置專案。 在某些情況下,快取的數據會導致範例因沒有明顯原因而無法正常運作。

如果這兩個步驟沒有説明,則需要瞭解用戶端是否收到視訊畫面。 這可以用程式設計方式進行查詢,如伺服器端效能查詢一章中所述FrameStatistics struct有一個成員,表示已接收多少視訊畫面。 如果這個數位大於 0 並隨著時間增加,用戶端會從伺服器接收實際的視訊畫面。 因此,它必須是客戶端的問題。

轉換設定中的縮放值不會套用至模型

如果在展示或快速入門中顯示模型,但縮放比例未變更,但調整會套用為轉換設定幾何參數的一部分,這可能是因為範例的內建自動調整功能。 也就是說,不論模型的輸入縮放比例為何,範例都會調整模型以最適合檢視範圍。

如果是「展示」,可以在models.xml檔案內的模型區Transform段中指定MaxSize零,以停用自動調整。 此數據驅動方法需要先透過 XML 載入模型,因為在其他所有情況下, MaxSize 預設值為 1 公尺。 另外還有一個 MinSize 預設為0.5公尺的屬性,導致所有較小的模型都會相應增加。 如需在展示中載入模型的詳細資訊,請參閱 展示檔的<將 3D 模型資產新增至 ARR 展示 >一章。

常見的客戶端問題

此模型超過所選 VM 的限制,特別是基本類型數目上限:

請參閱特定的 伺服器大小限制

模型不在相機 frustum 內:

在許多情況下,模型會正確顯示,但位於相機 frustum 外部。 常見的原因是模型已使用遠距中心樞紐導出,因此由相機的遠裁剪平面裁剪。 它有助於以程式設計方式查詢模型的周框方塊,並以 Unity 將方塊可視化為折線框,或將其值列印至偵錯記錄檔。

此外,轉換程式會 與轉換的模型一起產生輸出 json 檔案 。 若要偵錯模型定位問題,值得查看 boundingBox outputStatistics 區段中的專案

{
    ...
    "outputStatistics": {
        ...
        "boundingBox": {
            "min": [
                -43.52,
                -61.775,
                -79.6416
            ],
            "max": [
                43.52,
                61.775,
                79.6416
            ]
        }
    }
}

周框方塊描述為 min 3D 空間中的 和 max 位置,以公尺為單位。 因此,1000.0 的座標表示距離原點 1 公里。

這個周框方塊可能會有兩個問題,導致不可見的幾何:

  • 此方塊可能離中心很遠,因此對象會因為遠平面裁剪而完全裁剪。 boundingBox在此案例中,值看起來會像這樣:min = [-2000, -5,-5], max = [-1990, 5,5],使用 X 軸上的大位移做為範例。 若要解決此問題,請在模型轉換組態啟用 recenterToOrigin 選項。
  • 方塊可以置中,但大小太大。 這表示,雖然相機從模型中央開始,但其幾何會裁剪到所有方向。 此案例中的一般 boundingBox 值看起來會像這樣: min = [-1000,-1000,-1000], max = [1000,1000,1000]。 這類問題的原因通常是單位規模不符。 若要補償,請在 轉換 期間指定縮放值,或使用正確的單位標記來源模型。 在運行時間載入模型時,調整也可以套用至根節點。

Unity 轉譯管線不包含轉譯攔截:

Azure 遠端轉譯 連結至 Unity 轉譯管線,以使用影片執行畫面組合,以及執行重現。 若要確認這些勾點存在,請開啟選單 Window > Analysis > Frame debugger。 啟用它,並確定管線中有兩個專案 HolographicRemotingCallbackPass

Unity render pipeline

若要修正,請確定已使用提供的 HybridRenderingPipeline 資產: Screenshot of the Unity asset browser and Project Settings dialog. The HybridRenderingPipeline asset is highlighted in the asset browser. An arrow points from the asset to the UniversalRenderPipelineAsset field in project settings.

..如 Unity 轉譯管線中所述

棋盤模式會在模型載入後轉譯

如果轉譯的影像看起來像這樣: Screenshot shows a grid of black and white squares with a Tools menu.

然後轉譯器會達到 標準組態大小的多邊形限制。 若要減輕問題,請切換至 進階 組態大小,或減少可見多邊形的數目。

Unity 中轉譯的影像是倒置的

請務必遵循 Unity 教學課程:完全檢視遠端模型 。 倒置影像表示需要 Unity 才能建立螢幕外轉譯目標。 目前不支援此行為,而且會對 HoloLens 2 產生巨大的效能影響。

此問題的原因可能是 MSAA、HDR 或啟用後續處理。 請確定已選取低品質配置檔,並在 Unity 中設定為預設值。 若要這樣做,請移至編輯>項目 設定... >品質

在 Unity 2020 中使用 OpenXR 外掛程式時,不論啟用後續處理,都有一些 URP(通用轉譯管線)版本可建立此額外的螢幕外轉譯目標。 因此,請務必手動將 URP 版本升級至至少 10.5.1(或更新版本)。 此升級程式會在系統需求說明。

使用 遠端轉譯 API 的 Unity 程式代碼不會編譯

針對 Unity 編輯器進行編譯時,請使用偵錯

Unity 方案的組建類型 切換為 [ 偵錯]。 在 Unity 編輯器中測試 ARR 時,定義 UNITY_EDITOR 只能在 「偵錯」組建中使用。 此設定與用於 已部署應用程式的組建類型無關,您應該偏好使用「發行」組建。

編譯 HoloLens 2 的 Unity 範例時編譯失敗

我們在嘗試編譯 HoloLens 2 的 Unity 範例時,看到虛假失敗(快速入門 ShowCaseApp...)。 Visual Studio 抱怨無法複製某些檔案,儘管檔案已存在。 如果您遇到此問題:

  • 從項目移除所有暫存 Unity 檔案,然後再試一次。 也就是說,關閉 Unity,刪除項目目錄中的暫存連結 obj 資料夾,然後再次載入/建置專案。
  • 請確定項目位於磁碟上具有合理簡短路徑的目錄中,因為複製步驟有時似乎遇到長檔名的問題。
  • 如果這無濟於事,MS Sense 可能會干擾複製步驟。 若要設定例外狀況,請從命令行執行此登錄命令(需要系統管理員許可權):
    reg.exe ADD "HKLM\SOFTWARE\Policies\Microsoft\Windows Advanced Threat Protection" /v groupIds /t REG_SZ /d "Unity"
    

Unity 專案的 Arm64 組建失敗,因為缺少 AudioPluginMsHRTF.dll

AudioPluginMsHRTF.dll for Arm64 已在 3.0.1 版中新增至 Windows Mixed Reality 套件 (com.unity.xr.windowsmr.metro)。 請確定您已透過 Unity 封裝管理員 安裝 3.0.1 版或更新版本。 從 Unity 功能表欄,流覽至 [視窗>] 封裝管理員 並尋找 Windows Mixed Reality 套件。

Unity Cinemachine 外掛程式無法在遠端姿勢模式中運作

遠端姿勢模式中,ARR Unity 系結程式代碼會隱含建立 Proxy 相機來執行實際轉譯。 在此情況下,主相機的撲殺面具會設定為0(“nothing”),以有效地關閉它的轉譯。 不過,某些第三方外掛程式(例如 Cinemachine)會驅動相機,可能至少依賴一些正在設定的圖層位。

為此,系結程式代碼可讓您以程式設計方式變更主相機的圖層位掩碼。 具體來說,需要下列步驟:

  1. 在 Unity 中建立新的層次,該圖層不會用於轉譯任何本機場景幾何。 在此範例中,假設圖層名為 “Cam”。
  2. 將此位掩碼傳遞至 ARR,讓 ARR 將其設定在主相機上:
    RemoteManagerUnity.CameraCullingMask = LayerMask.GetMask("Cam");
    
  3. 設定 Cinemachine 屬性以使用此新層次: Screenshot that shows Unity's inspector panel for camera settings in Cinemachine.

本機姿勢模式不受此問題影響,因為在此情況下,ARR 系結不會將轉譯重新導向至內部 Proxy 相機。

原生 C++ 型應用程式未編譯

UWP 應用程式或 DLL 的「找不到連結庫」錯誤

在 C++ NuGet 套件內,有檔案 microsoft.azure.remoterendering.Cpp.targets 檔案會定義要使用的二進位類別。 若要識別 UWP,檔案中的條件會檢查 是否有 ApplicationType == 'Windows Store'。 因此,必須確定此類型是在項目中設定的。 透過 Visual Studio 的專案精靈建立 UWP 應用程式或 DLL 時,應該會發生這種情況。

不穩定的 全像投影

如果轉譯的物件似乎隨著頭部移動移動而移動,您可能會遇到延遲階段重新剖析 (LSR) 的問題。 如需如何處理這類情況的指引,請參閱晚期重新投影一節

不穩定全像投影(搖擺、變形、抖動或跳躍全像投影)的另一個原因可能是網路連線能力不佳,特別是網路頻寬不足或延遲太高。 網路連線品質的良好指標是 效能統計數據ServiceStatistics.VideoFramesReused。 重複使用的畫面格表示用戶端上需要重複使用舊視訊畫面的情況,因為沒有新的視訊畫面可用,例如因為封包遺失或網路等待時間的變化。 如果 ServiceStatistics.VideoFramesReused 經常大於零,表示網路問題。

另一個要檢視的值是 ServiceStatistics.LatencyPoseToReceiveAvg。 它應該一致低於 100 毫秒。 看到較高的值可能表示您已連線到離得太遠的數據中心。

如需潛在風險降低的清單,請參閱 網路連線的指導方針。

HoloLens 2 上的本機內容 (UI, ...) 會轉譯的失真成品明顯比沒有 ARR

此成品是因為預設設定會交易本機內容投影品質,以達到運行時間效能。 請參閱重新投影姿勢模式章節,以瞭解投影模式如何變更,讓本機內容以與沒有ARR相同的重新投影品質層級轉譯。

Z 戰鬥

雖然 ARR 提供 z 戰鬥風險降低功能,但 z-fighting 仍然可以顯示在場景中。 本指南旨在針對這些剩餘的問題進行疑難解答。

使用下列工作流程來減輕 z-fighting:

  1. 使用 ARR 的預設設定來測試場景 (z-fighting mitigation on)

  2. 透過其 API 停用 z-fighting 風險降低功能

  3. 將相機的近遠平面變更為更接近的範圍

  4. 透過下一節對場景進行疑難解答

調查剩餘的 z 戰鬥

如果上述步驟已用盡,剩餘的 z 戰鬥是不能接受的,則需要調查 z 戰鬥的根本原因。 如 z-fighting 風險降低功能頁面所述,Z 戰鬥有兩個主要原因:深度精確度損失在深度範圍的遠端,而表面在共同平面時相交。 深度精確度損失是數學最終結果,只能遵循上述步驟 3 來緩和。 平面表面表示來源資產缺陷,而且在源數據中較好地修正。

ARR 有一項功能可用來判斷表面是否可以 z-fight: 棋盤醒目提示。 您也可以以視覺方式判斷造成 z 戰鬥的原因。 下列第一個動畫顯示距離中深度精確度損失的範例,第二個動畫顯示幾乎平面表面的範例:

Animation shows an example of depth-precision loss in the distance.Animation shows an example of nearly coplanar surfaces.

將這些範例與您的 z-fighting 進行比較,以判斷根本原因,或選擇性地遵循此逐步工作流程:

  1. 將相機放置在 z 戰鬥表面上方,以直接查看表面。
  2. 慢慢地將相機往後移動,遠離表面。
  3. 如果 Z 戰鬥一直可見, 表面是完全共同的。
  4. 如果 Z 戰鬥在大部分時間都可見,表面幾乎是平面。
  5. 如果 z 戰鬥只看得見遠,原因就是缺乏深度精確度。

平面表面可能會有許多不同的原因:

  • 匯出應用程式因為錯誤或不同的工作流程方法而複製物件。

    請使用個別的應用程式和應用程式支援來檢查這些問題。

  • 表面會重複並翻轉,以在使用正面或後臉撲殺的轉譯器中出現雙面。

    透過模型轉換入會決定模型的主要側邊性。 雙面性會假設為預設值。 表面會轉譯為薄牆,兩側有實際正確的光源。 單邊性可由來源資產中的旗標隱含,或在模型轉換期間明確強制。 此外,也可以選擇性地將 單邊模式 設定為「一般」。

  • 物件會交集於來源資產中。

    以某些表面重疊的方式轉換的物件也會建立 z-fighting。 在 ARR 中轉換匯入場景中的場景樹狀結構部分,也可能會造成此問題。

  • 表面是有目的的撰寫來觸摸,例如牆上的裝飾或文字。

在原生 C++ 應用程式中使用多階段立體轉譯的圖形成品

在某些情況下,在呼叫BlitRemoteFrame之後,針對本機內容使用多重傳遞立體聲轉譯模式的自定義原生 C++ 應用程式,可以在呼叫 BlitRemoteFrame 之後,觸發驅動程式 Bug。 錯誤會導致不具決定性的點陣化問題,導致本機內容的個別三角形或三角形部分隨機消失。 基於效能考慮,建議您使用更現代化的單次立體轉譯技術來轉譯本機內容,例如使用 SV_RenderTargetArrayIndex

轉換檔案下載錯誤

轉換服務可能會因為檔案系統限制而從 Blob 記憶體下載檔案時發生錯誤。 特定失敗案例如下所列。 如需 Windows 檔案系統限制的完整資訊,請參閱 命名檔案、路徑和命名空間 檔。

碰撞路徑和檔名

在 Blob 記憶體中,可以建立與同層級專案完全相同名稱的檔案和資料夾。 Windows 文件系統不允許此專案。 因此,服務在該情況下會發出下載錯誤。

路徑長度

Windows 和服務會施加路徑長度限制。 Blob 記憶體中的檔案路徑和檔名不得超過 178 個字元。 例如,假設的 blobPrefixmodels/Assets為 ,其為13個字元:

models/Assets/<any file or folder path greater than 164 characters will fail the conversion>

轉換服務會下載 下 blobPrefix指定的所有檔案,而不只是轉換中使用的檔案。 在這些情況下,造成問題的檔案/資料夾可能較不明顯,因此請務必檢查 下記憶體帳戶 blobPrefix中包含的所有專案。 如需下載的內容,請參閱下面的範例輸入。

{
  "settings": {
    "inputLocation": {
      "storageContainerUri": "https://contosostorage01.blob.core.windows.net/arrInput",
      "blobPrefix": "models/Assets",
      "relativeInputAssetPath": "myAsset.fbx"
    ...
  }
}
models
├───Assets
│   │   myAsset.fbx                 <- Asset
│   │
│   └───Textures
│   |       myTexture.png           <- Used in conversion
│   |
|   └───MyFiles
|          myOtherFile.txt          <- File also downloaded under blobPrefix      
|           
└───OtherFiles
        myReallyLongFileName.txt    <- Ignores files not under blobPrefix             

HoloLens2 「拍照」(MRC) 不會顯示任何本機或遠端內容

如果專案從WMR 更新為OpenXR,且專案存取 HolographicViewConfiguration 類別 (Windows.Graphics.Holographic) 設定,通常會發生此問題。 OpenXR 中不支援此 API,且不得存取。

下一步