2013-04-21 30 views
5

Tôi đã xem một số trò chơi trên bàn điều khiển nơi màn hình làm mới/xóa chính nó mà không bị nhấp nháy gây phiền nhiễu. Tôi đã thử nhiều giải pháp, dưới đây là những gì tôi nhận được từ bây giờ:Màn hình xóa bàn điều khiển Win32 C++ mà không nhấp nháy

while(true) 
{ 
    if(screenChanged) //if something needs to be drawn on new position 
    { 
    COORD coordScreen = { 0, 0 }; 
    DWORD cCharsWritten; 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    DWORD dwConSize; 
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 

    GetConsoleScreenBufferInfo(hConsole, &csbi); 
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y; 
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten); 
    GetConsoleScreenBufferInfo(hConsole, &csbi); 
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten); 
    SetConsoleCursorPosition(hConsole, coordScreen); 
    } 

    ///printf all the time graphics on their right position with SetConsoleCursorPosition 

    Sleep(33.3f); 
} 

Tuy nhiên, tôi nhận được một số nhấp nháy tối thiểu. Ai có ý tưởng gì không?

+1

Nó có thể là các trò chơi này không được viết dưới dạng các ứng dụng giao diện điều khiển Windows, mà là ứng dụng DOS đang sử dụng các chế độ đồ họa khác nhau và viết pixel trực tiếp vào bộ nhớ đồ họa. –

+0

@Captain Đọc lại câu đầu tiên. Mã nguồn không phải dành cho "trò chơi trên bàn điều khiển" mà anh ta đã thấy, mã nguồn là những gì anh ta đã thử. –

+0

@CodyGray Rất tiếc;) –

Trả lời

4

Lý do điều này xảy ra là do màn hình làm mới giữa thời gian bạn xóa màn hình bảng điều khiển và thực sự vẽ nó. Thông thường điều này có thể xảy ra quá nhanh đến nỗi bạn không bao giờ thấy nó nhưng thỉnh thoảng bạn làm điều đó vào đúng thời điểm và bạn trải nghiệm nhấp nháy.

Một tùy chọn tuyệt vời là tạo bộ đệm ngoài màn hình với kích thước và chiều rộng tương tự như màn hình bảng điều khiển, thực hiện tất cả văn bản và cập nhật ở đó, sau đó gửi toàn bộ bộ đệm tới màn hình bảng điều khiển bằng cách sử dụng WriteConsoleOutput. Đảm bảo rằng bạn lưu ý rằng bộ đệm màn hình phải giữ cả thông tin thuộc tính và văn bản, cùng định dạng với bảng điều khiển.

BOOL WINAPI WriteConsoleOutput(
    _In_  HANDLE hConsoleOutput, 
    _In_  const CHAR_INFO *lpBuffer, 
    _In_  COORD dwBufferSize, 
    _In_  COORD dwBufferCoord, 
    _Inout_ PSMALL_RECT lpWriteRegion 
); 
+0

Đó không phải là những gì ncurses làm gì? – user1255410

+1

Không chắc chắn, tôi đã không xem xét các phần cụ thể của WinAPI của ncurses –

+4

Thuật ngữ phổ biến cho điều này là "đệm đôi". Đó là một phương pháp cổ điển để loại bỏ nhìn thấy một màn hình hiển thị một phần, trong trường hợp này là một màn hình trống. –

3

Bạn muốn làm tương đương với bộ đệm đôi. Sử dụng CreateConsoleScreenBuffer và SetConsoleActiveScreenBuffer cuộc gọi api, bạn có thể sửa đổi một bộ đệm offscreen, sau đó chuyển sang bộ đệm, giống như chúng ta sử dụng để trong những ngày cũ xấu :) Dưới đây là một bài viết giải thích như thế nào: http://msdn.microsoft.com/en-us/library/windows/desktop/ms685032%28v=vs.85%29.aspx

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