【问题标题】:Why is window creation slow for many windows? Can it be faster?为什么许多窗口的窗口创建速度很慢?可以更快吗?
【发布时间】:2020-04-13 06:27:24
【问题描述】:

对于一个实验,我想创建很多小窗口。我的意思是很多,比如一千左右。

窗口很小,只包含一些标签(AB):

我创建了一百个作为实验,但它们的显示不是即时的,而是在将它们放在屏幕上时可见的。这是为什么呢?

我希望 C/C++ 程序非常快,所以我根本看不到屏幕上的窗口。这是一个错误的期望吗?或者我应该使用某种更轻的窗口类型(我不是 Windows 程序员,所以我只是猜测)可以更快地放置?

这是代码的相关部分:

   HWND parent = 0;

   for (int i = 0; i < 100; ++i)
   {
       HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_BORDER,
           CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

       if (!hWnd)
       {
           return FALSE;
       }

       if (parent == 0)
           parent = hWnd;
       else
           SetWindowLong(hWnd, GWL_HWNDPARENT, (long)parent);

       SetWindowLong(hWnd, GWL_STYLE, 0);
       SetMenu(hWnd, NULL);
       SetWindowPos(hWnd, HWND_TOP, 100 + (i * 20), 100, 20, 20, 0);
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
   }

...

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code that uses hdc here...
            SetBkColor(hdc, RGB(0,255,0));
            TextOut(hdc, 1, 1, TEXT("AB"), strlen("AB"));

            EndPaint(hWnd, &ps);
        }
        break;

【问题讨论】:

  • 调用UpdateWindow 会强制在创建下一个窗口之前绘制每个窗口。如果你把它拿出来,它们可能会出现得更快。
  • 这个程序非常不习惯。它创建顶级窗口(没有 WS_CHILD),然后设置它们的父窗口(GWL_HWNDPARENT),这是一个令人困惑的“非此即彼”的情况,会导致问题。此外,您创建了一个 100 层深度的嵌套窗口链,这也不是普通程序所做的。
  • 每个窗口都是一个复杂的对象,由其他对象组成。创建一个需要分配一堆不同的资源。而所有这些工作通常是通过几个抽象层来完成的。不是说操作系统还有其他事情要做。所以不,我认为即使是现代计算机也不是这么简单的任务。
  • 你的目标是什么?您可以尝试创建窗口但不显示它们。然后在单独的循环中显示它们。这可能会使它在视觉上更快。
  • 您只需要一个单个透明窗口(使用键色透明)。没有理由为每个标签创建一个窗口;您可以简单地将它们渲染到透明窗口上,从而消除那些与键颜色不匹配的区域的透明度。切换覆盖层的可见性归结为对ShowWindow 的一次调用。这将是即时的。

标签: c windows winapi window


【解决方案1】:

SetWindowLongSetMenuSetWindowPosShowWindow 都可以通过在 CreateWindowW 参数中提供相同的信息来删除。

那么你也可以去掉对UpdateWindow的调用。

重要的不是 C/C++ 的速度,而是发送 Windows 消息的 Win32 API 调用。

【讨论】:

  • 谢谢,等我弄清楚如何用参数做同样的事情后,我会试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 2015-08-30
相关资源
最近更新 更多