2019-1-4-win10-uwp-win2d-CanvasVirtualControl-与-CanvasAnimatedControl
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
win10 uwp win2d CanvasVirtualControl 与 CanvasAnimatedControl
|
lindexi
|
2019-1-4 14:15:9 +0800
|
2018-04-30 16:15:53 +0800
|
UWP win2d 渲染
|
本文来告诉大家 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 毛玻璃
2019-1-4-win10-uwp-win2d-CanvasVirtualControl-与-CanvasAnimatedControl的更多相关文章
- win10 uwp win2d CanvasVirtualControl 与 CanvasAnimatedControl
本文来告诉大家 CanvasVirtualControl ,在什么时候使用这个控件. 在之前的入门教程win10 uwp win2d 入门 看这一篇就够了我直接用的是CanvasControl,实际上 ...
- win10 uwp 通过 Win2d 完全控制笔迹绘制逻辑
本文来告诉大家如何通过 Win2d 完全控制笔迹绘制逻辑,本文适合用来实现复杂的自定义逻辑,可以完全控制笔迹的行为.包括在书写过程中切换模式,如进行手势擦除切换为橡皮擦模式 本文提供的方法适合用来做复 ...
- win10 uwp 渲染原理 DirectComposition 渲染
本文来告诉大家一个新的技术DirectComposition,在 win7 之后(实际上是 vista),微软正在考虑一个新的渲染机制 在 Windows Vista 就引入了一个服务,桌面窗口管理器 ...
- win10 uwp 萤火虫效果
原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使 ...
- win10 uwp 毛玻璃
毛玻璃在UWP很简单,不会和WPF那样伤性能. 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃. 毛玻璃可以使用 win2D 方法,也可以使用 Compositor . 使用 win2d 得 ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- Win10 UWP开发实现Bing翻译
微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...
- Win10/UWP开发—使用Cortana语音与App后台Service交互
上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...
- 【Win10 UWP】后台任务与动态磁贴
动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...
随机推荐
- OpenCV灰度化图像
OpenCV2版本号非常多函数发生了变化.比如二值化,其演示样例: void CmyMFC2Dlg::OnBnClickedButton1() { // TODO: Add your control ...
- JAVA的一次编译,到处执行,你知道多少?
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/wangyongxia921/article/details/28117155 一.对AVA的迷茫 ...
- PHP学习(语言结构语句)
switch case语句 for循环语句: foreach循环语句 常用于遍历数组,一般有两种使用方式:不取下标.取下标. (1)只取值,不取下标 <?php foreach (数组 as 值 ...
- Linux C socket 基于 UDP
/************************************************************************* > File Name: serve ...
- LintCode刷题笔记-- Count1 binary
标签: 位运算 描述: Count how many 1 in binary representation of a 32-bit integer. 解题思路: 统计一个int型的数的二进制表现形式中 ...
- JFinalConfig
概述 基于JFinal的web项目需要创建一个继承自JFinalConfig类的子类,该类用于对整个web项目进行配置. JFinalConfig子类需要实现六个抽象方法,如下所示: public c ...
- Java中的TreeMap及红黑树
TreeMap: http://blog.csdn.net/tobeandnottobe/article/details/7232664 红黑树: http://blog.chinaunix.net/ ...
- python Python程序的架构
- vuxdemo1
//main.js import Vue from 'vue' import router from './router' import store from './store' import axi ...
- Servlet接口
ServletRequest接口 ServletRequest的对象用于向Servlet提供客户端请求信息,如内容类型,内容长度,参数名称和值,标题信息,属性等. RequestDispatcher接 ...