Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Tazmania40 en 31 Octubre 2016, 10:39 am



Título: Información procesador, velocidad. Visual Basic 2013
Publicado por: Tazmania40 en 31 Octubre 2016, 10:39 am
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
  1. MsgBox(My.Computer.Info.OSVersion)
  2. MsgBox(My.Computer.Info.OSPlatform)
  3. ...
  4.  

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


Título: Re: Información procesador, velocidad. Visual Basic 2013
Publicado por: Tazmania40 en 31 Octubre 2016, 20:14 pm
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
  1. Private Tiempo As New Stopwatch
  2. Private ContaT as Short = 0
  3. Private CPU As Short = 1                          ' Distintos tipos de velocidad (defecto)
  4.  
  5. ' Rutina
  6. Dim TS As TimeSpan                                ' Representa un intervalo de tiempo
  7. ContaT += 1                                       ' Comenzamos el contador
  8. If ContaT = 1000 Then Tiempo.Start()              ' Inicia tiempo para intervalo
  9. If ContaT = 4000 Then
  10.    Tiempo.Stop()                                 ' Detiene tiempo para intervalo
  11.    TS = Tiempo.Elapsed                           ' Tiempo transcurrido (hh:mm:ss:mm..)
  12.    Select Case Val(TS.Seconds)                   ' Intervalo en segundos
  13.        Case Is < 15 : CPU = 1                    ' Determinamos las distintas velocidades
  14.        Case 15 To 24 : CPU = 2
  15.        .....
  16.    End Select
  17. 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



Título: Re: Información procesador, velocidad. Visual Basic 2013
Publicado por: Eleкtro en 1 Diciembre 2016, 15:36 pm
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.

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 (https://msdn.microsoft.com/en-us/library/aa394373%28v=vs.85%29.aspx), 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
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Gets the current speed of the current CPU, in MHz.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <example> This is a code example.
  7. ''' <code>
  8. ''' Dim cpuSpeed As String = String.Format("{0} Mhz.", GetCurrentProcessorSpeed)
  9. ''' </code>
  10. ''' </example>
  11. ''' ----------------------------------------------------------------------------------------------------
  12. ''' <returns>
  13. ''' The current speed of the current CPU, in MHz.
  14. ''' </returns>
  15. ''' ----------------------------------------------------------------------------------------------------
  16. <DebuggerStepThrough>
  17. Private Shared Function GetCurrentProcessorSpeed() As Integer
  18.  
  19.    Dim scope As New ManagementScope("root\CIMV2")
  20.    Dim propertyName As String = "CurrentClockSpeed"
  21.    Dim query As New SelectQuery(String.Format("SELECT {0} FROM Win32_Processor", propertyName))
  22.    Dim options As New EnumerationOptions With {
  23.        .ReturnImmediately = True,
  24.        .Rewindable = False,
  25.        .DirectRead = True,
  26.        .EnumerateDeep = False
  27.    }
  28.  
  29.    Using wmi As New ManagementObjectSearcher(scope, query, options)
  30.        Using objCol As ManagementObjectCollection = wmi.Get
  31.            Using obj As ManagementObject = DirectCast(objCol(0), ManagementObject)
  32.                Return CInt(obj.Properties(propertyName).Value)
  33.            End Using
  34.        End Using
  35.    End Using
  36.  
  37. End Function

Max CPU Speed:
Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Gets the maximum speed of the current CPU, in MHz.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <example> This is a code example.
  7. ''' <code>
  8. ''' Dim cpuSpeed As String = String.Format("{0} Mhz.", GetCurrentProcessorSpeed)
  9. ''' </code>
  10. ''' </example>
  11. ''' ----------------------------------------------------------------------------------------------------
  12. ''' <returns>
  13. ''' The maximum speed of the current CPU, in MHz.
  14. ''' </returns>
  15. ''' ----------------------------------------------------------------------------------------------------
  16. <DebuggerStepThrough>
  17. Private Shared Function GetMaxProcessorSpeed() As Integer
  18.  
  19.    Dim scope As New ManagementScope("root\CIMV2")
  20.    Dim propertyName As String = "MaxClockSpeed"
  21.    Dim query As New SelectQuery(String.Format("SELECT {0} FROM Win32_Processor", propertyName))
  22.    Dim options As New EnumerationOptions With {
  23.        .ReturnImmediately = True,
  24.        .Rewindable = False,
  25.        .DirectRead = True,
  26.        .EnumerateDeep = False
  27.    }
  28.  
  29.    Using wmi As New ManagementObjectSearcher(scope, query, options)
  30.        Using objCol As ManagementObjectCollection = wmi.Get
  31.            Using obj As ManagementObject = DirectCast(objCol(0), ManagementObject)
  32.                Return CInt(obj.Properties(propertyName).Value)
  33.            End Using
  34.        End Using
  35.    End Using
  36.  
  37. End Function

Saludos!