我正在使用WPF窗口上的KeyUp
和KeyDown
事件。
此窗口的CompositionTarget_Rendering
事件中还有很多调用,创建UI元素并对其进行动画处理。这是由下面的引擎类完成的:
int _Fps;
Stopwatch sw = new Stopwatch();
void CompositionTarget_Rendering_Stats(object sender, EventArgs e)
{
_Fps++;
var ms = sw.ElapsedMilliseconds;
sw.Restart();
engine.Update(ms / 1000f);
timeFrames.Add(ms);
}
我注意到,UI元素越多,
KeyUp
和KeyDown
事件的响应速度就越慢。当主窗口中有大约1000个UI元素时,无论是按下还是释放键后,control_KeyDown和control_KeyUp的代码执行时间都会延迟半秒左右。如果窗口内的动画也很卡顿,这并不会让我感到惊讶,但事实并非如此。
- 帧率约为55 fps
- 动画保持流畅
CompositionTarget_Rendering
事件中的计算时间不超过20毫秒。
- WPF键盘处理背后的奥秘是什么:为什么在重负条件下它变得卡顿而渲染过程则没有?
- 如何更好地处理键盘输入并避免这种情况?
CompositionTarget_Rendering
事件中填充尽可能多的文本框。public partial class MainWindow : Window
{
WrapPanel root2;
public MainWindow()
{
InitializeComponent();
root2 = new WrapPanel();
root2.Margin = new Thickness(10);
this.Content = root2;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
for (var i = 0; i < 2000; i++)
root2.Children.Add(new TextBlock() { Background = Brushes.Yellow });
this.KeyDown += MainWindow_KeyDown;
this.KeyUp += MainWindow_KeyUp;
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
void MainWindow_KeyUp(object sender, KeyEventArgs e)
{
this.Background = Brushes.Red;
}
void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
this.Background = Brushes.Green;
}
void CompositionTarget_Rendering(object sender, EventArgs e)
{
foreach (var child in root2.Children)
((TextBlock)child).Text = DateTime.Now.Millisecond.ToString();
}
}
根据您的机器性能,更改2000以增加文本框数量。当达到一定数量时,CompositionTarget_Rendering触发次数比KeyUp或KeyDown更多。当按下键盘时,可以清晰地看到边框颜色的变化:键已按下,然后触发了多次Composition_Rendering,然后触发了keydown事件,并且边框变为红色。