2012-12-03 10 views
5

Ho fatto .dll che sto iniettando nel gioco. Esegue il rilevamento dei pixel dopo aver premuto alt + s ma il gioco è in ritardo. C'è qualche possibilità di risolverlo?Laggs di gioco dopo aver iniettato il mio codice

Rileva il colore rosso, preme il mouse 3 e nel gioco spara ma è troppo lento e il gioco è in ritardo.

Ho provato a rimuovere Sleep() ma è più lento. Eventuali suggerimenti?

#include <windows.h> 
#include <gdiplus.h> 

const int SX = GetSystemMetrics(SM_CXSCREEN); 
const int SY = GetSystemMetrics(SM_CYSCREEN); 

const int SCREEN_X = (SX/2); 
const int SCREEN_Y = (SY/2); 
const COLORREF red=RGB(255, 0, 0); 
const int Sound[]={SND_ALIAS_SYSTEMASTERISK,SND_ALIAS_SYSTEMEXCLAMATION}; 
const int State[]={MOUSEEVENTF_MIDDLEDOWN,MOUSEEVENTF_MIDDLEUP}; 

bool PixelCheck(HDC hdc) 
{ 
    time_t stop=GetTickCount()+50; 
    bool result=false; 
    while(GetTickCount()<stop) if(GetPixel(hdc,SCREEN_X,SCREEN_Y) == red) result=true; 
    Sleep(1); 
    return result; 
} 

DWORD WINAPI ThreadFunction(PVOID pvParam) 
{ 
    HDC hdc=GetDC(0); 
    bool shotbot=false,isdown=false; 
    INPUT ip; 
    ip.type=INPUT_MOUSE; 
    ip.mi.dx=0; 
    ip.mi.dy=0; 
    ip.mi.dwExtraInfo=0; 
    while(true) 
    { 
     if(GetAsyncKeyState(0xA4) && GetAsyncKeyState(0x53)) 
     { 
      shotbot=!shotbot; 
      PlaySound((LPCSTR)Sound[shotbot],NULL,SND_ALIAS_ID); 
     } 
     Sleep(1); 
     if((shotbot&&PixelCheck(hdc))||isdown) 
     { 
      ip.mi.dwFlags=State[isdown]; 
      SendInput(1,&ip,sizeof(INPUT)); 
      isdown=!isdown; 
     } 
    } 
    ReleaseDC(0, hdc); 
    return 0; 
} 

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) 
{ 
    if(fdwReason==DLL_PROCESS_ATTACH) SetThreadPriority(CreateThread(0,0,ThreadFunction,0,0,NULL),THREAD_PRIORITY_NORMAL); 
    return TRUE; 
} 
+0

Chiama la tua discussione meno spesso? –

risposta

4

Stai facendo altro che chiamare GetPixel() per 50 millisecondi. C'è un ritardo di 50 millisecondi proprio lì. Cosa ti aspettavi?

Rimuovere la chiamata Sleep significa semplicemente rallentare più spesso e ogni volta ancora per 50 millisecondi. Anche questo è previsto.

1

Alcuni punti:

1) Il tuo ciclo di attività è stretto e richiede molto tempo. Se si dispone di una CPU che supporta, mettere il __mm_pause intrinseca in là (::YieldProcessor()) o cercare ::SwitchToThread()

2) GetPixel è tremendamente lento IIRC ,, ci può essere un modo più veloce per leggere il valore di pixel da un HBITMAP

Problemi correlati