在 GPU C# 上获取 Vsync 状态

Posted

技术标签:

【中文标题】在 GPU C# 上获取 Vsync 状态【英文标题】:Get Vsync status on GPU C# 【发布时间】:2019-07-26 15:45:27 【问题描述】:

我正在开发一个 .net 核心应用程序,我需要在其中检索尽可能多的有关系统的信息。我已经设法检索了很多,但是,我正在努力找出 GPU 是否打开了 Vsync。我已经为 Nvidia GPU 尝试了 NvApi Wrapper,但无法让它工作,因为它在尝试初始化它时抛出异常(无法加载 nvapi64.dll)。最初的 NvApi 是用 C 语言编写的,仅仅为这个特定的东西制作一个 Wrapper 似乎有点太多了。我想一定有更简单的方法来获取这些信息。

我也尝试使用ManagementObjectSearcher 获取值,如下所示,但它不会返回 vsync 是否处于活动状态:

var managementObjectSearcher = new ManagementObjectSearcher("select * from Win32_VideoController");
foreach (ManagementObject obj in managementObjectSearcher.Get())

    foreach(var prop in obj.Properties)
    
        Console.WriteLine($"Name: prop.Name Value: prop.Value");
    

【问题讨论】:

@Isma 谢谢 :-) 你可以使用 DirectX 吗? @Isma 不,我试过了,但无法弄清楚 Vsync 是启用还是禁用。 您使用的是 Windows 窗体还是 WPF? @Isma 两者都不是,它是一个 .net Core 2.0 应用程序。 【参考方案1】:

我可以使用为 OpenGL 提供托管包装器的开源库 OpenTK 获得您需要的信息,有关更多信息,请参阅 here。

首先,添加兼容.net core的NuGet包:

Install-Package OpenTK.NetStandard -Version 1.0.4 

然后,您可以使用GameWindow 的实例创建一个虚拟类,您将可以访问您正在寻找的信息(以及其他信息):

public sealed class DummyInfoGameWindow : GameWindow

    private DummyInfoGameWindow() 

    public static DummyInfoGameWindow InitAndGetInfo()
    
        return new DummyInfoGameWindow();
    

然后只需从您的代码中调用静态方法:

static void Main(string[] args)

    var info = DummyInfoGameWindow.InitAndGetInfo();

    Console.WriteLine($"VSync enabled info.VSync");

    Console.Read();

输出是:

VSync enabled On

【讨论】:

以上是关于在 GPU C# 上获取 Vsync 状态的主要内容,如果未能解决你的问题,请参考以下文章

运行 powershell 命令以在 c# 上按进程获取 GPU 使用情况

我将如何从AMD GPU的显示输出中获取图像数据? [处于保留状态]

Android 图形系统(2)---- Android vsync 机制与 project buffer

iOS--性能优化--保持界面流畅

iOS性能优化

通过 Selenium WebDriver C# 获取 HTTP 状态码