4

我有一个简单的应用程序,我正在读取一些内部变量并将它们发布到菜单上的 EditControl。

这是一个代码片段

case 0:
        SetWindowText(GetDlgItem( gHWnd, IDC_PACKETID ), 
                     (LPSTR)std::to_string(long long(NC->mPacketNum)).c_str());
        break;

所以那里发生了很多事情。我只是想将一个数字转换为可以在编辑对话框中显示的东西。这太慢了,我只要进入这个部分就可以从 50Hz 下降到大约 30Hz。

有什么想法可以显着加快速度吗?

4

3 回答 3

2

我通过维护上次窗口更新的时间戳来解决此类问题。然后,除非经过一定时间,否则我会阻止另一次更新。1/10 秒对我来说似乎很有效。性能显着提高,更新看起来仍然很流畅。

于 2013-05-18T19:00:15.663 回答
2

该代码中有很多内容。

SetWindowText 本身似乎不太可能是缓慢的部分。让我们一块一块地拆开,看看时间可能会去哪里。(确定的唯一方法是分析,但我不能为你做到这一点,所以我正在寻找可能性。这取决于你来衡量。)

SetWindowText(GetDlgItem( gHWnd, IDC_PACKETID ), 
              (LPSTR)std::to_string(long long(NC->mPacketNum)).c_str());
  1. GetDlgItem 调用可能正在发送消息以遍历 gHWnd 的子窗口。如果有很多孩子,并且 IDC_PACKETID 不是第一个,这可能会花费一些时间。考虑计算一次并缓存结果。除非您销毁控件并创建一个新控件,否则 HWND 不会更改。

  2. 您正在使用 ASCII 字符串调用 SetWindowText。(你为什么要转换结果?而且,特别是,你为什么要放弃 const-ness?)如果你使用的是现代版本的 Windows,那么你的 ASCII 字符串会被即时转换为宽字符串,这可能涉及额外的动态内存管理。您可以调用 SetWindowTextW(注意 W 后缀)并直接使用 std::to_wstring 计算宽字符串。根据 std::to_wstring 的实现细节,这可能会更快。

  3. 窗口真的是编辑控件吗?如果您以 30-50 Hz 的频率更改它,您似乎不太可能需要一个成熟的编辑控件。您可以改用静态文本控件吗?它可能有一个更简单和更快的实现。

  4. NC->mPacketNum 是否会长时间正确对齐?如果未对齐,则会对性能产生不利影响。看看你能不能保证对齐。

于 2013-05-18T19:15:56.217 回答
1

对于高帧速率,您需要使用 Direct2D 或 OpenGL 渲染,而不是内置的 EDIT 窗口类。

如果您不需要高帧速率,只需要高吞吐量,您可以这样做InvalidateRect并且仅在收到 PAINT 消息时更改文本。Windows 将限制它发送给您的速率WM_PAINT。或者使用计时器。通过这种方式,您只需将新值存储在内部变量中,当您获得绘制或计时器回调时,将其从间隔变量移动到 EDIT 控件。

于 2013-05-18T18:23:58.947 回答