本文来告诉大家 CanvasVirtualControl ,在什么时候使用这个控件。
在之前的入门教程win10 uwp win2d 入门 看这一篇就够了我直接用的是CanvasControl
,实际上可以使用的画布还有下面两个
- CanvasAnimatedControl
- CanvasVirtualControl
虽然本文主要告诉大家CanvasVirtualControl
但是也是会告诉大家什么时候用哪个
CanvasAnimatedControl
如果使用 CanvasControl ,那么只会在一开始使用了 drawn ,如果需要重新更新就需要通过调用 Invalidate
。
如果有很多次调用 Invalidate
会自动合并为一次,所以不能把 Invalidate
调用数和 draw 触发数作为相等。
如果是为了做动画需要不停调用 Invalidate
,在 UWP 比较好的方法是使用 CanvasAnimatedControl 这个可以到每秒 60 帧,而且在用户设备比较差的时候会降低调用频率。
所以做动画的时候需要不停触发重新渲染就使用 CanvasAnimatedControl ,关于这个控件,请看win10 uwp 萤火虫效果
Win2D 中的游戏循环:CanvasAnimatedControl
CanvasVirtualControl
和 CanvasAnimatedControl 频繁重新画不相同的,在 CanvasVirtualControl 的使用范围是很少刷新
如果满足下面任何条件就建议使用 CanvasVirtualControl 而不是 CanvasControl 因为这时的性能比较好
- 如果你准备画一个非常大的图片
- 不希望使用很多时间去画看不见的部分
- 不想把整个图片都放在内存
因为 CanvasVirtualControl 使用位图虚拟化,所以不需要在所有的时候都把位图放在内存中,只有在需要显示的地方才是有效的,存放在内存的,对于不显示的地方是不放在内存,不画出来的。
在一个原来不显示的地方变为显示时就会触发RegionsInvalidated事件,这时就可以画出这部分。
代码语言:javascript复制void OnRegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
{
foreach (var region in args.InvalidatedRegions)
{
using (var ds = sender.CreateDrawingSession(region))
{
// draw the region
}
}
}
所以通过这个方法就可以不需要手动去判断哪些是显示的,只要触发了,就是可以画出的。那么怎么知道触发的显示的矩形?实际上从args.InvalidatedRegions
就是拿到一个 Rect ,通过这个就可以判断需要显示的是哪个。
很多时候使用 CanvasVirtualControl 都是和 ScrollViewer 一起使用
代码语言:javascript复制 <ScrollViewer>
<canvas:CanvasVirtualControl Width="10000" Height="10000" RegionsInvalidated="OnRegionsInvalidated" />
</ScrollViewer>
所以在滚动的时候就可以判断哪些需要显示,通过只画显示的来提高性能。
当然在页面大小变化或者 CanvasVirtualControl 需要修改大小,还是需要调用 invalidated 来重新画
代码语言:javascript复制void VirtualControl_SizeChanged(object sender, SizeChangedEventArgs e)
{
VirtualControl.Invalidate();
}