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

# PlayFab Unified SDK 中的記憶體管理

> 使用 PFMemoryHooks 自訂配置器、安全的 XAsyncBlock 存留期模式，以及明確的控制代碼清除，在 PlayFab Unified SDK 中管理記憶體。

本指南說明 PlayFab Unified SDK 中如何管理記憶體，包括自訂選項和最佳做法，以避免記憶體流失並確保安全地處理非同步作業。

## 概觀

PlayFab Unified SDK 支援**自訂配置攔截**、**明確的資源清除**以及**安全的非同步作業處理**，讓開發人員能精確控制記憶體使用量。這使其適用於高效能或資源受限的環境，例如遊戲和內嵌式平台。

## 自訂記憶體配置

SDK 可讓您使用 `PFMemoryHooks` 定義自訂的記憶體配置和解除配置函式。這可讓您將 SDK 整合至現有的記憶體管理系統，例如競技場、集區或平台特定的配置器。

### 設定自訂記憶體攔截

```cpp theme={null}
void* MyCustomAlloc(size_t size, uint32_t memoryTypeId);
void MyCustomFree(void* ptr, uint32_t memoryTypeId);

PFMemoryHooks memoryHooks = { MyCustomAlloc, MyCustomFree };
PFMemSetFunctions(&memoryHooks);
PFServicesInitialize(nullptr); // Must be called after setting memory hooks
```

**注意：**

* 攔截必須在呼叫 `PFServicesInitialize` **之前**設定。
* SDK 初始化之後，**無法**變更攔截。
* 如果未設定，SDK 預設會使用標準配置 (`malloc`/`free`)。

## 非同步作業

SDK 中的大多數 API 呼叫都是非同步的。每個非同步呼叫都需要有效的 `XAsyncBlock`，且該區塊必須在要求期間保持存留。

### 安全地使用 `XAsyncBlock`

```cpp theme={null}
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->callback = [](XAsyncBlock* block)
{
    // Retrieve result, then delete asyncBlock if needed
};
StartAsyncPlayFabCall(asyncBlock.get());
asyncBlock.release(); // Ownership passed; handle lifetime carefully
```

**最佳做法：**

* 除非您能保證 `XAsyncBlock` 的存留期，否則請勿在堆疊上配置它。
* 如果是動態配置的，請釋放擁有權，並在回呼中進行清除。
* 避免在 Lambda 中擷取已失效的參考或指標。

## 資源清除

SDK 使用的控制代碼 (例如 `PFEntityHandle`、`PFServiceConfigHandle`) 在不再需要時**必須**明確關閉。

### 關閉控制代碼和取消初始化

```cpp theme={null}
PFEntityCloseHandle(entityHandle);
PFServiceConfigCloseHandle(serviceConfigHandle);

// Gracefully uninitialize the SDK
XAsyncBlock async{};
PFServicesUninitializeAsync(&async);
XAsyncGetStatus(&async, true); // Blocks until cleanup completes
```

**重要：**

* 一律關閉 PlayFab 控制代碼以防止流失。
* 請等候 `PFServicesUninitializeAsync` 完成後再關閉。

## 最佳做法

* **儘早設定記憶體攔截**：在任何其他 PlayFab API 呼叫之前。
* **避免記憶體流失**：謹慎關閉控制代碼並管理非同步資源。
* **使用記憶體分析工具**：尤其是在記憶體預算嚴格的平台上。
* **使用集區配置器**：適用於效能關鍵或頻繁的配置。

## 另請參閱

* [非同步作業](/zh-TW/services/playfab/sdks/unified-sdk/async-model)
* [記憶體管理](/zh-TW/services/playfab/sdks/unified-sdk/memory-management)
* [追蹤和診斷](/zh-TW/services/playfab/sdks/unified-sdk/debug-trace)


## Related topics

- [PlayFab Unified SDK 中的偵錯追蹤](/zh-TW/services/playfab/sdks/unified-sdk/debug-trace.md)
- [記憶體攔截](/zh-TW/services/playfab/sdks/c/memory.md)
- [PlayFab Unified SDK](/zh-TW/services/playfab/sdks/unified-sdk/overview.md)
- [在 PlayFab Unified SDK 中進行非同步呼叫](/zh-TW/services/playfab/sdks/unified-sdk/async-model.md)
- [XBOX GDK 遊戲的記憶體系統](/zh-TW/build/console-features/memory/index.md)
