C++ 如何重用原始输入缓冲内存?

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

花了一整天的时间,我终于想出了如何使用Win32 GetRawInputBuffer从鼠标读取输入

但是,我不喜欢每帧都创建一个新的std::vector,因此我尝试将std::vector raw_输入作为类成员,并使用相同的raw_输入调用GetRawInputBuffer,期望GetRawInputBuffer覆盖内容,但报告输入的频率显著下降

如果我在第一次调用{0}后将内存归零,程序将崩溃

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);
            }
        }
    }
}