> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SetFrameIntervalX (XBOX One 系列)

> 建立畫面格的間隔持續時間與週期。

建立畫面格的間隔持續時間與週期。

## 語法

```cpp theme={null}
HRESULT SetFrameIntervalX(
        IDXGIOutput* pOutputSyncTarget,
        UINT LengthInMicroseconds,
        UINT PeriodInIntervals,
        D3D12XBOX_FRAME_INTERVAL_FLAGS Flags)
```

### 參數

*pOutputSyncTarget*   \_In\_opt\_\
類型：[IDXGIOutput](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nn-dxgi-idxgioutput)\*

介面卡輸出介面，用來識別其重新整理頻率與時序將作為畫面格排程同步基準的顯示器。若要使用預設介面卡，請傳遞 null。

*LengthInMicroseconds*   \_In\_\
類型：UINT

畫面格間隔的長度 (以微秒為單位)。此長度定義畫面格呈現以供顯示的頻率。

*PeriodInIntervals*   \_In\_\
類型：UINT

畫面格的週期 (以間隔為單位)。週期定義從畫面格起點到其呈現以供顯示之時間的間隔數目。週期取決於所需的畫面格管線深度，也就是 CPU 轉譯允許領先畫面格顯示多遠。

*Flags*   \_In\_\
類型：[D3D12XBOX\_FRAME\_INTERVAL\_FLAGS](/zh-TW/reference/graphics/d3d12_x/enums/d3d12xbox_frame_interval_flags)

用來對所建立之間隔提供額外控制的旗標。在一般作業中，此旗標應一律設定為 *D3D12XBOX\_FRAME\_INTERVAL\_FLAG\_NONE*。若要支援 60FPS 以上，可以使用 *D3D12XBOX\_FRAME\_INTERVAL\_FLAG\_60FPS\_PLUS* 旗標。

### 傳回值

類型：HRESULT

HRESULT 成功或錯誤碼。

傳回 S\_FALSE 表示呼叫成功，但新的畫面格間隔尚未生效。它將在下一次 [ScheduleFrameEventX](/zh-TW/reference/graphics/d3d12_x/interfaces/id3d12device/methods/id3d12device_scheduleframeeventx) 呼叫時生效，該呼叫的 *Type* 必須為 *D3D12XBOX\_FRAME\_EVENT\_ORIGIN*。

若間隔、週期或旗標值不受支援，則傳回 E\_INVALIDARG。

## 備註

畫面格間隔的長度決定呈現頻率，並指定畫面格轉譯並傳送至顯示器的速率。最常見的間隔長度包括下列前置處理器定義：

```cpp theme={null}
#define D3D12XBOX_FRAME_INTERVAL_120_HZ   8333
#define D3D12XBOX_FRAME_INTERVAL_60_HZ   16667
#define D3D12XBOX_FRAME_INTERVAL_40_HZ   25000
#define D3D12XBOX_FRAME_INTERVAL_30_HZ   33333
```

16,666 微秒倍數的畫面格間隔長度 (例如 60 Hz 和 30 Hz) 一律允許用於所有顯示器和組態。不過，8,333 微秒倍數的畫面格間隔長度 (例如 120 Hz 和 40 Hz) 應僅在顯示器和主機支援此組態時使用。您可以在應用程式啟動時，使用 [IDXGIOutput::GetDisplayModeList](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgioutput-getdisplaymodelist) 方法進行檢查。

此外，也允許使用建立 20 Hz 和 15 Hz 重新整理頻率的間隔長度。

想要以 60 Hz 到 120 Hz 之間的畫面格間隔長度為目標的遊戲，可以使用 `D3D12XBOX_FRAME_INTERVAL_FLAG_60FPS_PLUS` 旗標。如需詳細資訊，請參閱 [D3D12XBOX\_FRAME\_INTERVAL\_FLAGS](/zh-TW/reference/graphics/d3d12_x/enums/d3d12xbox_frame_interval_flags)。

畫面格間隔長度會建立為顯示器重新整理間隔的整數倍數，並對齊 vblank 邊界。這就是為什麼以微秒為單位的長度並非建立間隔之間確切時間的硬性指示，而是傳達所需間隔持續時間的值。在某個閾值範圍內時，它會對應至最接近的顯示器重新整理頻率倍數。例如，如果顯示器的重新整理頻率是 29.97 Hz 而非 30 Hz，則設定的畫面格長度 33,333 微秒實際上可能會產生 33,367 微秒的間隔持續時間。

不過，所設定的間隔將用作排程畫面格事件的基準 (請參閱 [ScheduleFrameEventX](/zh-TW/reference/graphics/d3d12_x/interfaces/id3d12device/methods/id3d12device_scheduleframeeventx))，其中以微秒為單位的位移是以提供給 SetFrameIntervalX 的長度來表示，而不是以該長度在內部對應到的值來表示。例如，當顯示器的重新整理頻率為 29.97 Hz 時，搭配設定間隔長度 33,333 微秒使用的排程起點時間位移 16,666 微秒，將在內部轉換為 16,684 微秒的實際位移；這將保留在畫面格中途排程起點的意圖。

畫面格的週期 (以間隔為單位) 建立畫面格從起點到顯示的最長持續時間，可以設定為介於 1 到 4 (含) 之間的值。此週期取決於 CPU 與 GPU 轉譯的預期重疊，並根據進行中的畫面格數目來控制何時節流 CPU。週期為 1 表示畫面格將在同一個間隔內開始並完成；所需時間不會超過 *LengthInMicroseconds*。週期為 *n* 表示畫面格將在某個畫面格間隔開始，並在 *n* - 1 個間隔之後完成。就延遲而言，假設沒有錯過任何 vblank，畫面格從開始到抵達顯示器之間的延遲通常會維持在 *PeriodInIntervals* x *LengthInMicroseconds* 微秒以下。

畫面格間隔的長度及其週期可用來建立畫面格的顯示期限。如果畫面格未在其起點之後 *PeriodInIntervals* - 1 個間隔的間隔結束前完成並呈現以供顯示，則後續畫面格將被節流，並且在錯過的畫面格呈現並翻轉至顯示器之前不允許開始。這樣做是為了防止在錯過 vblank 的情況下引入額外間隔的延遲；當畫面格錯過其呈現期限時，通常會保留到其準備就緒的下一個 vblank 才顯示 (以防止畫面撕裂)。將下一個畫面格的 CPU 開始時間延遲相同的量，可防止過早取樣輸入，並保留所設定畫面格間隔與週期所建立的延遲保證。

初始畫面格間隔設定會在第一次排程畫面格起點事件時套用。後續更新會與呈現一起管線化，使得在某個間隔內所做的變更會在下一個呈現的畫面格翻轉至顯示器時套用。

## 需求

**標頭:** d3d12\_x.h

**程式庫:** d3d12\_x.lib

**支援的平台:** XBOX One 系列

## 另請參閱

[IDXGIOutput](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nn-dxgi-idxgioutput)


## Related topics

- [SetShapeDmaNumFrames](/zh-CN/reference/audio/shapedmacontext/functions/setshapedmanumframes.md)
- [ILampArray::GetMinUpdateIntervalInMicroseconds](/zh-CN/reference/lighting/lamparray/interfaces/ilamparray/methods/ilamparray_getminupdateintervalinmicroseconds.md)
- [NDA 主題目錄 - Microsoft Learn 線上連結](/zh-TW/nda/nda-topic-directory.md)
- [ACP_MESSAGE_AUDIO_FRAME_START](/zh-CN/reference/audio/acphal/structs/acp_message_audio_frame_start.md)
- [GetShapeDmaNumFrames](/zh-CN/reference/audio/shapedmacontext/functions/getshapedmanumframes.md)
