2012-12-03 24 views
5

Tôi đã thực hiện .dll mà tôi đang tiêm vào trò chơi. Nó chạy phát hiện điểm ảnh sau khi tôi nhấn alt + s nhưng lag game. Có khả năng sửa chữa nó không?Trò chơi bị lag sau khi tiêm mã của tôi

Phát hiện màu đỏ, nhấn mouse3 và trong trò chơi nó quay nhưng quá chậm và trò chơi bị chậm.

Tôi đã cố xóa Sleep() nhưng nó tụt hậu hơn. Bất kỳ đề xuất?

#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

Gọi theo cách của bạn ít thường xuyên hơn? –

Trả lời

4

Bạn không làm gì ngoài việc gọi GetPixel() trong 50 mili giây. Đó là độ trễ 50 mili giây ngay tại đó. Những gì bạn đã mong đợi?

Xóa cuộc gọi Sleep chỉ có nghĩa là bạn tụt hậu thường xuyên hơn và mỗi lần vẫn trong 50 mili giây. Điều đó cũng được mong đợi.

1

Một số điểm:

1) Vòng lặp trong suốt của bạn thật chặt và CPU chuyên sâu. Nếu bạn có một CPU hỗ trợ nó, đặt __mm_pause nội tại trong đó (::YieldProcessor()) hoặc thử ::SwitchToThread()

2) GetPixel là rất chậm IIRC ,, có thể có một cách nhanh hơn để đọc các giá trị pixel từ một HBITMAP

Các vấn đề liên quan