Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: 笔记本上V2rayN 6.45版运行时阻止NVIDIA控制面板改变显示模式 #5255

Open
2 tasks done
Teiii14 opened this issue Jun 20, 2024 · 51 comments
Open
2 tasks done
Labels
bug Something isn't working

Comments

@Teiii14
Copy link

Teiii14 commented Jun 20, 2024

预期情况

正常情况下应该不对此显示模式自动切换功能产生任何影响

实际情况

在我的笔记本电脑(ThinkBook 16+)上,当6.45版V2rayN运行时,控制面板上面的显示模式设置为“自动”(即自动切换显示屏输出为CPU核显或者独立显卡),若我试图启动一款游戏或者其他任何会使得NVIDIA控制面板将显示模式自动切换为“仅NVIDIA GPU”的应用程序时,NVIDIA控制面板将提示无法切换显示模式,且NVIDIA控制面板会提示是V2rayN阻止了显示模式的切换。
a259f874249a25e3774c9cb57108d22
02fb209647a3022240ab1eff47eda51

复现方法

  1. 在笔记本上将NVIDIA控制面板的显示模式设置为自动;
  2. 启动V2rayN v6.45;
  3. 尝试启动一款正常情况下可使NVIDIA控制面板切换显示模式的游戏或软件;
  4. 你将看到左下角弹出消息提示:“无法修改显示模式”,单击此消息进入NVIDIA控制面板,弹出窗口”应用程序阻止显示模式更改“,窗口里将会列出V2rayN。

日志信息

2024-06-20 01:51:05.8235-INFO Current_SessionEnding
2024-06-20 01:51:05.8235-INFO MyAppExit Begin
2024-06-20 01:51:05.8554-INFO MyAppExit End
2024-06-20 01:51:05.8694-INFO OnExit
2024-06-20 01:52:52.6891-INFO v2rayN start up | v2rayN - V6.45 - 2024/06/18 | C:\v2rayN\v2rayN-With-Core\v2rayN.exe
2024-06-20 01:53:54.1064-INFO UpdateTaskRunSubscription
2024-06-20 01:54:54.1370-INFO UpdateTaskRunGeo
2024-06-20 03:37:57.0238-INFO subscription更新订阅结束
2024-06-20 09:38:04.5298-INFO subscription更新订阅结束
2024-06-20 10:36:34.2820-INFO MyAppExit Begin
2024-06-20 10:36:34.3139-INFO MyAppExit End
2024-06-20 10:36:34.3481-INFO OnExit
2024-06-20 11:36:36.4677-INFO v2rayN start up | v2rayN - V6.45 - 2024/06/18 | C:\v2rayN\v2rayN-With-Core\v2rayN.exe
2024-06-20 11:37:13.0152-INFO MyAppExit Begin
2024-06-20 11:37:13.0415-INFO MyAppExit End
2024-06-20 11:37:13.0599-INFO OnExit
2024-06-20 11:37:14.8091-INFO v2rayN start up | v2rayN - V6.45 - 2024/06/18 | C:\v2rayN\v2rayN-With-Core\v2rayN.exe
2024-06-20 11:38:15.2725-INFO UpdateTaskRunSubscription
2024-06-20 11:39:15.2688-INFO UpdateTaskRunGeo
2024-06-20 11:41:56.9607-INFO MyAppExit Begin
2024-06-20 11:41:56.9941-INFO MyAppExit End
2024-06-20 11:41:57.0075-INFO OnExit
2024-06-20 11:47:36.5422-INFO v2rayN start up | v2rayN - V6.45 - 2024/06/18 | C:\v2rayN\v2rayN-With-Core\v2rayN.exe
2024-06-20 11:48:37.1796-INFO UpdateTaskRunSubscription
2024-06-20 11:49:37.1860-INFO UpdateTaskRunGeo
2024-06-20 12:00:13.8919-INFO MyAppExit Begin
2024-06-20 12:00:13.9231-INFO MyAppExit End
2024-06-20 12:00:13.9458-INFO OnExit
2024-06-20 12:00:26.3664-INFO v2rayN start up | v2rayN - V6.45 - 2024/06/18 | C:\v2rayN\v2rayN-With-Core\v2rayN.exe
2024-06-20 12:01:26.9108-INFO UpdateTaskRunSubscription

额外信息

No response

我确认已更新至最新版本

我确认已查询历史issues

@Teiii14 Teiii14 added the bug Something isn't working label Jun 20, 2024
@ShiinaRinne
Copy link
Contributor

老问题了, 一直没找到咋修
试试这个会不会出错, 如果还是有问题, 应该就得报到wpf那边看看咋回事
net8.0-windows.zip

@Teiii14
Copy link
Author

Teiii14 commented Jun 21, 2024

@ShiinaRinne 好的谢谢,请问如何使用

@ShiinaRinne
Copy link
Contributor

直接解压点开就可以,重新走一遍和v2rayN出问题时相同的流程,看看是否还会触发

@Teiii14
Copy link
Author

Teiii14 commented Jun 22, 2024

@ShiinaRinne 还是会有同样的问题

@ShiinaRinne
Copy link
Contributor

报wpf那边了,你可以watch一下,如果有人提了解决方案就得请你测试了。如果你有一些其他的追加信息也能在那个issue补充一下
我之前的电脑是华硕天选2, R7 5800H + 3060,但在控制面板中没有这个设置,身边人也都没有,所以实在是测试不了
image

@Teiii14
Copy link
Author

Teiii14 commented Jun 22, 2024

@ShiinaRinne 好的感谢,我会关注的

@Kukuair
Copy link

Kukuair commented Jun 23, 2024

image
image

@ShiinaRinne 好的感谢,我会关注的

你试试

@lindexi
Copy link

lindexi commented Jun 24, 2024

@ShiinaRinne 我看了问题,预计不是 WPF 这边的问题,但是确实加上一些显卡限制进入硬件渲染模式是可行的

比方说之前在处理 dotnet/wpf#3817 问题时,我就建议使用判断显卡决定是否进入软渲染模式

判断逻辑: https://github.com/lindexi/lindexi_gd/blob/6f10958bbe27b2c288ac79da3f9c4600727c10a7/JayhallchocojejalNabinojajarher/JayhallchocojejalNabinojajarher/Program.cs

由于等厂商修复的时间一般都会比较长,也许自救也是个好主意

但是我进一步阅读相关帖子发现似乎关闭了硬件加速依然还会有此问题: #2981 (comment)

我手头上也没有可以复现的设备可以调查,也很抱歉没有调查思路

@ShiinaRinne
Copy link
Contributor

我咨询了NVIDIA的技术支持, 他们需要一些日志来定位问题. @Teiii14

You can check the logs on event viewer or get the system information file

之后应该也会有技术支持来查看这几个issue

@ShiinaRinne
Copy link
Contributor

ShiinaRinne commented Jun 25, 2024

但是确实加上一些显卡限制进入硬件渲染模式是可行的
但是我进一步阅读相关帖子发现似乎关闭了硬件加速依然还会有此问题: #2981 (comment)

自动切换和关闭硬件加速时都会出错, 可以强行让它使用显卡渲染吗? 在后台时应该也不会吃很多资源, 但不知道那个自动切换是个什么逻辑

也可以试试 @Kukuair 的方法能不能临时解决, 为v2rayN单独配置一下https://nvidia.custhelp.com/app/answers/detail/a_id/2615/related/1


我手头上也没有可以复现的设备可以调查,也很抱歉没有调查思路

使用相当早期的wpf打包几个, 直到找到是哪部分功能导致的, 这个方法会有效吗? 但测试起来感觉实在有点麻烦XD

@Teiii14
Copy link
Author

Teiii14 commented Jun 25, 2024

@Kukuair 谢谢,这个方法我试过了没有用

@Teiii14
Copy link
Author

Teiii14 commented Jun 25, 2024

@ShiinaRinne @lindexi 非常感谢

@Teiii14
Copy link
Author

Teiii14 commented Jun 25, 2024

@lindexi @ShiinaRinne 顺带一提,最近我发现Microsoft Store中的Quick look软件也会出现这样的情况,不知道和V2rayN出现的错误有没有共同之处https://www.microsoft.com/store/productId/9NV4BS3L1H4S?ocid=pdpshare

@lindexi
Copy link

lindexi commented Jun 25, 2024

使用相当早期的wpf打包几个, 直到找到是哪部分功能导致的, 这个方法会有效吗? 但测试起来感觉实在有点麻烦XD

核心就是麻烦咯,要是自己有设备还好,不然每次要麻烦大家帮忙测试也是要命

@ShiinaRinne
Copy link
Contributor

ShiinaRinne commented Jun 25, 2024

QL-Win/QuickLook#1126
microsoft/PowerToys#31825
microsoft/PowerToys#27684
microsoft/PowerToys#14677
Eugeny/tabby#657 (comment)
翻了一下确实有些相关的东西.

https://www.nvidia.com/content/Control-Panel-Help/vLatest/en-us/mergedProjects/nv3d/Closing_Blocking_Programs.htm
但如这个所说, 在运行中无法更改是预期行为.
我想驱动应该有一种方法来获取这部分程序, 我们应该寻找的解决方案可能是在显卡切换时, 避免这些程序被识别到从而被更改, 不知道NVIDIA能不能加个白名单之类功能的hhh

@ShiinaRinne
Copy link
Contributor

@Kukuair 谢谢,这个方法我试过了没有用

Eugeny/tabby#657 (comment)
不让windows决定, 切换为节能呢?

@lindexi
Copy link

lindexi commented Jun 25, 2024

@lindexi @ShiinaRinne 顺带一提,最近我发现Microsoft Store中的Quick look软件也会出现这样的情况,不知道和V2rayN出现的错误有没有共同之处https://www.microsoft.com/store/productId/9NV4BS3L1H4S?ocid=pdpshare

Quick look 是一个 .NETFramework 4.6.2 的 WPF 程序,共同点都是 WPF 程序

@lindexi
Copy link

lindexi commented Jun 25, 2024

QL-Win/QuickLook#1126 microsoft/PowerToys#31825 microsoft/PowerToys#14677 Eugeny/tabby#657 (comment) 翻了一下确实有些相关的东西.

https://www.nvidia.com/content/Control-Panel-Help/vLatest/en-us/mergedProjects/nv3d/Closing_Blocking_Programs.htm 但如这个所说, 在运行中无法更改是预期行为. 我想驱动应该有一种方法来获取这部分程序, 我们应该寻找的解决方案可能是在显卡切换时, 避免这些程序被识别到从而被更改, 不知道NVIDIA能不能加个白名单之类功能的hhh

感谢你的链接地址,我去给他们加上引用。现在 WPF 这边是按闹分配资源的,所以链接多了,说不定就有更多资源好投入了

@ShiinaRinne
Copy link
Contributor

我看powertoys甚至都有这个问题, 提了好几个了, 看微软会不会出个大佬修修

@ShiinaRinne
Copy link
Contributor

QL-Win/QuickLook#1126 microsoft/PowerToys#31825 microsoft/PowerToys#14677 Eugeny/tabby#657 (comment) 翻了一下确实有些相关的东西.
https://www.nvidia.com/content/Control-Panel-Help/vLatest/en-us/mergedProjects/nv3d/Closing_Blocking_Programs.htm 但如这个所说, 在运行中无法更改是预期行为. 我想驱动应该有一种方法来获取这部分程序, 我们应该寻找的解决方案可能是在显卡切换时, 避免这些程序被识别到从而被更改, 不知道NVIDIA能不能加个白名单之类功能的hhh

感谢你的链接地址,我去给他们加上引用。现在 WPF 这边是按闹分配资源的,所以链接多了,说不定就有更多资源好投入了

啊这, tabby那边不是wpf的问题, 只是找到了个可能有点用的相关信息...

@lindexi
Copy link

lindexi commented Jun 25, 2024

我看powertoys甚至都有这个问题, 提了好几个了, 看微软会不会出个大佬修修

我估计要 NVIDIA 的大佬哩

由于 WPF 底层使用 DX 进行渲染,此时可能就被 NVIDIA 通过加载模块,或者是调用函数识别为游戏进程之类的。如果是这样的话, 有可能确实不能切换,否则可能遇到丢失设备等问题导致应用程序挂掉

@Teiii14
Copy link
Author

Teiii14 commented Jun 25, 2024

@ShiinaRinne @lindexi 感谢你们,之后有什么方法要测试的我可以帮忙

@lindexi
Copy link

lindexi commented Jun 25, 2024

@Teiii14 我有两个测试应用,还请你帮忙测试一下:

  1. 空 WPF 应用

这是我编写的空 WPF 应用,还请帮忙测试一下,看看是否空 WPF 都能复现问题:

下载地址 (下载失败还请右击复制链接到下载器下载)

下载之后解压缩,双击 EmptyWPF.exe 打开看看效果

应用的代码: https://github.com/lindexi/lindexi_gd/blob/831156070b218d0186e6d44e0307b2bc9962a167/EmptyWPF

  1. 空 D2D 应用

下载地址: D2D.zip

下载之后解压缩,双击 D2D.exe 打开看看效果

应用代码: https://github.com/lindexi/lindexi_gd/tree/66f9fe05baba8ad30495069aebd447b160484215/CedageawhakairnerewhalNaibiferenagifee

我预期以上两个应用都能复现问题

@Teiii14
Copy link
Author

Teiii14 commented Jun 25, 2024

@lindexi 在我这里还是不行,甚至第一个程序自己都会出现这个问题

@Teiii14
Copy link
Author

Teiii14 commented Jun 25, 2024

@lindexi
afc83c318b3bc2ec0d4258fb1917b43
0ba6c4f38c5d8f1aa3df927c7c74805

@lindexi
Copy link

lindexi commented Jun 25, 2024

@Teiii14 特别感谢,通过这两个小测试应用可以确定这个问题和 v2rayN 没有关系。如果你能单独测试第二个程序,即“空 D2D 应用”的话,那可以继续排除 WPF 框架部分的关系

@Teiii14
Copy link
Author

Teiii14 commented Jun 25, 2024

@lindexi 单独第二个程序没有出现问题。但是我认为问题还是在v2rayN或者v2rayN使用的某些代码。因为在我用的绝大多是软件都没出现这个问题,唯独v2rayN还有一些其他的软件。我想这些程序应该是有触发了显示模式无法自动切换的共同点,或许是WPF,也或许是软件里存在什么与英伟达冲突而产生冲突

@Teiii14
Copy link
Author

Teiii14 commented Jun 25, 2024

@lindexi 神奇的是这个问题只出现在自动模式上面,而我进行手动独集显切换是没有任何问题的,我在想是不是v2rayN等之类的软件的权限要高于英伟达自动切换模式,仅次于系统和用户,导致显示模式切换被这些程序阻止。因为用户具有绝对高的权限,而软件不一定

@Teiii14
Copy link
Author

Teiii14 commented Jun 25, 2024

@lindexi 然后我觉得我们可以排除“程序正在调用独显时英伟达时不会切换显示模式”这种情况,一是当独立显卡有进程时,依旧可以切换至集显模式,无论自动还是手动。二是v2rayN本身并没有调用英伟达独立显卡。

@lindexi
Copy link

lindexi commented Jun 26, 2024

@lindexi 单独第二个程序没有出现问题。但是我认为问题还是在v2rayN或者v2rayN使用的某些代码。因为在我用的绝大多是软件都没出现这个问题,唯独v2rayN还有一些其他的软件。我想这些程序应该是有触发了显示模式无法自动切换的共同点,或许是WPF,也或许是软件里存在什么与英伟达冲突而产生冲突

你的猜测是很有道理的。但是这部分比较广泛,不太好直接定位到问题。也有可能是 英伟达 自己挖了什么坑,刚好咱掉进去而已

@lindexi
Copy link

lindexi commented Jun 26, 2024

@lindexi 然后我觉得我们可以排除“程序正在调用独显时英伟达时不会切换显示模式”这种情况,一是当独立显卡有进程时,依旧可以切换至集显模式,无论自动还是手动。二是v2rayN本身并没有调用英伟达独立显卡。

第二点是有点迷的,因为除了直接调用之外,不排除驱动层间接帮忙调用了之类的。这个我不知道可以如何入手进行调查

@lindexi
Copy link

lindexi commented Jun 26, 2024

@lindexi 单独第二个程序没有出现问题。但是我认为问题还是在v2rayN或者v2rayN使用的某些代码。因为在我用的绝大多是软件都没出现这个问题,唯独v2rayN还有一些其他的软件。我想这些程序应该是有触发了显示模式无法自动切换的共同点,或许是WPF,也或许是软件里存在什么与英伟达冲突而产生冲突

那是一个坏消息,很可能是 wpf 的 gfx 层,即渲染层,踩到某个坑了,这一层比较庞大,可能需要上点二分的方法了

@Teiii14
Copy link
Author

Teiii14 commented Jun 26, 2024

@lindexi @ShiinaRinne 不知道是否可以联系上Project X的人,看看他们会不会管这种小问题

@lindexi
Copy link

lindexi commented Jun 26, 2024

@lindexi @ShiinaRinne 不知道是否可以联系上Project X的人,看看他们会不会管这种小问题

我没有这个渠道的联系方式

@ShiinaRinne
Copy link
Contributor

@lindexi @ShiinaRinne 不知道是否可以联系上Project X的人,看看他们会不会管这种小问题

xray那边吗?某个群倒是能找到,但他们应该不管这个

@Teiii14
Copy link
Author

Teiii14 commented Jun 26, 2024

@lindexi @ShiinaRinne 不知道是否可以联系上Project X的人,看看他们会不会管这种小问题

xray那边吗?某个群倒是能找到,但他们应该不管这个

能否提供一下,我去找他们。问题毕竟是出现在这个软件上

@lindexi
Copy link

lindexi commented Jun 26, 2024

@Teiii14 根据咱的测试,空 WPF 应用也能复现问题,有可能这个问题到我这一层或者更下层就够了。我认为找他们可能兜兜转转最后还是回到我这里哈

@lindexi
Copy link

lindexi commented Jun 27, 2024

@Teiii14

有空再来试试这个测试程序,这是开了进程级软渲染的空 WPF 应用:

下载地址 (下载失败还请右击复制链接到下载器下载)

应用的代码: https://github.com/lindexi/lindexi_gd/blob/d73b650dcb7109966eb8619acc36f8bba54cf2a2/EmptyWPF

预期是这个应用能够正常。

如这个应用不能复现问题,那就是任何触碰到硬件加速的模块都被标记,估计只有在开启渲染之前进入软渲染模式才能规避

如这个应用也能复现,则可能问题就在 D3D 相关模块,任何触碰 D3D 的 3D 模块都会被标记,这就只能等 N 的大佬来解决了

@ShiinaRinne
Copy link
Contributor

https://github.com/2dust/v2rayN/pull/3493/files#diff-96773009aed874ddc50e8da8fb0d2a82ba83e862fb01c323de31a8e573bbadfdR203

现在 v2rayN 的关闭硬件加速功能就是通过 RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; 实现的,这两个有什么不一样的地方吗,比如 开启渲染之前进入软渲染模式?

@lindexi
Copy link

lindexi commented Jun 27, 2024

@ShiinaRinne 我正是发现了这一点才写了以上的测试应用。这是因为 https://github.com/2dust/v2rayN/pull/3493/files#diff-96773009aed874ddc50e8da8fb0d2a82ba83e862fb01c323de31a8e573bbadfdR203 已经在碰触 D3D 模块之后再开启软渲染

此时已经经过了很多初始化逻辑了。为了减少这部分影响,我就尝试在 App 构造函数里面做,在构造函数进行配置,尝试规避碰触 D3D 模块带来的影响

我担心的问题是一旦碰触 D3D 模块的硬件渲染部分模块,将会给到 N 一个信号,导致后续即使切换为软渲染也不会被清理掉此信号,从而导致了此问题

@ShiinaRinne
Copy link
Contributor

受教了,一直没想到过这个。
我之前搞的空程序也只是新建了一个项目就直接打包,想着既然已经尝试过关闭硬件加速,那应该不是这个设置相关的问题,没想到还可能有这些原因

@lindexi
Copy link

lindexi commented Jun 27, 2024

@ShiinaRinne 这也是猜测的,毕竟不知道 N 内部的实现

@Teiii14
Copy link
Author

Teiii14 commented Jun 27, 2024

@lindexi 还是出现问题
image

@lindexi
Copy link

lindexi commented Jun 27, 2024

@Teiii14 感谢测试。看起来这个问题很棘手了。似乎任何有初始化 D3D 相关的模块,都会导致此问题,需要英伟达来解决了

@Teiii14
Copy link
Author

Teiii14 commented Jun 27, 2024

@lindexi 这该怎么反馈给他们,感觉好麻烦

@ShiinaRinne
Copy link
Contributor

等个一年半载之类的hhh

@lindexi
Copy link

lindexi commented Jun 27, 2024

@lindexi 这该怎么反馈给他们,感觉好麻烦

@Teiii14 我没有英伟达的内部反馈渠道,走外部渠道的话,预计很难会有资源来修这个问题。我在找找其他伙伴帮忙中

@2dust
Copy link
Owner

2dust commented Jun 27, 2024

感谢各位

@ShiinaRinne
Copy link
Contributor

https://nvidia.custhelp.com/app/answers/detail/a_id/5097/
By default, a pre-qualified list of applications in allow list for Advanced Optimus will trigger an internal display switch. Users will have the option to change these settings using ‘Global Settings’ or ‘Program Settings’ under ‘Automatic Display Switching’ in the ‘Manage 3D settings’ page of the NVIDIA control panel.

image
对了, 你试过在这里手动为 v2rayN 指定集显或独显吗 @Teiii14
翻了翻其他 issue 好像没看见有人改过这里

@Teiii14
Copy link
Author

Teiii14 commented Jun 30, 2024

@ShiinaRinne 我试过的,改成独显或者集显都没用。
image

@lindexi
Copy link

lindexi commented Jul 1, 2024

有位微软的大佬和我分析说可能是在某些设备上,走了 D3D9On12 这条路,走这条路线的话,底层全统一进入了 Dx12 入口层,此时预期是不会有问题的。在有问题的设备上,很可能是直接 DX9 的入口层对到 N 卡驱动层,而 N 卡图省事,就直接简单判断 DX9 入口进来的就不给切

额外说的是一旦走了 D3D9On12 这条路,那么 DX9 只是一个 API 层而已,底层全统一进入的都是 DX12 入口层。而根据 #5255 (comment) 测试结果,看起来走 DX12 入口层是没有问题的

可能的测试步骤是调试一下,看渲染层是否走了 D3D9On12 这条路

上图是我画的示意图,但由于调查是否走了 d3d9on12.dll 可能需要捞 dump 或用其他工具,相对来说比较麻烦,我先继续找找周边看有没有设备

也许可以使用 https://github.com/narzoul/ForceD3D9On12 项目来辅助测试

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

5 participants