Перед история поиска или как я нашел строчку - это можно прочесть по желанию.
Начну с того что я как я любитель билдоман и уже вошла в привычку моя поисковая сноровка, и она меня не подвила я начал свой день с того что мне захотелось найти в исходниках X-Ray те строки которые отвечают за использование процессора и я начал эти поиски и они прошли недолго часика так за 4-5 в поиске через Notepad++ я сначала нашел вот эти подозрительные строки.
Немного посмотрев на них я подумал может это ограничение использование видео памяти но после того как я тут отписался меня в этом переубедили Пост но главное суть я понял. Немного полистав в глубь x_ray.cpp я увидел вот это:
И тут я немного погуглил и сказав не может быть начал быстренько собирать сорцы но при этом поменяв цифру 1 на 2 и был приятно удивлен мой гаджет на боковой панели показал усердное использование второго ядра, не долго думая я поставил цифру 0 и попробовав я увидел свое счастье два процессора работают и диспетчер задач показывает что xrEngine использует 70% ЦП УРА!!! Можно танцевать!!!
Клац
// Фунция для тупых требований THQ и тупых американских пользователей
BOOL IsOutOfVirtualMemory()
{
#define VIRT_ERROR_SIZE 256
#define VIRT_MESSAGE_SIZE 512
SECUROM_MARKER_HIGH_SECURITY_ON(1)
MEMORYSTATUSEX statex;
DWORD dwPageFileInMB = 0;
DWORD dwPhysMemInMB = 0;
HINSTANCE hApp = 0;
char pszError[ VIRT_ERROR_SIZE ];
char pszMessage[ VIRT_MESSAGE_SIZE ];
ZeroMemory( &statex , sizeof( MEMORYSTATUSEX ) );
statex.dwLength = sizeof( MEMORYSTATUSEX );
if ( ! GlobalMemoryStatusEx( &statex ) )
return 0;
dwPageFileInMB = ( DWORD ) ( statex.ullTotalPageFile / ( 1024 * 1024 ) ) ;
dwPhysMemInMB = ( DWORD ) ( statex.ullTotalPhys / ( 1024 * 1024 ) ) ;
// Довольно отфонарное условие
if ( ( dwPhysMemInMB > 500 ) && ( ( dwPageFileInMB + dwPhysMemInMB ) > 2500 ) )
return 0;
hApp = GetModuleHandle( NULL );
if ( ! LoadString( hApp , RC_VIRT_MEM_ERROR , pszError , VIRT_ERROR_SIZE ) )
return 0;
if ( ! LoadString( hApp , RC_VIRT_MEM_TEXT , pszMessage , VIRT_MESSAGE_SIZE ) )
return 0;
MessageBox( NULL , pszMessage , pszError , MB_OK | MB_ICONHAND );
SECUROM_MARKER_HIGH_SECURITY_OFF(1)
return 1;
}
BOOL IsOutOfVirtualMemory()
{
#define VIRT_ERROR_SIZE 256
#define VIRT_MESSAGE_SIZE 512
SECUROM_MARKER_HIGH_SECURITY_ON(1)
MEMORYSTATUSEX statex;
DWORD dwPageFileInMB = 0;
DWORD dwPhysMemInMB = 0;
HINSTANCE hApp = 0;
char pszError[ VIRT_ERROR_SIZE ];
char pszMessage[ VIRT_MESSAGE_SIZE ];
ZeroMemory( &statex , sizeof( MEMORYSTATUSEX ) );
statex.dwLength = sizeof( MEMORYSTATUSEX );
if ( ! GlobalMemoryStatusEx( &statex ) )
return 0;
dwPageFileInMB = ( DWORD ) ( statex.ullTotalPageFile / ( 1024 * 1024 ) ) ;
dwPhysMemInMB = ( DWORD ) ( statex.ullTotalPhys / ( 1024 * 1024 ) ) ;
// Довольно отфонарное условие
if ( ( dwPhysMemInMB > 500 ) && ( ( dwPageFileInMB + dwPhysMemInMB ) > 2500 ) )
return 0;
hApp = GetModuleHandle( NULL );
if ( ! LoadString( hApp , RC_VIRT_MEM_ERROR , pszError , VIRT_ERROR_SIZE ) )
return 0;
if ( ! LoadString( hApp , RC_VIRT_MEM_TEXT , pszMessage , VIRT_MESSAGE_SIZE ) )
return 0;
MessageBox( NULL , pszMessage , pszError , MB_OK | MB_ICONHAND );
SECUROM_MARKER_HIGH_SECURITY_OFF(1)
return 1;
}
Немного посмотрев на них я подумал может это ограничение использование видео памяти но после того как я тут отписался меня в этом переубедили Пост но главное суть я понял. Немного полистав в глубь x_ray.cpp я увидел вот это:
CODE
#endif
#else // DEDICATED_SERVER
g_dedicated_server = true;
#endif // DEDICATED_SERVER
SetThreadAffinityMask (GetCurrentThread(),1);
// Title window
// Картинка при старте
logoWindow = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_STARTUP), 0, logDlgProc );
HWND logoPicture = GetDlgItem(logoWindow, IDC_STATIC_LOGO);
RECT logoRect;
GetWindowRect(logoPicture, &logoRect);
SetWindowPos (
logoWindow,
#else // DEDICATED_SERVER
g_dedicated_server = true;
#endif // DEDICATED_SERVER
SetThreadAffinityMask (GetCurrentThread(),1);
// Title window
// Картинка при старте
logoWindow = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_STARTUP), 0, logDlgProc );
HWND logoPicture = GetDlgItem(logoWindow, IDC_STATIC_LOGO);
RECT logoRect;
GetWindowRect(logoPicture, &logoRect);
SetWindowPos (
logoWindow,
И тут я немного погуглил и сказав не может быть начал быстренько собирать сорцы но при этом поменяв цифру 1 на 2 и был приятно удивлен мой гаджет на боковой панели показал усердное использование второго ядра, не долго думая я поставил цифру 0 и попробовав я увидел свое счастье два процессора работают и диспетчер задач показывает что xrEngine использует 70% ЦП УРА!!! Можно танцевать!!!
Как использовать два и более ядер
Немного загуглив я нашел некую информацию как использовать больше ядер но для этого нужно пере-собирать исходники заново потому что я эту цифру 1 рядом с GetCurrentThread в пысовском движке так и не вцепил через HEX-Editor может это кому то другому удастся.
Строка в коде x_ray.cpp
Код
// Use CPU
SetThreadAffinityMask (GetCurrentThread(),1);
SetThreadAffinityMask (GetCurrentThread(),1);
Что можно подставить - спасибо другу
Код
The mask is a bitfield: each bit designate a processor. 0 means "no processor". It's not logic.
0x0001 : proc 1
0x0003 : proc 1 and 2
0x000F : proc 1, 2, 3, 4
0x0001 : proc 1
0x0003 : proc 1 and 2
0x000F : proc 1, 2, 3, 4
Так что можно сразу сделать так:
Код
// Use CPU
SetThreadAffinityMask (GetCurrentThread(),0x000F);
SetThreadAffinityMask (GetCurrentThread(),0x000F);
Будет использоваться 4 ядра и более.
Полезная ссылка по этим строкам