win10 uwp win2d CanvasVirtualControl 与 CanvasAnimatedControl
本文来告诉大家 CanvasVirtualControl ,在什么时候使用这个控件。
在之前的入门教程win10 uwp win2d 入门 看这一篇就够了我直接用的是CanvasControl
,实际上可以使用的画布还有下面两个
虽然本文主要告诉大家CanvasVirtualControl
但是也是会告诉大家什么时候用哪个
CanvasAnimatedControl
如果使用 CanvasControl ,那么只会在一开始使用了 drawn ,如果需要重新更新就需要通过调用 Invalidate
。
如果有很多次调用 Invalidate
会自动合并为一次,所以不能把 Invalidate
调用数和 draw 触发数作为相等。
如果是为了做动画需要不停调用 Invalidate
,在 UWP 比较好的方法是使用 CanvasAnimatedControl 这个可以到每秒 60 帧,而且在用户设备比较差的时候会降低调用频率。
所以做动画的时候需要不停触发重新渲染就使用 CanvasAnimatedControl ,关于这个控件,请看win10 uwp 萤火虫效果
Win2D 中的游戏循环:CanvasAnimatedControl
CanvasVirtualControl
和 CanvasAnimatedControl 频繁重新画不相同的,在 CanvasVirtualControl 的使用范围是很少刷新
如果满足下面任何条件就建议使用 CanvasVirtualControl 而不是 CanvasControl 因为这时的性能比较好
如果你准备画一个非常大的图片
不希望使用很多时间去画看不见的部分
不想把整个图片都放在内存
因为 CanvasVirtualControl 使用位图虚拟化,所以不需要在所有的时候都把位图放在内存中,只有在需要显示的地方才是有效的,存放在内存的,对于不显示的地方是不放在内存,不画出来的。
在一个原来不显示的地方变为显示时就会触发RegionsInvalidated事件,这时就可以画出这部分。
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 一起使用
<ScrollViewer>
<canvas:CanvasVirtualControl Width="10000" Height="10000" RegionsInvalidated="OnRegionsInvalidated" />
</ScrollViewer>
所以在滚动的时候就可以判断哪些需要显示,通过只画显示的来提高性能。
当然在页面大小变化或者 CanvasVirtualControl 需要修改大小,还是需要调用 invalidated 来重新画
void VirtualControl_SizeChanged(object sender, SizeChangedEventArgs e)
{
VirtualControl.Invalidate();
}
其他博客
win2d 毛玻璃:win10 uwp 毛玻璃
我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
最新文章
- Java 二叉树遍历右视图-LeetCode199
- [转] Struts2入门示例教程
- 项目学习——电力系统底层架构ssh
- 51nod1215 数组的宽度
- IOS开发之──应用之间调用(1)
- moment 和ko 绑定msdate格式的日期值(静态text)
- sql新手全套
- mysql server install
- 一个poi操作实现导出功能的类
- C++中将int转变成string和string转变成int
- idea编译器中maven项目获取路径的方法
- AngularJS高级程序设计读书笔记 -- 模块篇
- Java 面试总结(一) —— 面试常问的关键字总结
- Android自定义控件及自定义属性
- 提示缺少tns_admin的解决办法
- [bzoj2288][pojChallenge]生日礼物【贪心+堆+链表】
- HTTP的长连接(持久连接)和短连接
- Python 离线工作环境搭建
- Mac终端查看sqlite3数据库、表数据等(含sqlite可视化工具下载)
- 用MVC5+EF6+WebApi 做一个考试功能(六) 仓储模式 打造EF通用仓储类
热门文章
- CSS3--关于z-index不生效问题
- scroll 滚动到指定位置触发事件 and 点击一按钮/链接让页面定位在指定的位置
- 一个基于Asterisk构建的VOIP应用软件:Elastix介绍
- Directx11教程(8) 一个新的camera类
- oracle-Nomount
- 两篇论文之CNN中正交操作
- No PostCSS Config found解决办法
- [mysql]MySQL Daemon failed to start 2016-08-14 21:27 1121人阅读 评论(18) 收藏
- shared_ptr的线程安全性
- kubernetes1.3:操作Docker