获取基于事件的统计信息
本主题提供用于获取基于事件的统计信息的示例代码。
API 公开各种级别的批处理以获取基于事件的统计信息。最佳做法是使用适合你需求的批处理 API 尽可能减少调用。
本主题涵盖以下内容:
您还可以订阅统计信息更改。
为单个用户和单个 SCID 获取一个统计信息
以下示例代码显示如何读取单个用户的统计信息。
平面 C API
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.
size_t resultSize;
HRESULT hr = XblUserStatisticsGetSingleUserStatisticResultSize(asyncBlock, &resultSize);
if (SUCCEEDED(hr))
{
std::vector<char> buffer(resultSize, 0);
XblUserStatisticsResult* result{};
hr = XblUserStatisticsGetSingleUserStatisticResult(asyncBlock, resultSize, buffer.data(), &result, nullptr);
if (SUCCEEDED(hr) && result->serviceConfigStatisticsCount > 0 && result->serviceConfigStatistics->statisticsCount > 0)
{
int64_t userStatValue = atoll(result->serviceConfigStatistics[0].statistics[0].value);
// You can now show or store userStatValue.
}
}
};
HRESULT hr = XblUserStatisticsGetSingleUserStatisticAsync(
xboxLiveContext,
xboxUserId,
scid,
statisticName.c_str(),
asyncBlock.get()
);
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
// If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*.
asyncBlock.release();
}
有关详细信息,请参阅以下内容:
- XAsyncBlock
- XblUserStatisticsGetSingleUserStatisticAsync
- XblUserStatisticsGetSingleUserStatisticResult
- XblUserStatisticsGetSingleUserStatisticResultSize
- XblUserStatisticsResult
为单个用户和单个 SCID 获取多个统计信息
以下示例代码演示如何在一个 HTTP 调用中读取单个用户的多个统计信息。
平面 C API
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.
size_t resultSize;
HRESULT hr = XblUserStatisticsGetSingleUserStatisticsResultSize(asyncBlock, &resultSize);
if (SUCCEEDED(hr))
{
std::vector<char> buffer(resultSize, 0);
XblUserStatisticsResult* results{};
hr = XblUserStatisticsGetSingleUserStatisticsResult(asyncBlock, resultSize, buffer.data(), &results, nullptr);
if (SUCCEEDED(hr))
{
// You can now use the XblUserStatisticsResult array in results.
}
}
};
const char* statisticNames[2] = {};
statisticNames[0] = statisticName1.c_str();
statisticNames[1] = statisticName2.c_str();
HRESULT hr = XblUserStatisticsGetSingleUserStatisticsAsync(
xboxLiveContext,
xboxUserId,
scid,
statisticNames, 2,
asyncBlock.get()
);
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
// If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*.
asyncBlock.release();
}
有关详细信息,请参阅以下内容:
- XAsyncBlock
- XblUserStatisticsGetSingleUserStatisticAsync
- XblUserStatisticsGetSingleUserStatisticResult
- XblUserStatisticsGetSingleUserStatisticResultSize
- XblUserStatisticsResult
为多个用户和单个 SCID 获取多个统计信息
下面的示例代码演示如何在一次 HTTP 调用中读取多个用户的多个统计信息。
平面 C API
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.
size_t resultSize;
HRESULT hr = XblUserStatisticsGetMultipleUserStatisticsResultSize(asyncBlock, &resultSize);
if (SUCCEEDED(hr))
{
std::vector<char> buffer(resultSize, 0);
XblUserStatisticsResult* results{};
size_t resultsCount = 0;
hr = XblUserStatisticsGetMultipleUserStatisticsResult(asyncBlock, resultSize, buffer.data(), &results, &resultsCount, nullptr);
// Process results array to read the user stats data.
for (size_t iResult = 0; iResult < resultsCount; iResult++)
{
LogToFile("%d", results[iResult].xboxUserId);
for (size_t iScid = 0; iScid < results[iResult].serviceConfigStatisticsCount; iScid++)
{
LogToFile("SCID: %s", results[iResult].serviceConfigStatistics[iScid].serviceConfigurationId);
for (size_t iStat = 0; iStat < results[iResult].serviceConfigStatistics[iScid].statisticsCount; iStat++)
{
LogToFile("Stat %d: name:%s value:%s type:%s", iResult,
results[iResult].serviceConfigStatistics[iScid].statistics[iStat].statisticName,
results[iResult].serviceConfigStatistics[iScid].statistics[iStat].value,
results[iResult].serviceConfigStatistics[iScid].statistics[iStat].statisticType );
}
}
}
}
};
const char* statisticNames[2] = {};
statisticNames[0] = statisticName1.c_str();
statisticNames[1] = statisticName2.c_str();
uint64_t xuids[2] = {};
xuids[0] = xuid1;
xuids[1] = xuid2;
HRESULT hr = XblUserStatisticsGetMultipleUserStatisticsAsync(
xboxLiveContext,
xuids, 2,
scid,
statisticNames, 2,
asyncBlock.get()
);
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
// If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*.
asyncBlock.release();
}
有关详细信息,请参阅以下内容:
- XAsyncBlock
- XblUserStatisticsGetMultipleUserStatisticsAsync
- XblUserStatisticsGetMultipleUserStatisticsResult
- XblUserStatisticsGetMultipleUserStatisticsResultSize
- XblUserStatisticsResult
为多个 SCID 中的多个用户获取多个统计信息
下面的示例代码演示如何使用 Xbox 服务 API (XSAPI) 在仅使用一次调用的情况下从单个服务配置中读取多个统计信息。
平面 C API
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.
size_t resultSize;
HRESULT hr = XblUserStatisticsGetMultipleUserStatisticsForMultipleServiceConfigurationsResultSize(asyncBlock, &resultSize);
if (SUCCEEDED(hr))
{
std::vector<char> buffer(resultSize, 0);
XblUserStatisticsResult* results{};
size_t resultsCount = 0;
hr = XblUserStatisticsGetMultipleUserStatisticsForMultipleServiceConfigurationsResult(asyncBlock, resultSize, buffer.data(), &results, &resultsCount, nullptr);
if (SUCCEEDED(hr))
{
for (size_t i = 0; i < resultsCount; i++)
{
// Log results.
std::stringstream stream;
stream << "XUID: " << results[i].xboxUserId << std::endl;;
for (size_t j = 0; j < results[i].serviceConfigStatisticsCount; j++)
{
stream << " " << results[i].serviceConfigStatistics[j].serviceConfigurationId << ": " << std::endl;
for (size_t k = 0; k < results[i].serviceConfigStatistics[j].statisticsCount; k++)
{
stream << " " << results[i].serviceConfigStatistics[j].statistics[k].statisticName << "=" << results[i].serviceConfigStatistics[j].statistics[k].value << std::endl;
}
}
}
}
}
};
const char* requestedStatsNames1[2] = {};
requestedStatsNames1[0] = statisticName1.c_str();
requestedStatsNames1[1] = statisticName2.c_str();
XblRequestedStatistics requestedStats[1] = {};
pal::strcpy(requestedStats[0].serviceConfigurationId, sizeof(XblRequestedStatistics::serviceConfigurationId), scid);
requestedStats[0].statistics = requestedStatsNames1;
requestedStats[0].statisticsCount = 2;
uint64_t xuids[2] = {};
xuids[0] = xuid1;
xuids[1] = xuid2;
HRESULT hr = XblUserStatisticsGetMultipleUserStatisticsForMultipleServiceConfigurationsAsync(
xboxLiveContext,
xuids, 2,
requestedStats, 1,
asyncBlock.get()
);
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
// If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*.
asyncBlock.release();
}
有关详细信息,请参阅以下内容:
- XAsyncBlock
- XblRequestedStatistics
- XblUserStatisticsGetMultipleUserStatisticsForMultipleServiceConfigurationsAsync
- XblUserStatisticsGetMultipleUserStatisticsForMultipleServiceConfigurationsResult
- XblUserStatisticsGetMultipleUserStatisticsForMultipleServiceConfigurationsResultSize
- XblUserStatisticsResult