Información procesador, velocidad. Visual Basic 2013

Iniciado por Tazmania40, 31 Octubre 2016, 10:39 AM

0 Miembros y 1 Visitante están viendo este tema.

Tazmania40

Buenas a todos/as, quería saber si hay alguna manera sencilla de saber el tipo de procesador y velocidad de este para asignar la información a una variable (integer) por ejemplo y así poder aumentar la velocidad o disminuir de un juego que estoy programando.
Busco código o información para Windows Forms. El tema de WMI (Windows Management Instrumentation) no lo entiendo y aparecen errores en ejemplos de Microsoft.

Si puede ser como digo algo sencillo del tipo...

Código (vb.net) [Seleccionar]

MsgBox(My.Computer.Info.OSVersion)
MsgBox(My.Computer.Info.OSPlatform)
...


Naturalmente sin utilizar DirectX. Seguiré buscando por si veo algo que me convenza, si lo encuentro lo pondre aquí el código.

Gracias y saludos

Tazmania40

#1
Buenas ya he encontrado algo que está bastante bien, para aplicarlo como una especie de contadores de precisión, para ello utilizo la clase Stopwatch "Proporciona un conjunto de métodos y propiedades que puede usar para medir el tiempo transcurrido con precisión". Aqui está donde lo he sacado y un ejemplo para mi juego.

https://msdn.microsoft.com/es-es/library/system.diagnostics.stopwatch(v=vs.110).aspx

Código (vb.net) [Seleccionar]

Private Tiempo As New Stopwatch
Private ContaT as Short = 0
Private CPU As Short = 1                          ' Distintos tipos de velocidad (defecto)

' Rutina
Dim TS As TimeSpan                                ' Representa un intervalo de tiempo
ContaT += 1                                       ' Comenzamos el contador
If ContaT = 1000 Then Tiempo.Start()              ' Inicia tiempo para intervalo
If ContaT = 4000 Then
   Tiempo.Stop()                                 ' Detiene tiempo para intervalo
   TS = Tiempo.Elapsed                           ' Tiempo transcurrido (hh:mm:ss:mm..)
   Select Case Val(TS.Seconds)                   ' Intervalo en segundos
       Case Is < 15 : CPU = 1                    ' Determinamos las distintas velocidades
       Case 15 To 24 : CPU = 2
       .....
   End Select
End If


Podemos realizar en el juego una especie de test para saber la velocidad con la que inicia o bien en la primera partida (yo analizo los primeros 30 segundos), lo he comprobado varias veces y asi determinamos en una variable llamada CPU la velocidad del juego. Con esa variable podemos aumentar el movimiento de los Objetos y el scroll horizontal del fondo de pantalla para que en cualquier tipo de procesador se ajuste casi al mismo tipo de velocidad y no de ventajas (por moverse más lentamente). La información la podemos guardar en un archivo de configuración para no tener que realizarlo más en ese equipo.

Si alguien se le ocurre algo mejor, pero esto de momento me vale para la velocidad y para las animaciones de los objetos, puesto que utilizo estos contadores donde puedo darles una precisión.

Saludos


Eleкtro

#2
Cita de: Tazmania40 en 31 Octubre 2016, 20:14 PMPodemos realizar en el juego una especie de test para saber la velocidad con la que inicia o bien en la primera partida (yo analizo los primeros 30 segundos), lo he comprobado varias veces y asi determinamos en una variable llamada CPU la velocidad del juego.

Hola.

Medir el intervalo de tiempo necesario para el transcurso de la fase startup de una aplicación no puede determinar así mismo la velocidad de la CPU, sino más bien conseguir una aproximación de la saturación de operaciones I/O que exista en ese momento, es decir, durante el análisis que efectua tu algoritmo del Stopwatch (y sólo en ese momento). Mi recomendación: no sigas usando esa metodología para el objetivo que esperas conseguir.

Recurriendo a W.M.I, como ya has mencionado, concretamente a los miembros de la class Win32_Processor, puedes determinar la velocidad actual y la máxima velocidad de la CPU, pero no esperes poder determinar la velocidad de cada núcleo por individual ni tampoco obtener un valor demasiado fiel a la realidad usando W.M.I ...en ciertas circunstancias. Abajo te dejo dos ejemplos de uso, verás que es algo más sencillo de lo que creias en un principio.

Para obtener resultados estadísticos de calidad, necesitas recurrir obligatoriamente a C/C++ (que no C#), u otro lenguaje low-level capaz. Existe una API gratuita de Intel para tal propósito, desarrollada en C/C++, cuyas funciones siempre puedes importar en .NET mediante P/Invoking, pero no recuerdo el nombre de la API y desconozco si pueda tener limitaciones de uso sólo para procesadores de Intel. También existe otra API gratuita más "global" por así decirlo, la cual sirve para obtener información estadística del procesador ...de los procesadores soportados quiero decir, lamentablemente tampoco recuerdo el nombre de la API, pero se debería poder encontrar de forma sencilla en Google si le dedicases unos minutos de búsqueda.

Current CPU Speed:
Código (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Gets the current speed of the current CPU, in MHz.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <example> This is a code example.
''' <code>
''' Dim cpuSpeed As String = String.Format("{0} Mhz.", GetCurrentProcessorSpeed)
''' </code>
''' </example>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' The current speed of the current CPU, in MHz.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
Private Shared Function GetCurrentProcessorSpeed() As Integer

   Dim scope As New ManagementScope("root\CIMV2")
   Dim propertyName As String = "CurrentClockSpeed"
   Dim query As New SelectQuery(String.Format("SELECT {0} FROM Win32_Processor", propertyName))
   Dim options As New EnumerationOptions With {
       .ReturnImmediately = True,
       .Rewindable = False,
       .DirectRead = True,
       .EnumerateDeep = False
   }

   Using wmi As New ManagementObjectSearcher(scope, query, options)
       Using objCol As ManagementObjectCollection = wmi.Get
           Using obj As ManagementObject = DirectCast(objCol(0), ManagementObject)
               Return CInt(obj.Properties(propertyName).Value)
           End Using
       End Using
   End Using

End Function


Max CPU Speed:
Código (vbnet) [Seleccionar]

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Gets the maximum speed of the current CPU, in MHz.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <example> This is a code example.
''' <code>
''' Dim cpuSpeed As String = String.Format("{0} Mhz.", GetCurrentProcessorSpeed)
''' </code>
''' </example>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' The maximum speed of the current CPU, in MHz.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
Private Shared Function GetMaxProcessorSpeed() As Integer

   Dim scope As New ManagementScope("root\CIMV2")
   Dim propertyName As String = "MaxClockSpeed"
   Dim query As New SelectQuery(String.Format("SELECT {0} FROM Win32_Processor", propertyName))
   Dim options As New EnumerationOptions With {
       .ReturnImmediately = True,
       .Rewindable = False,
       .DirectRead = True,
       .EnumerateDeep = False
   }

   Using wmi As New ManagementObjectSearcher(scope, query, options)
       Using objCol As ManagementObjectCollection = wmi.Get
           Using obj As ManagementObject = DirectCast(objCol(0), ManagementObject)
                Return CInt(obj.Properties(propertyName).Value)
           End Using
       End Using
   End Using

End Function


Saludos!