📄 compinfo.cpp
字号:
#include "compinfo.h"
#include "../global.h"
#include <gl/gl.h>
////////////////////////////////////////////////////////////////////////////
GcCompchar::GcCompchar()
{
// Get the computer's cabaplities and speed
cpuSpeed = GetCPUSpeed();
cpuCaps = GetCPUCaps();
hasMMX = (GetCPUCaps() & CPU_FEATURE_MMX) != 0;
GetWindowsVersion();
GlobalMemoryStatus(&meminfo);
}
////////////////////////////////////////////////////////////////////////////
GcCompchar::~GcCompchar()
{
}
////////////////////////////////////////////////////////////////////////////
int GcCompchar::GetCPUSpeed(void)
{
DWORD dwFeatures;
DWORD dwStartTime;
DWORD dwStopTime;
__int64 i64StartTicks;
__int64 i64EndTicks;
__int64 i64TotalTicks;
int iSpeed;
// Get the capabilities of the cpu.
dwFeatures = GetCPUCaps();
// The rdtsc instruction must be available.
if ( !( dwFeatures & CPU_FEATURE_RDTSC ) )
return -1;
// Get the start time.
dwStartTime = timeGetTime();
//
// Wait for a new millisecond to start.
//
do
{
dwStopTime = timeGetTime();
}
while ( ( dwStopTime - dwStartTime ) == 0 );
// Use the new start time.
dwStartTime = dwStopTime;
//
// Get the start tick count.
//
__asm
{
//
// Save registers.
//
push eax
push ebx
push edx
//
// Get the tick count.
//
rdtsc
lea ebx, i64StartTicks
mov [ebx], eax
mov [ebx + 4], edx
//
// Restore registers.
//
pop edx
pop ebx
pop eax
}
//
// Loop till time磗 up.
//
while ( true )
{
// If one second is over ...
if ( ( timeGetTime() - dwStartTime ) >= 1000 )
{
//
// ... get the end tick count.
//
__asm
{
//
// Save registers.
//
push eax
push ebx
push edx
//
// Get the tick count.
//
rdtsc
lea ebx, i64EndTicks
mov [ebx], eax
mov [ebx + 4], edx
//
// Restore registers.
//
pop edx
pop ebx
pop eax
}
break;
}
}
// Calculate the difference in clock ticks.
i64TotalTicks = i64EndTicks - i64StartTicks;
// Calculate the speed in Mhz.
iSpeed = (int)(i64TotalTicks / 1000000);
// Return the speed in Mhz.
return iSpeed;
}
////////////////////////////////////////////////////////////////////////////
DWORD GcCompchar::GetCPUCaps(void)
{
SYSTEM_INFO si;
DWORD dwFeatures;
// Assume no features are present.
dwFeatures = 0;
// Get the system information.
GetSystemInfo(&si);
// If this is at least a pentium or compatibel ...
if (si.dwProcessorType != PROCESSOR_INTEL_386 &&
si.dwProcessorType != PROCESSOR_INTEL_486)
{
//
// ... get the features.
//
__asm
{
//
// Save registers.
//
push eax
push ebx
push ecx
push edx
//
// Get the features.
//
mov eax, 1
cpuid
mov dwFeatures, edx
//
// Restore registers.
//
pop edx
pop ecx
pop ebx
pop eax
}
}
// Return the features.
return dwFeatures;
}
////////////////////////////////////////////////////////////////////////////
void GcCompchar::GetWindowsVersion()
{
// Set the size of the struct
osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
// Get the version
GetVersionEx(&osinfo);
}
////////////////////////////////////////////////////////////////////////////
void GcCompchar::LogCompCharac()
{
/* Write the CPU stat to the log file */
g_Debug->Log("----------------- System -------------------\n");
// Check for OS version
if((osinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (osinfo.dwMajorVersion == 4)
&& (osinfo.dwMinorVersion == 0))
{
g_Debug->Log("Windows 95 %s %d\n", osinfo.szCSDVersion, osinfo.dwBuildNumber);
}
else if((osinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (osinfo.dwMajorVersion == 4)
&& (osinfo.dwMinorVersion > 0))
{
g_Debug->Log("Windows 98 %s %d\n", osinfo.szCSDVersion, osinfo.dwBuildNumber);
}
else if(osinfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
g_Debug->Log("Windows NT %d %s %d\n", osinfo.dwMajorVersion, osinfo.szCSDVersion, osinfo.dwBuildNumber);
}
else
{
g_Debug->Log("Unidentified OS: %d %d %d %s %d\n", osinfo.dwPlatformId, osinfo.dwMajorVersion,
osinfo.dwMinorVersion, osinfo.szCSDVersion, osinfo.dwBuildNumber);
}
// Write memory info to the log
g_Debug->Log("\nPhysical memory: %d Mb\n", meminfo.dwTotalPhys / 1024 / 1024);
g_Debug->Log("Available memory: %d Mb\n", meminfo.dwAvailPhys / 1024 / 1024);
g_Debug->Log("Virtual memory: %d Mb\n", meminfo.dwTotalVirtual / 1024 / 1024);
g_Debug->Log("Available memory: %d Mb\n\n", meminfo.dwAvailVirtual / 1024 / 1024);
// Write the cpu info to the log file
g_Debug->Log("CPU Speed: %d MHz\n", cpuSpeed);
if(cpuCaps & CPU_FEATURE_MMX) {
g_Debug->Log("MMX: Yes\n");
}
else {
g_Debug->Log("MMX: No\n");
}
if(cpuCaps & CPU_FEATURE_RDTSC) {
g_Debug->Log("RDTSC: Yes\n");
}
else {
g_Debug->Log("RDTSC: No\n");
}
// Write the open gl info to the logfile
g_Debug->Log("\nOpenGL Vendor: ");
g_Debug->Log((char*)glGetString(GL_VENDOR));
g_Debug->Log("\n");
g_Debug->Log("OpenGL Version: ");
g_Debug->Log((char*)glGetString(GL_VERSION));
g_Debug->Log("\n");
g_Debug->Log("Graphic Card: ");
g_Debug->Log((char*)glGetString(GL_RENDERER));
g_Debug->Log("\n");
g_Debug->Log("--------------------------------------------\n\n");
}
////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -