区块动态重新排序

当开始安装游戏时,安装系统会根据您定义的默认顺序,获取和复制区块(要成组安装的文件集合)。 安装游戏运行所需的区块后,游戏可以为安装剩下的区块提供自定义顺序,这可以由安装系统在回到默认安装顺序之前处理。

通过这种方式,游戏可以控制获取内容的顺序,以响应许多不同情况或来自用户的各种输入。 这种动态重新排序可以最大限度地减少用户等待待安装内容所花的时间,并让用户选择他们可能首先需要的内容。

在更改安装顺序后,如果玩游戏或使用游戏时需要这些区块,则它可以使用流式安装:状态中介绍的方法之一监视安装状态。

如何更改安装区块的顺序

在以下示例代码中,游戏需要立即访问文件,以允许用户继续玩游戏。 定义了 PrioritizeChunk 函数,用于检查区块的当前安装状态。

  • 如果尚未安装此区块,此函数将要求流式系统首先安装该区块,然后返回区块进度的安装监视。

  • 如果已安装区块,此函数返回 null 监视器。

template<> 
struct std::default_delete<XPackageInstallationMonitorHandle> { 
    typedef XPackageInstallationMonitorHandle pointer; 
    void operator()(XPackageInstallationMonitorHandle handle) const noexcept  
    {   
        XPackageCloseInstallationMonitorHandle(handle);  
    } 
}; 
 
HRESULT PrioritizeChunk(uint32_t chunkId, XPackageInstallationMonitorHandle* monitor) 
{ 
    char id[PACKAGE_IDENTIFIER_MAX_LENGTH]; 
 
    *monitor = nullptr; 
    RETURN_IF_FAILED(XPackageGetCurrentProcessPackageIdentifier(_countof(id), id)); 
 
    XPackageChunkSelector selector; 
    selector.type = XPackageChunkSelectorType::Chunk; 
    selector.chunk = chunkId; 
 
    XPackageInstallationMonitorHandle temp; 
    RETURN_IF_FAILED(XPackageCreateInstallationMonitor(id, 1, &selector, 1000, queue, &temp)); 
    std::unique_ptr<XPackageInstallationMonitorHandle> localMonitor(temp); 
 
    XPackageInstallationProgress progress; 
    XPackageGetInstallationProgress(localMonitor.get(), &progress); 
 
    if (!progress.completed) 
    { 
        RETURN_IF_FAILED(XPackageChangeChunkInstallOrder(id, 1, &selector)); 
        *monitor = localMonitor.release(); 
    } 
 
    return S_OK; 
}