> ## 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.

# MakeResident

> 使对象为设备驻留。

使对象为设备驻留。

## 语法

```cpp theme={null}
HRESULT MakeResident(
    UINT NumObjects,
    ID3D12Pageable const  ppObjects
)
```

### 参数

*NumObjects*<br />类型：UINT

要为设备驻留的 <i>ppObjects</i> 数组中的对象数量。

*ppObjects \[in]*<br />类型：ID3D12Pageable \*const \*

指向内存块的指针，该内存块包含对象的 [ID3D12Pageable](/reference/graphics/d3d12/interfaces/id3d12pageable/id3d12pageable_public) 接口指针数组。

尽管大多数 D3D12 对象都继承自 [ID3D12Pageable](/reference/graphics/d3d12/interfaces/id3d12pageable/id3d12pageable_public)，但驻留更改仅在以下对象上受支持：描述符堆、堆、提交资源和查询堆

### 返回值

类型：HRESULT

此方法返回 [Direct3D 12 返回代码](https://learn.microsoft.com/en-us/windows/desktop/direct3d12/d3d12-graphics-reference-returnvalues) 之一。

## 备注

**MakeResident** 从磁盘加载与资源关联的数据，并从资源相应的内存池重新分配内存。应在拥有物理内存的对象上调用此方法。

使用此方法和 [Evict](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_evict_public) 管理 GPU 显存，请注意，在 D3D11 中这是自动完成的，但现在在 D3D12 中必须由应用程序完成。

**MakeResident** 和 [Evict](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_evict_public) 可以帮助应用程序在许多适配器上管理驻留预算。**MakeResident** 显式地页入数据，然后阻止页出，以便 GPU 可以访问数据。**Evict** 启用页出。

由于缺乏足够的 GPU 虚拟地址空间，某些 GPU 架构不会从驻留操作中受益。使用 [D3D12\_FEATURE\_DATA\_GPU\_VIRTUAL\_ADDRESS\_SUPPORT](/reference/graphics/d3d12/structs/d3d12_feature_data_gpu_virtual_address_support_public) 和 [IDXGIAdapter3::QueryVideoMemoryInfo](https://learn.microsoft.com/en-us/windows/desktop/api/dxgi1_4/nf-dxgi1_4-idxgiadapter3-queryvideomemoryinfo) 识别每个进程的最大 GPU VA 空间何时太小或大致与驻留预算相同大小。对于此类架构，驻留预算将始终受 GPU 虚拟地址空间量的限制。在此类系统上，[Evict](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_evict_public) 不会释放任何驻留预算。

应用程序必须处理 **MakeResident** 失败，即使似乎有足够的驻留预算可用。物理内存碎片和适配器架构的怪异现象可能会阻止利用大型连续范围。应用程序应在重试之前释放更多驻留预算。

**MakeResident** 是引用计数的，因此在 **Evict** 生效之前必须调用 [Evict](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_evict_public) 的次数与 **MakeResident** 的次数相同。支持驻留的对象在创建期间就成为驻留状态，因此单次 **Evict** 调用实际上会逐出对象。

应用程序必须使用围栏来确保 GPU 不使用非驻留对象。**MakeResident** 必须在 GPU 执行引用该对象的命令列表之前返回。[Evict](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_evict_public) 必须在 GPU 完成执行引用该对象的命令列表之后调用。

被逐出的对象仍消耗相同的 GPU 虚拟地址和相同数量的 GPU 虚拟地址空间。因此，在 [Evict](/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_evict_public) 之后，资源描述符和其他 GPU 虚拟地址引用不会失效。

## 要求

**头文件：** d3d12\_xs.h 或 d3d12\_x.h<br />**库：** d3d12\_xs.lib 或 d3d12\_x.lib<br />**支持的平台**：XBOX Series 主机和 XBOX One 系列

## 另请参阅

[ID3D12Device](/reference/graphics/d3d12_x/interfaces/id3d12device/id3d12device)


## Related topics

- [EnqueueMakeResident](/zh-CN/reference/graphics/d3d12/interfaces/id3d12device3/methods/id3d12device3_enqueuemakeresident_public.md)
- [ID3D12Pageable](/zh-CN/reference/graphics/d3d12/interfaces/id3d12pageable/id3d12pageable_public.md)
- [Evict](/zh-CN/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_evict_public.md)
- [D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT](/zh-CN/reference/graphics/d3d12/structs/d3d12_feature_data_gpu_virtual_address_support_public.md)
- [D3D12_RESIDENCY_FLAGS](/zh-CN/reference/graphics/d3d12/enums/d3d12_residency_flags_public.md)
