Получить статус Vsync на GPU C#

#c# #.net-core #gpu #vsync

#c# #.net-core #графический процессор #vsync

Вопрос:

Я разрабатываю приложение .net Core, в котором мне нужно получить как можно больше информации о системе. Мне уже удалось многое восстановить, однако я изо всех сил пытаюсь выяснить, включен ли Vsync на GPU или нет. Я пробовал оболочку NvApi для графического процессора Nvidia, но не смог заставить ее работать, поскольку она выдает исключение при попытке ее инициализации (не удалось загрузить nvapi64.dll ). Оригинальный NvApi написан на C, и создание оболочки только для этой одной конкретной вещи кажется немного чересчур. Я думаю, должен быть более простой способ получить эту информацию.

Я также пытался получить значение, используя 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}");
    }
}
  

Комментарии:

1. @Isma Спасибо 🙂

2. Можете ли вы использовать DirectX для этого?

3. @Isma Нет, я пробовал, но не смог определить с его помощью, включена Vsync или отключена.

4. Используете ли вы Windows Forms или WPF?

5. @Isma Ни то, ни другое, это приложение на .net Core 2.0.

Ответ №1:

Я мог бы получить необходимую информацию, используя библиотеку с открытым исходным кодом OpenTK, которая предоставляет управляемую оболочку для OpenGL, дополнительную информацию смотрите здесь.

Сначала добавьте пакет NuGet, совместимый с .net core:

 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