sunleifentian 发表于 2023-3-27 00:26:19

请教nneid3与error-diffusion在mpv中性能开销问题

硬件为13600kf和4070ti,电源设置为高性能模式,win11 系统>屏幕>显示卡选单中 MPV设置为高性能,nvdia控制面板3D设置也正确。
因为硬件性能有余裕,在大佬的懒人包基础上加了nnedi3 256 8X6,把error-diffusion一行前的注释符号#去掉,记“dither-depth = 10”并开启krig,在这样的设置下,用4k屏幕播放1080p24帧视频不会出现掉帧,dropped frame始终为0,GPU占用在80%上下浮动十分稳定,功耗为140w左右(TDP330w)。
以上是我去除mpv.conf中“video-sync = display-resample”语句后达到的效果,我的显示设备支持119.880刷新率和原生10bit色深。

令我感到费解的是,若使用 video-sync = display-resample(MPV输出119.880而非23.976)
在以下三种设置下
1、不使用error-diffusion抖动,只开启nnedi3,并选择比128 8X4性能开销更大的档位(128 8X6、256 8X4、256 8X6)。
2、不开启nnedi3,使用默认的spline36(性能开销极低),开启error-diffusion抖动。
3、同时开启nnedi3和error-diffusion抖动。
均会出现GPU占用率低,功耗低,频繁掉帧的问题,如图


奇怪的是,单独只使用懒人包默认的nnedi3 128 8X4倒是正常的,开销也很低。128 8X6就会在低占用,低功耗情形下频繁掉帧。

按照我个人之前使用madvr的经验,madvr中效果类似的选项“present a frame for every VSync”性能开销可以忽略不计,虽然二者原理不同,但我直觉上觉得video-sync = display-resample并不会消耗多少性能,这里显然出现了某种奇怪的兼容性问题,导致MPV没有充分利用GPU性能并掉帧,想请教一下各位大佬为什么会出现此种情况?以及有无解决方案{:5_227:}

sunleifentian 发表于 2023-3-27 00:40:19

确实nnedi3 128 8X4足够好,更高的档位多少有点徒增功耗的意思,但是从pot转移到mpv之后,没有madvr的OSD提示,尽管我已经在mpv.conf中键入
“gpu-api=d3d11
   d3d11-exclusive-fs = yes”
我发现我无法判断MPV究竟有没有正确输出10bit内容,mpv无论是控制台还是OSD都没有相关信息。手头的bdmv毕竟都是8bit的视频,所以我感觉使用error-diffusion的刚需,目前即便是error-diffusion=simple都是不能和video-sync = display-resample一起正常运作的,感觉很难受。我还发现设置dither-depth = 10时,error-diffusion无论是播放10bit片源还是8bit片源都会生效,不知这是什么原因{:4_682:}

孤雨独火 发表于 2023-3-27 01:50:22

本帖最后由 孤雨独火 于 2023-3-27 03:10 编辑

krig开不开无所谓,大部分时间都是徒增功耗。

你既然设置了dither-depth=10,那自然按照你的要求抖动到10,这个有什么问题吗
error-diffusion从来就不是什么刚需,徒增功耗。
log里会显示位深(普通用户不需要关心,d3d11默认设置就能输出正确的位深)

d3d11-exclusive-fs 没事别用也没卵用

display-resample可能会增加很多性能开销(取决于刷新率有多高和interpolation+tscale的算法
    另外你这个刷新率匹配常见视频的帧率24/60,也不需要display-resample(除非你想用interpolation)

掉帧和GPU占用率走低通常是一起发生的(原理你自己想,输出帧率低了,显卡自然渲染占用少了)

sunleifentian 发表于 2023-3-27 03:29:16

孤雨独火 发表于 2023-3-27 01:50
krig开不开无所谓,大部分时间都是徒增功耗。
你既然设置了dither-depth=10,那自然按照你的要求抖动到10, ...

谢谢解答!dither-depth我之前认为它是类似于lav video decoder干的 h264->P010之类的工作,还觉得这个选单跟MPV输出的位深有关,现在看来是我搞混了。我想问下log中搜索输出视频位深的关键词是什么?我搜索bit depth出来的是音频的位深。


madvr的“present a frame for every VSync”是没有用任何插值算法的,我之前只知道各种VF滤镜可以插帧,并且madvr自带的smooth motion我一直看不出来开关的区别,一时没有注意到“video-sync = display-resample”也能让画面更流畅。这里我想问一下,我删除了interpolation语句与tscale = linear语句,这种情形下是否还有插值?实际MPV干了什么?因为我是23.976->119.880,如果只是单纯把一帧复制5遍,那么感觉似乎和“present a frame for every VSync”没太大区别,这种情形下还是会有很大开销吗?我实际运作时依然有掉帧。

再一点,我不太清楚图中倒数第三行scale=bilinear(rgb)是在干什么?看起来似乎色度和亮度都已经通过nnedi3和krig达到屏幕原生分辨率了,是哪里还需要放大?以及这个bilinear如何修改为开销更大的算法?


如果发生了掉帧导致GPU占用率低我能理解。但是GPU占用率太低,我不理解为什么会掉帧,例如理论上应该输出120fps,实际掉帧只能输出96fps,然而此时GPU占用率只有30%~40%,功耗就不提了,那么为什么会掉帧,而不是正常输出120fps呢?按照比例来说似乎300fps都不会掉帧。



孤雨独火 发表于 2023-3-27 03:46:04

本帖最后由 孤雨独火 于 2023-3-27 03:59 编辑

去找显示器相关的信息
[   0.095] Queried output: \\.\DISPLAY1, 2560x1440 @ 8 bits, colorspace: RGB_FULL_G22_NONE_P709 (0)
[   0.095] Selected swapchain format R8G8B8A8_UNORM (28), attempting to utilize it.
[   0.096] Selected swapchain color space RGB_FULL_G22_NONE_P709 (0), attempting to utilize it.
[   0.096] Swapchain capabilities for color space RGB_FULL_G22_NONE_P709 (0): normal: yes, overlay: yes
[   0.096] Swapchain successfully configured to color space RGB_FULL_G22_NONE_P709 (0)!

关了 interpolation 就不插值。我不清楚它是不是只是单纯复制,从实测来看它是每个采样的帧都要重渲染的。在超高刷的设备上即使no-config依然是掉帧的(由于帧间隔太低来不及渲染https://github.com/mpv-player/mpv/issues/11122 )

scale=bilinear(rgb) +... 这是vo_gpu设计上的缺陷,不用管 https://github.com/mpv-player/mpv/issues/5727

视频播放输出的fps是定量的,要在固定的帧间隔内完成下一帧的渲染(这是和游戏最大的区别)。来不及就是掉帧跳帧的表现,所有播放器默认都是这么设置的。
原本每一帧都输出,gpu卖力干活 → 现在由于不合理的性能请求导致无法完成,那自然gpu也不用干活,只管跳到能完成渲染的那一帧再说 (游戏里下一帧理论上可以给无限的帧间隔去完成渲染,gpu自然是卖力干活直到呈现出这一帧)(这个例子对比不太好)

sunleifentian 发表于 2023-3-27 19:43:44

孤雨独火 发表于 2023-3-27 01:50
krig开不开无所谓,大部分时间都是徒增功耗。

你既然设置了dither-depth=10,那自然按照你的要求抖动到10 ...

这里还有一个小问题,设置dither depth =10,为什么在播放10bit片源时依然会运作?dither具体干了什么?为何抖动与否同视频位深无关?我试着设置成dither depth = 1,这时确实能看出error-diffusion的优势,然后dither depth = 3情形下区别已经不明显了。
页: [1]
查看完整版本: 请教nneid3与error-diffusion在mpv中性能开销问题