我有一个使用WS_EX_LAYERED
窗口样式创建的窗口。我正在使用GDI +绘制内存位图,并使用UpdateLayeredWindow
来更新我的分层窗口的图形内容。我打算使用这个窗口作为我的应用程序的主窗口,这将需要经常重绘。重绘分层窗口的正确方法
作为分层窗口看到没有收到WM_PAINT
窗口消息[?],我需要拿出一个合适的方法重新绘制窗口。优化不是必不可少的,但它总是很高兴有你的蛋糕和吃它。因此,我正在寻找使用“正确”的方法。
这里是我的想法至今:
我猜想,这是一个好主意之前
BitBlt
ING或相似的呈现到离屏位图。每秒渲染60帧应该足够多(但是与其他应用程序的帧速率相比如何?)。
可能的解决方案:
-
有用的,因为通过指定超时值,我可以实现每秒我的所需帧,而不需要测量的持续时间的“帧”需要被渲染。
由于消息的频率和速度可能会导致输入或其他滞后。
仅当发生特定事件(例如窗口大小调整)时才渲染帧。
需要我找出所有需要重绘的事件。
会大大减少不必要的帧的渲染量。
渲染帧时,有在消息队列中没有消息,通过检查
PeekMessage
。这可能减缓窗口消息处理。
这将导致CPU使用率过高,因为正在处理的帧数多于所需的帧数。
创建一个新的线程来执行渲染循环。
- 为了保持稳定的帧速率,必须执行定时计算。
被卡住到UpdateLayeredWindow?使用SetLayeredWindowAttributes可以创建一个带WM_PAINT的分层窗口。如果使用这种方式,你摆脱了准备更新机制的问题。 “ – xMRi
”这与其他应用程序的帧速率相比如何?“除非应用程序正在动画或显示视频,否则其帧速率通常为零。无缘无故地反复重画屏幕就是从更高效的使用中窃取CPU时间,压平笔记本电脑电池,磨损粉丝并使自己成为卸载目标。严重的是,如果你的应用程序没有做任何事情,不要做任何事情。 – arx