• 如何显示超大图像(2)


    前面一篇博客只是跟大家总诉一下超大图像显示的样子,还有涉及到的技术,下面我就跟大家细细说一下里面涉及到的技术,技术种类很多很多,所以一项一项的来:今天我要跟大家讲的是第一个技术是虚拟容器技术:

    1:首先大家可能要问,这个技术是干啥的,好的,我给您举个例子,无论是C#还是WPF,亦或是MFC,我们都会用到listBox这个控件吧,好了问题来了,如果我有上百万条列表信息,要放到这个ListBox里面,咋办,比如如图:

    就是这样的列表控件,里面我让您显示一百万条数据信息,怎么办,这种场合很多的,比如你要给公司开发一个信息系统,想什么管理信息系统呀,那数据很多的,一般人会用傻大粗的数据库,每次需要加载信息的时候从数据库里面读取,这种方式弊端是啥,慢,很慢,卡,很卡,就比如这个这种情况,我说的,我拉动上述图片中的列表框的sliderBar,往下拉,我拉的很快很快,如果你要是从数据库里面读取的话,你要读多少次,然后更新多少次,信不信卡死你,我也试过,当然有的人会说,我可以等你把SliderBar拉到某个位置的时候,在确定我要显示哪些数据,然后再从数据库里面读取,说实话,很不错,这样做可以,缺点是什么,用户体验很不好!!!!,另外,咱们那种像C#,MFC这种ListBox控件简直是个弱智的低能儿,首先你想,如果我要采用我刚才说的方法,等你把SliderBar拉到某一个位置,比如拉到中间,中间对应的条目是第10000个条目,然后我从数据库里面读10000-10020对应的条目信息显示在上面,好了假如让你设计这个控件你咋设计,第一你这个控件得有这么长的SliderBar的范围吧,你加Item的时候你是不是用函数加的,这个函数好像是ListBox.AddItem();,,你然后会想到,我就价格循环把条目加进去,就比如这样:

    我开始加了哈,循环嘛,很简单,好了请您把count=1000000试一试,或则让count=100000000试试,使劲加吧,你电脑就会死机了哟,为什么,内存不够了!!!!,要知道,这才多少数据,如果几十亿条数据,你咋办,,好了我说的技术来了,虚拟容器技术的一个小应用来了!!!

    2:这项技术很有用,往往在大数据情况下有用,之前咱们作为学生做的程序实验数据量都不够大,也没这方面的需求,虚拟容器技术既可以用于数据量很小的情况下,也可以用于数据量无限大情况下,反正就是人家尽可能最大化利用你电脑那一点可怜的内存,这个技术讲白了说就是:我先用你的数据初始化这个控件,然后你让我显示哪的数据我再给你显示出来。。。。。没有在显示范围内的数据,我就给你虚拟化了,要显示的数据我给你实例化了。所以电脑内存里面只放着我给你实例化的那几条数据,其余的海量数据都虚拟化了,没在内存里。不知道别的语言有没有这个功能,我想也有,但是  WPF里面有,用起来很方便,就是,第一步:你要给ListBox穿上一个带有你自己设定的属性的外衣,

    比如:

    设置控件属性:其中一个很重要的就是VirtualizingStackPanel.IsVirtualizing 我们都知道WPF里面的控件都要放在一个布局控件里面,像Grid Panel等等,VirtualizingPanel就是个可以对数据实例化和虚拟化的一个布局控件。我们把ListBox放在里面设置好属性,你就可以使用虚拟化和实例化数据这个功能了。也就可以实现我上述说的那种功能,在保证数据浏览流畅性的同时,极低的占用你的电脑内存,因为人家只是用了几b内存来存放你实例化的那几条数据。。。。。。

    效果图:

    第一种,我们用链表放数据,就是傻大粗的往控件假数据呗,看看效果哈:

    一共一百万条数据,占用内存223.4M  如果几亿条数据呢,哈哈哈,几亿条数据太正常了,互联网数据了有多大!!!

    第二种:我用虚拟显示技术看一看:

    整个程序运行才占用2.2M  是整个程序运行占用内存!!,,数据占用内存就更小了。。

    我们往下拉如图:

    效果很不错的,,内存占用整个过程都没有变化!!!

    3:这只是虚拟容器技术的一个很小的应用,也就是说这个技术应用在ListBox空间里面,要知道,我们的目的是什么。是显示图片。我们要显示无穷大的图片,那么这个思想也是一样的哟,当然仅仅思想是一样的,显示图片应用的是稍微高级一些的方式,但是思想都是一样的,虚拟化和实例化,

    4:用了这个技术,你可以处理的数据,你可以为所欲为了,现在不都是搞大数据嘛,大数据处理,大数据分析,这就是一个很有效处理大数据的方式。下面一章,主要会说明一下,如何在图像显示里面用虚拟容器技术,要理解下一节,本节的内容和思想必须吃透。

    5:本节用到的例程有需要的话可以问我要,我QQ1783913796  邮箱:nanshanyi@sjtu.edu.cn ,

  • 相关阅读:
    #检查磁盘使用率超过90%,并且后台进程没有rman在跑,就运行 /data/script/del_dg_arch.sh 脚本清理归档
    linux shell数据重定向
    创建用户
    Linux HA+ Oracle 安装维护手册
    解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range
    Linux 文件不能被root修改与编辑原因
    python中的时间戳和格式化之间的转换
    Python-Redis-发布订阅
    Python-Redis-常用操作&管道
    Python-Redis-Set
  • 原文地址:https://www.cnblogs.com/mataiyuan/p/7764948.html
Copyright © 2020-2023  润新知