找回密码
 立即注册
查看: 1888|回复: 8

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

  • TA的每日心情
    慵懒
    2022-8-2 17:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    56

    回帖

    0

    VC币

    白金会员

    Rank: 12Rank: 12Rank: 12

    积分
    53846
    sunleifentian 发表于 2023-3-27 00:26:19 | 显示全部楼层 |阅读模式
    硬件为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性能并掉帧,想请教一下各位大佬为什么会出现此种情况?以及有无解决方案

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-8-2 17:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    56

    回帖

    0

    VC币

    白金会员

    Rank: 12Rank: 12Rank: 12

    积分
    53846
    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片源都会生效,不知这是什么原因
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-12-4 12:48
  • 签到天数: 42 天

    [LV.5]常住居民I

    47

    主题

    2757

    回帖

    2020

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    429797

    崭露头角活跃达人CD!BD!坚持不懈灌水之王日积月累

    孤雨独火 发表于 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占用率走低通常是一起发生的(原理你自己想,输出帧率低了,显卡自然渲染占用少了)
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-8-2 17:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    56

    回帖

    0

    VC币

    白金会员

    Rank: 12Rank: 12Rank: 12

    积分
    53846
    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都不会掉帧。



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    点评

    https://github.com/mpv-player/mpv/issues/10447#issuecomment-1375010697  发表于 2023-3-29 02:41
    补充一下,现在肯定 display-resample 视情况而定将产生巨大的开销  发表于 2023-3-29 02:41
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-12-4 12:48
  • 签到天数: 42 天

    [LV.5]常住居民I

    47

    主题

    2757

    回帖

    2020

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    429797

    崭露头角活跃达人CD!BD!坚持不懈灌水之王日积月累

    孤雨独火 发表于 2023-3-27 03:46:04 | 显示全部楼层
    本帖最后由 孤雨独火 于 2023-3-27 03:59 编辑

    去找显示器相关的信息
    1. [   0.095][v][vo/gpu/d3d11] Queried output: \\.\DISPLAY1, 2560x1440 [url=home.php?mod=space&uid=33789]@[/url] 8 bits, colorspace: RGB_FULL_G22_NONE_P709 (0)
    2. [   0.095][v][vo/gpu/d3d11] Selected swapchain format R8G8B8A8_UNORM (28), attempting to utilize it.
    3. [   0.096][v][vo/gpu/d3d11] Selected swapchain color space RGB_FULL_G22_NONE_P709 (0), attempting to utilize it.
    4. [   0.096][v][vo/gpu/d3d11] Swapchain capabilities for color space RGB_FULL_G22_NONE_P709 (0): normal: yes, overlay: yes
    5. [   0.096][v][vo/gpu/d3d11] 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自然是卖力干活直到呈现出这一帧)(这个例子对比不太好)

    评分

    参与人数 1活跃度 +666 收起 理由
    sunleifentian + 666 很给力!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-8-2 17:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    56

    回帖

    0

    VC币

    白金会员

    Rank: 12Rank: 12Rank: 12

    积分
    53846
    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情形下区别已经不明显了。

    点评

    我不清楚mpv的抖动是怎么设计的。但一般来讲,yuvrgb格式互转也需要抖动实现更高的质量  发表于 2023-3-27 22:38
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表