C++ 如何重用原始输入缓冲内存?
花了一整天的时间,我终于想出了如何使用Win32 GetRawInputBuffer从鼠标读取输入 但是,我不喜欢每帧都创建一个新的std::vector,因此我尝试将std::vector raw_输入作为类成员,并使用相同的raw_输入调用GetRawInputBuffer,期望GetRawInputBuffer覆盖内容,但报告输入的频率显著下降 如果我在第一次调用{0}后将内存归零,程序将崩溃C++ 如何重用原始输入缓冲内存?,c++,windows,winapi,C++,Windows,Winapi,花了一整天的时间,我终于想出了如何使用Win32 GetRawInputBuffer从鼠标读取输入 但是,我不喜欢每帧都创建一个新的std::vector,因此我尝试将std::vector raw_输入作为类成员,并使用相同的raw_输入调用GetRawInputBuffer,期望GetRawInputBuffer覆盖内容,但报告输入的频率显著下降 如果我在第一次调用{0}后将内存归零,程序将崩溃 std::vector<RAWINPUT> raw_inputs; // if I
std::vector<RAWINPUT> raw_inputs; // if I make this a class member it stops after the first call
raw_inputs.resize(1024);
uint32_t raw_input_size = (uint32_t)(sizeof(RAWINPUT) * raw_inputs.size());
UINT input_count = GetRawInputBuffer(raw_inputs.data(), &raw_input_size, sizeof(RAWINPUTHEADER));
if (input_count == (UINT)-1) {
return ErrorStack(ExtraError::FAILED_TO_GET_RAW_INPUT_BUFFER, code_location, "failed to get raw input buffer", getLastError());
}
else if (input_count) {
printf("input_count = %d \n", input_count);
for (uint32_t i = 0; i < input_count; i++) {
RAWINPUT& raw_input = raw_inputs[i];
if (raw_input.header.dwType == RIM_TYPEMOUSE) {
printf("%d %d \n", raw_input.data.mouse.lLastX, raw_input.data.mouse.lLastY);
}
}
}
最后,我们发现在将向量再次传递给GetRawInputBuffer之前,必须调用std::vector上的clear方法
这段代码在哪里运行?您是否在某个窗口消息处理程序中轮询输入?请发布更多代码。参考官方样本。显示一个小的、完整的和可复制的样本有助于排除故障。您不必调用std::vector上的clear+resize来重用它。清除只会将向量的大小设置为0,并销毁当前元素。对于像RAWINPUT这样的POD类型,没有操作,但保留容量。调整大小设置大小,只有当新大小超过容量时,容量才会增加。所有新元素都是默认初始化的,对于POD类型,这与使用ZeroMemory没有什么不同。在容量大于等于1024的向量上调用clear+resize1024可以有效地保留物理数组并将其归零我知道我以前尝试过,但它只能这样工作,这就是为什么我问这个问题,然后你可能对它做了其他错误。您说过重用同一个向量缓冲区不起作用,但使用clear+resize1024您所展示的方法正是这样做的!因此,请编辑您的问题,以显示您实际尝试了哪些不适合您的问题。
void calledSomeWhere()
{
static std::vector<RAWINPUT> raw_inputs;
raw_inputs.clear();
raw_inputs.resize(1024);
uint32_t raw_input_size = (uint32_t)(sizeof(RAWINPUT) * raw_inputs.size());
UINT input_count = GetRawInputBuffer(raw_inputs.data(), &raw_input_size, sizeof(RAWINPUTHEADER));
if (input_count == (UINT)-1) {
return ErrorStack(ExtraError::FAILED_TO_GET_RAW_INPUT_BUFFER, code_location, "failed to get raw input buffer", getLastError());
}
else if (input_count) {
printf("input_count = %d \n", input_count);
for (uint32_t i = 0; i < input_count; i++) {
RAWINPUT& raw_input = raw_inputs[i];
if (raw_input.header.dwType == RIM_TYPEMOUSE) {
printf("%d %d \n", raw_input.data.mouse.lLastX, raw_input.data.mouse.lLastY);
}
}
}
}