问题描述
设置如下:一个winform应用程序,Visual Studio 2019,创建16个videoview / mediaplayer实例,每个实例从多播摄像机流式传输960 X 540 30fps摄像机流。
cpu i7 2.67GHz,GPU NV GTX 1650。
GPU正在加载多达44%的解码,而对于3d而言几乎相同。该应用程序使用了惊人的75%到90%的cpu。从一个测试运行到另一个运行,它跳了很多。 GPU非常稳定。
还有其他一些有趣的信息。如果我使用一个视频流运行此应用程序的单个副本,则cpu使用率约为cpu的5/10%。如果我运行该应用程序的16个实例,则每个实例使用大约4/10至8/10%的cpu。当我有16个视频流传输时,GPU与上面的相同(44%),cpu正常。
在添加摄像机的情况下,一个实例中cpu使用率的增加不是线性的,因此在9之后会出现很大的跳跃。 从下面的诊断图像中,您可以看到用法几乎完全隔离在本机代码中。其他图显示了内核中大约2/3,系统IO中大约1/3。 cpu均匀地分布在所有内核上。
我对此进行了很多尝试,但是无论我尝试多少,只要达到16个通道,cpu的使用率就保持恒定。我试过在自己的线程中运行每个实例。没关系。我真的很想了解这一点,并找到减少cpu使用率的方法。我有一个使用此技术的应用程序,而一个客户需要的渠道比16个还要多。
解决方法
这可能是一个错误,需要在trac.videolan.org上进行报告,并为VLC开发人员提供最少的C / C ++复制示例。
请注意,比较16个VLC应用程序实例(16个进程)的播放和1个基于LibVLC的应用程序实例播放16个流(1个进程)并不是完全公平的比较。
但是,perf的用法仍然应该是线性的,而不是指数的,因此可能存在错误。