Visual对象之DrawingContext.DrawRectangle在有的状态下似乎并不能提高性能
很多书上都提到使用Visual对象绘制图形可以提高绘图效率,但是经过本人亲测,结果却发现DrawingContext.DrawRectangle的效率远低于使用UIElement.Children.Add(UIElement element)方法。
此时方法如下:
前台窗体有两个canvas,一个里面直接放矩形Rectangle,另外一个放自己写的继承自Canvas的子类控件DrawingCanvas;
他们的面积都为800×600。
经测试,使用DrawingContext.DrawRectangle绘制15000个正方形需耗时35秒左右,而使用基础类Canvas.Children.Add(UIElement element)的方法只需耗时3.7秒。
DrawingContext.DrawRectangle的代码
: private void btnDrawing_Click_1(object sender, RoutedEventArgs e)
: {
: //自己写的继承自Canvas的子类控件DrawingCanvas
: ZhangAi = new DrawingCanvas();
: DrawingPlan.Children.Add(ZhangAi);
: Canvas.SetLeft(ZhangAi, );
: Canvas.SetTop(ZhangAi, );
: Time1 = DateTime.Now;
: Random rd = new Random();
:
: ; i < Convert.ToInt16(CellNumber.Text); i++)
: {
: //自己写的继承自DrawingVisual的子类
: MyDrawingVisual visual = new MyDrawingVisual();
: visual.Tag = ).ToString();
: using (DrawingContext dc = visual.RenderOpen())
: {
: dc.DrawRectangle(drawingBrush, drawingPen,
: ), rd.Next()), new Size(GridSize, GridSize)));
: }
: ZhangAi.AddVisual(visual);
:
:
: }
: }
Canvas.Children.Add(UIElement element)的方法
: private void btnGeneral_Click_1(object sender, RoutedEventArgs e)
: {
: Time1 = DateTime.Now;
: Random rd = new Random();
:
: ; i < Convert.ToInt16(CellNumber.Text); i++)
: {
:
: rect = new Rectangle();
: rect.Fill = new SolidColorBrush(Colors.GreenYellow);
: rect.Opacity = 0.3;
: rect.Stroke = new SolidColorBrush(Colors.Gray);
: rect.Width = GridSize;
: rect.Height = GridSize;
: testCanvas.Children.Add(rect);
: Canvas.SetLeft(rect, rd.Next());
: Canvas.SetTop(rect, rd.Next());
: }
: }
下面是DrawingCanvas 类
: using System;
: using System.Collections.Generic;
: using System.Text;
: using System.Windows.Media;
: using System.Windows.Controls;
: using System.Windows;
:
: namespace WPFGameTest
: {
: public class DrawingCanvas : Canvas
: {
: private List<Visual> visuals = new List<Visual>();
:
: protected override Visual GetVisualChild(int index)
: {
: return visuals[index];
: }
: protected override int VisualChildrenCount
: {
: get
: {
: return visuals.Count;
: }
: }
:
: public void AddVisual(Visual visual)
: {
: visuals.Add(visual);
:
: base.AddVisualChild(visual);
: base.AddLogicalChild(visual);
:
: }
:
: public void DeleteVisual(Visual visual)
: {
: visuals.Remove(visual);
:
: base.RemoveVisualChild(visual);
: base.RemoveLogicalChild(visual);
: }
:
: public MyDrawingVisual GetVisual(Point point)
: {
: HitTestResult hitResult = VisualTreeHelper.HitTest(this, point);
: return hitResult.VisualHit as MyDrawingVisual;
: }
:
: private List<DrawingVisual> hits = new List<DrawingVisual>();
: public List<DrawingVisual> GetVisuals(Geometry region)
: {
: hits.Clear();
: GeometryHitTestParameters parameters = new GeometryHitTestParameters(region);
: HitTestResultCallback callback = new HitTestResultCallback(this.HitTestCallback);
: VisualTreeHelper.HitTest(this, null, callback, parameters);
: return hits;
: }
:
: private HitTestResultBehavior HitTestCallback(HitTestResult result)
: {
: GeometryHitTestResult geometryResult = (GeometryHitTestResult)result;
: DrawingVisual visual = result.VisualHit as DrawingVisual;
: if (visual != null &&
: geometryResult.IntersectionDetail == IntersectionDetail.FullyInside)
: {
: hits.Add(visual);
: }
: return HitTestResultBehavior.Continue;
: }
:
: }
: }
下面是MyDrawingVisual 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media;
namespace WPFGameTest
{
public class MyDrawingVisual : DrawingVisual
{
string _Tag;
public string Tag
{
get { return _Tag; }
set { _Tag = value; }
}
// 摘要:
// 初始化 System.Windows.Media.DrawingVisual 类的新实例。
public MyDrawingVisual() { }
// 摘要:
// 获取 System.Windows.Media.DrawingVisual 对象的绘图内容。
//
// 返回结果:
// 获取一个 System.Windows.Media.DrawingGroup 类型的值,该值表示 System.Windows.Media.DrawingVisual
// 中 System.Windows.Media.Drawing 对象的集合。
//public DrawingGroup Drawing { get; }
// 摘要:
// 确定可视对象的边界中是否存在几何图形值。
//
// 参数:
// hitTestParameters:
// 一个 System.Windows.Media.GeometryHitTestParameters 类型的值,指定命中测试所依据的 System.Windows.Media.Geometry。
//
// 返回结果:
// 一个 System.Windows.Media.GeometryHitTestResult 类型的值。
protected GeometryHitTestResult HitTestCore(GeometryHitTestParameters hitTestParameters)
{
return base.HitTestCore(hitTestParameters);
}
//
// 摘要:
// 确定在 System.Windows.Media.DrawingVisual 对象的边界中是否存在点坐标值。
//
// 参数:
// hitTestParameters:
// 一个 System.Windows.Media.PointHitTestParameters 类型的值,指定命中测试所依据的 System.Windows.Point。
//
// 返回结果:
// 一个 System.Windows.Media.HitTestResult 类型的值,表示从命中测试中返回的 System.Windows.Media.Visual。
protected HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
return base.HitTestCore(hitTestParameters);
}
//
// 摘要:
// 打开用于呈现的 System.Windows.Media.DrawingVisual 对象。返回的 System.Windows.Media.DrawingContext
// 值可用于呈现为 System.Windows.Media.DrawingVisual。
//
// 返回结果:
// 一个 System.Windows.Media.DrawingContext 类型的值。
public DrawingContext RenderOpen()
{
return base.RenderOpen();
}
}
}
Visual对象之DrawingContext.DrawRectangle在有的状态下似乎并不能提高性能的更多相关文章
- Java对象在Hibernate持久化层的状态
-临时状态:刚用new语句创建对象,还没有被持久化,并且不处于Session缓存中.处于临时状态的java对象被称为临时对象. -持久化状态:已经被持久化,并且加入到Session的缓存中.处于持久化 ...
- WPF中实现图片文件转换成Visual对象,Viewport3D对象转换成图片
原文:WPF中实现图片文件转换成Visual对象,Viewport3D对象转换成图片 1.图片文件转换成Visual对象 private Visual CreateVisual(string imag ...
- Hibernate实体对象的生命周期(三种状态)
瞬时状态(Transient) 通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态. Session对于瞬时状态的Java对象是一无所知的, ...
- easyui 在编辑状态下,动态修改其他列值。
首先是自定义了一个方法uodateColumn更新列值 /** *自定义的修改列值方法 */ $.extend($.fn.datagrid.methods, { updateColumn: funct ...
- SpringMVC成员变量并发状态下使用测试
1.SpringMVC默认是单例的,使用成员变量在并发状态下该成员变量的值是被共享的 测试平台 我们目前正在开发的电商项目 (架构组成SpringCloud + SpringBoot + Sprin ...
- 线程状态及各状态下与锁和CPU的关系
线程的状态 Thread.State枚举类型中定义了线程的六种状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED. 线程在某一时刻只能拥有 ...
- android 控件在不同状态下的内容样式与背景样式
1 控件内容(如字体颜色)在不同状态下有不同的表现色ref:http://developer.android.com/guide/topics/resources/color-list-resourc ...
- wpf,离线状态下部分功能不可用。
离线状态下,设置按钮的不可用.通过改变资源字典的值. App.xaml 文件下添加如下 xmlns:sys="clr-namespace:System;assembly=mscorlib&q ...
- 利用selector设置ImageButton不同状态下的背景图片
1.自定义MyButton类 public class MyButton extends Button { //This constructormust be public MyButton(Cont ...
随机推荐
- 程序退出异常_DebugHeapDelete和std::numpunct
前几天程序新加一个功能之后,其中用到了boost的lexical_cast<float>,发现在关闭命令行窗口的时候,程序报错,是程序退出清理时候报的错误. 一开始以为是程序新增的功能有问 ...
- 《JavaScript Ninja》之挥舞函数
挥舞函数 匿名函数为什么如此重要 通常使用匿名函数的情况是,创建一个供以后使用的函数.例如,将匿名函数保存在一个变量里,将其作为一个对象的方法,或者是将匿名函数作为一个回调.-->在这些情况下, ...
- sourceMappingURL
JavaScript Source Map 详解
- ORA-12545: 因目标主机或对象不存在, 连接失败
ORA-12545: 因目标主机或对象不存在, 连接失败 1. 问题描述 XP系统下同时安装了AX1应用程序和升级版AX2,连接同一个在本机Oracle客户端上配置的连接实例,其中AX2显示链接成功, ...
- Java-->利用文件指针分割文件
--> 大体上和字节流分割的方式没什么区别,只是加入文件指针确定要开始分割的位置... package com.dragon.java.splitmp3; import java.io.File ...
- centos6.4搭建knowlededgeroot-1.0.4知识库平台
知识库平台选择 http://www.oschina.net/project/tag/320/pkm 最近接到一个任务,要求搭建一个用于部门内部业务知识规范管理和共享的平台,目的是把部门内的FAQ知识 ...
- SQLite 字段类型
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断. SQLite具有以下五种数据类型: 1.NULL:空值. 2.INTEGER:带符号的整型,具体取决有存入 ...
- Android滑动选择的日期选择框
效果图如下. 实现也很简单,使用的是Android的DatePicker控件.AlertDialog实现. 首先是布局文件:date_picker_dialog.xml <?xml versio ...
- C++ Primer : 第九章 : 顺序容器的操作以及迭代器失效问题
顺序容器的添加.访问.删除操作以及forward_list的特殊操作,还有迭代器失效问题. 一.向容器添加元素 // array不支持这些操作 // forward_list有自己撰于的版本的inse ...
- php部分--数组(包含指针思想遍历数组);
1.创建并输出数组 (1)相同数据类型的数组$attr=array(1,2,3,4,5); print_r($attr); echo "<br>"; $sttr1=ar ...