WPF性能改善---之化整为零(蜂窝的衍生应用)
在有的项目中,有这样的需求,由于显示器的显示区域是有限的,而软件却要展示一个远大于显示区域的一些元素,此时就要引入放大、缩小、拖动等UI控制技术,而在使用这些技术的同时,在后台有效的控制渲染元素的个数显得尤其重要。
假设这样的案例屏幕1366*768,软件全屏显示为1366×738,软件中显示地图用的区域为600×600,此时我们可以把这个600×600的区域定义为关注区域,后台程序在获取屏幕界面变更事件(如最大化、最小化、侧栏收缩\展开)后,重新计算这个600×600的四个顶点坐标值。当需渲染元素在这个区域内时再进行渲染,否则不处理。如下图所示,黑色区域为关注区域。
以下是后台判断的代码
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Random RD = new Random();
Console.WriteLine(DateTime.Now.ToString("mm:ss.fff"));
; i < ; i++)
{
TextBlock tb = new TextBlock();
tb.Text = i.ToString();
Brush myBrush = new SolidColorBrush(Colors.White);
tb.Foreground = myBrush;
, );
, );
Canvas.SetLeft(tb, x);
Canvas.SetTop(tb, y);
&& x < && y > && y < )
{
CanvInVStack.Children.Add(tb);
}
}
Console.WriteLine(DateTime.Now.ToString("mm:ss.fff"));
}
经过测试,10万级别的元素显示,如果不加 if (x > 0 && x < 600 && y > 0 && y < 600)这句判断,所耗时间约为22秒,如果加了判断耗时为2秒。时间计算的方法是,按钮一点击之后会产生一个时间,当看到元素显示到界面后,点击按钮2产生一个时间,因为没有找到合适的渲染成功事件,只能采用手工计时,虽不是很精确但是足以证明两种方案的效率相差10倍左右。上面的程序是生产100万个元素,如果是10万个不加判断程序还可以勉强运行,如果提高到100万的数量级再不加判断,程序会因为内存不足而卡死。
在设计类似的软件时,一定要采用分而治之的方案,才能得到良好的性能。
WPF性能改善---之化整为零(蜂窝的衍生应用)的更多相关文章
- WPF性能优化经验总结
WPF性能优化一.Rendering Tier 1. 根据硬件配置的不同,WPF采用不同的Rendering Tier做渲染.下列情况请特别注意,因为在这些情况下,即使是处于Rendering Tie ...
- WPF性能调试系列 – 内存监测
WPF性能调试系列文章: WPF页面渲染优化:Application Timeline WPF页面业务加载优化:Ants Performance Profiler WPF内存优化:Ants M ...
- WPF性能调试系列 – Ants Performance Profiler
WPF性能调试系列文章: WPF页面渲染优化:Application Timeline WPF页面业务加载优化:Ants Performance Profiler WPF内存优化:Ants Memor ...
- WPF性能调试系列 – 应用程序时间线
WPF性能调试系列文章: WPF页面渲染优化:Application Timeline WPF页面业务加载优化:Ants Performance Profiler WPF内存优化:Ants Memor ...
- 性能改善之For与Foreach
关于For与Foreach的区别,博客园里已经有好多这样文章了,都分析的挺好:http://www.cnblogs.com/jobs/archive/2004/07/17/25218.aspx 不过 ...
- WPF性能提高--MSDN学习摘要
关于性能 一. 关于硬件加速 1.对于大多数图形硬件而言,大型图面是指达到 2048x2048 或 4096x4096 像素大小的图面. 二. 合理的布局 1.简单地说,布局是一个递归系统 ...
- JFace TableViewer性能改善 -- 使用VirtualTable
前一篇提到了SWT中的table的通过使用virtual table性能得到很大的改善,那么如果既存的工程中使用的是TableViewer来创建的表,也能改成virtual table吗? 答案是肯定 ...
- EF的性能改善和思考
EF是个工具,用的好了性能就会很好,用的不好性能就会有很大损失. 先从EF的设计思想来讲解 EF的初衷是根据缓存中的实体对象,以及实体对象的状态(删除.更新.添加)来对数据库进行操作,这些实体对象.以 ...
- SWT table性能改善 -- 使用VirtualTable
在SWT程序中使用table展示数据时,如果数据过多,执行起来会比较慢,不过,我们可以借助VirtualTable来解决这一问题. Eclipse官网中关于VirtualTable的说明见:http: ...
随机推荐
- setTimeout方法
//不建议传递字符串 setTimeout(alert("hello"),1000); //推荐调用方式 setTimeout(function(){alert("hel ...
- 关于cocos2d-x 与 cocos2d-html5 资源预加载的思考
移动端资源预加载,可以做到需要加载的时候,从本地磁盘加载到内存,当纹理不需要的时候,都是强制清理内存里的纹理占用: cc.TextureCache.getInstance().removeAllTex ...
- 循环列表的Java实现,解决约瑟夫环问题
import java.util.Scanner; /** * 循环列表的Java实现,解决约瑟夫环问题 * * @author LIU * */ public class LinkedList { ...
- Context启动startActivity注意
intent.setFlags()方法中参数的用例: 很多人使用startActivity时候,会碰到如下的异常:Caused by: android.util.AndroidRuntimeExcep ...
- Java BigInteger(大数,ACM比赛专用)
用c或者C++处理大数比较麻烦,于是决心学习一下JAVA中大数运算. 先下载一个eclipse,具体的用法去问度娘吧 JAVA中有两个类BigInteger和BigDecimal分别表示大整数类和大浮 ...
- Sobel边缘检测算法(转载)
转载请注明出处: http://blog.csdn.net/tianhai110 索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰 ...
- ES6 — 新增关键字let、const
ECMAScript 是什么? 首先,我们都知道JavaScript由三部分组成:ECMAScript,DOM,BOM: 其中的ECMAScript是Javascript的语法规范. ECMAScri ...
- com.google.guava 包解析 ——Google Guava官方教程(中文版)
全网址 http://ifeve.com/google-guava/ 竹子博客: http://www.cnblogs.com/peida/archive/2013/06/08/ ...
- SQLServer如何用T—SQL命令查询一个数据库中有哪些表
1.查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 执 ...
- Servlet 中文乱码问题及解决方案剖析
转自:http://blog.csdn.net/xiazdong/article/details/7217022/ 一.常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK ...