一系列的3d序列帧(把3d模型保存为若干张图片),MouseMove 事件中更改Image.Source,但由于图片比较大,出现了卡顿(3d模型转动起来不够流畅),把所有的图片都加载到了List<byte[]>中,但是卡顿几乎得不到改善,而且内存占用很高(加载了几百张图片,不高才怪!)。如果压缩减小图片文件,经测试,单张图片600KB左右就比较流畅,但是不够清晰,所以此路不通。
问题的关键应该在于“图像呈现”,但是在下水平实在有限,还望各位大神走过路过不要错过啊!在下不胜感激!
经过测试:
使用List<ImageSource> 来缓存所有的图片,在ImageSource呈现过一次之后,下次呈现就会加快很多。但是这样内存占用很高。
400张1.27M的图片,内存占用达到了1360多M,而每张图片第一次呈现需要35ms左右,当所有的图片都呈现过之后,三维模型能够流畅旋转,图片呈现耗时减少为15ms左右。
400张860K左右的图片,内存占用达到了1300多M,呈现时间30ms左右 之后呈现时间为15ms左右
400张620K左右的图片,内存占用880多M,呈现时间为20ms左右,理论耗时:20*400=8000ms 实际耗时:1200+ms ,之后呈现时间为15ms左右,
400张500K左右的图片,内存占用700多M,呈现时间15ms左右,第一次呈现即可以流畅的旋转,但是图片清晰度不够!程序大小1024*1024
注:以上内存占用均指List中ImageSource已经全部呈现过 ,呈现时间在15ms以内即可达到流畅效果
两个关键性问题:
1、如何减少呈现耗时(我现在的做法是用一个动态的loading图片遮住,用一个线程来依次呈现所有ImageSource)
2、减少内存占用 (我尝试只保存当前Index的前、后10个ImageSource,内存占用是下来了,但是没有了缓存效果,可能是我的线程调度有问题)
是JPG格式的图片? 尝试更改下图片的格式,不同的图片格式WPF加载出来内存占用会有点不同。
不过总得说来WPF、WINFORM处理图像似乎都差不多。就是不知道windows自带的图片查看器是如何做的。