WPF做动画显示感觉卡顿

moonk-z 2020-04-16 09:14:12
大佬们好。
最近在改一个功能,将网络传输过来的实时图片帧,刷新到界面形成动画。
在Model中绑定View中的Image,每次接收之后更改Model中的ImageSource。
测试了接收效率,基本能达到35+帧能满足要求,但是在刷新的时候会比较卡 明显不够流畅,显示刷新的就只有十来帧。
请问一下有没有别的更好的实现方案?
...全文
12419 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lvwl 2021-02-04
  • 打赏
  • 举报
回复
OpenCVSharp了解一下,可以处理图片和视频流
qq14923349 2020-11-05
  • 打赏
  • 举报
回复
i9 10代和好显示器
誰是方長 2020-10-21
  • 打赏
  • 举报
回复
public static BitmapImage LoadImg(string uri) { BitmapImage image = new BitmapImage(); image.BeginInit(); try { image.UriSource = new Uri(uri); image.CacheOption = BitmapCacheOption.OnLoad; RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality); image.EndInit(); } catch (Exception ex) { return null; } return image; }
耗子哭死猫 2020-04-30
  • 打赏
  • 举报
回复
这个传输协议的二进制内容必须压缩GZipStream 要是大图嗝屁
RunnerDNA 2020-04-21
  • 打赏
  • 举报
回复
用Image的WritePixels方法试试。
lindexi_gd 2020-04-20
  • 打赏
  • 举报
回复
引用 4 楼 moonk-z 的回复:
[quote=引用 3 楼 lindexi_gd 的回复:]
1. 用 Bitmap 接收可以放在另外线程,这部分可以减少主线程卡顿
2. 返回 jpg 是因为渲染 jpg的性能相对快一点
3. 使用 WriteableBitmap 是刷新需要更改的地方,通过修改像素和问题 2 相同,需要你先计算哪些需要刷新


可能我说的不是很清楚,传过来的动画是一个二进制码,我处理的方式是用bitmap的格式取出,然后再转成可以显示的imagesource。返回jpg我没看太明白什么意思?
剩下的两点我试下,谢谢[/quote]

其实 Jpg 也是二进制,也就是服务器端返回的二进制格式是 jpg 文件

moonk-z 2020-04-20
  • 打赏
  • 举报
回复
引用 3 楼 lindexi_gd 的回复:
1. 用 Bitmap 接收可以放在另外线程,这部分可以减少主线程卡顿
2. 返回 jpg 是因为渲染 jpg的性能相对快一点
3. 使用 WriteableBitmap 是刷新需要更改的地方,通过修改像素和问题 2 相同,需要你先计算哪些需要刷新


可能我说的不是很清楚,传过来的动画是一个二进制码,我处理的方式是用bitmap的格式取出,然后再转成可以显示的imagesource。返回jpg我没看太明白什么意思?
剩下的两点我试下,谢谢
lindexi_gd 2020-04-16
  • 打赏
  • 举报
回复
1. 用 Bitmap 接收可以放在另外线程,这部分可以减少主线程卡顿
2. 返回 jpg 是因为渲染 jpg的性能相对快一点
3. 使用 WriteableBitmap 是刷新需要更改的地方,通过修改像素和问题 2 相同,需要你先计算哪些需要刷新
moonk-z 2020-04-16
  • 打赏
  • 举报
回复
引用 1 楼 lindexi_gd 的回复:
每次都更改一个图片,如果这个图片是十分大的图片,当然此时的渲染将会很卡了

有一个方法是构建图片和显示图片放在不同的线程,这样能提升一定的性能

将 BitmapImage 的构建到 EndInit 放在另一个线程,注意调用 Freeze 方法,然后放在主线程显示,此时将可以使用两个线程做图片解析和显示,预计能提升一些性能。另外对于图片解析来说,大部分的显卡都有对 jpg 的加速,刚好 WPF 是能用上这部分加速的,从性能提升的角度上说,如果能返回 jpg 会更好。其次,如果每次不是全量的图片刷新,也能提升一些速度,加入每次只是返回增量的部分,通过 WriteableBitmap 的方式刷新部分,也能做到比较好的性能。我就是通过 WriteableBitmap 的形式刷新一个垃圾厂商给的摄像头的内容,轻松在垃圾的cpu上刷新到了60赫兹


感谢回复。
首先,我是通过同步方式进行转换,因为格式比较奇葩,只能先用bitmap接收,然后用Image加载后,进行Endint和Freeze释放空间,再通过事件委托将该image传到内存的绑定参数上。在freeze后,我计算过帧率,就是标题中所说的,35~45帧,看起来不是瓶颈。我倾向于是在加载图片的时候处理不当或者达到了硬件瓶颈【没有独立显卡】。

1、这里说的“返回jpg”我不太明白是什么意思?是说接口吗?
2、全量的图片刷新 由于动画效果采集的是固定全量,如果我这边还做图片对比计算的话,可能工作量较大不太合适。
3、关于使用WriteableBitmap,意思是不使用绑定,加载到图片之后,通过WriteableBitmap填充界面的图片吗?

lindexi_gd 2020-04-16
  • 打赏
  • 举报
回复
每次都更改一个图片,如果这个图片是十分大的图片,当然此时的渲染将会很卡了

有一个方法是构建图片和显示图片放在不同的线程,这样能提升一定的性能

将 BitmapImage 的构建到 EndInit 放在另一个线程,注意调用 Freeze 方法,然后放在主线程显示,此时将可以使用两个线程做图片解析和显示,预计能提升一些性能。另外对于图片解析来说,大部分的显卡都有对 jpg 的加速,刚好 WPF 是能用上这部分加速的,从性能提升的角度上说,如果能返回 jpg 会更好。其次,如果每次不是全量的图片刷新,也能提升一些速度,加入每次只是返回增量的部分,通过 WriteableBitmap 的方式刷新部分,也能做到比较好的性能。我就是通过 WriteableBitmap 的形式刷新一个垃圾厂商给的摄像头的内容,轻松在垃圾的cpu上刷新到了60赫兹

8,737

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧