5

迷惑な点滅なしで画面がリフレッシュ/クリアされるコンソールゲームを見たことがあります。私は多くの解決策を試しましたが、今のところ得たものは次のとおりです。

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);
}  

それでも、最小限のまばたきをしています。誰にもアイデアはありますか?

4

3 に答える 3

5

これが発生する理由は、コンソール画面をクリアしてから実際に描画するまでの間にディスプレイが更新されるためです。通常、これは非常に速く発生するため、目にすることはありませんが、適切なタイミングで実行すると、ちらつきが発生することがあります。

優れたオプションの 1 つは、コンソール画面と同じサイズと幅のオフスクリーン バッファーを作成し、そこですべてのテキスト出力と更新を行い、WriteConsoleOutput. スクリーン バッファには、コンソールと同じ形式のテキストと属性情報の両方を保持する必要があることを考慮してください。

BOOL WINAPI WriteConsoleOutput(
  _In_     HANDLE hConsoleOutput,
  _In_     const CHAR_INFO *lpBuffer,
  _In_     COORD dwBufferSize,
  _In_     COORD dwBufferCoord,
  _Inout_  PSMALL_RECT lpWriteRegion
);
于 2013-04-21T13:39:34.103 に答える
4

ダブルバッファリングと同等のことをしたい。CreateConsoleScreenBuffer および SetConsoleActiveScreenBuffer api 呼び出しを使用して、オフスクリーン バッファーを変更し、悪い昔のようにバッファーを切り替えることができます :) 方法を説明する記事は次のとおりです: http://msdn.microsoft.com/en-us/ライブラリ/ウィンドウ/デスクトップ/ms685032%28v=vs.85%29.aspx

于 2013-04-22T21:38:10.840 に答える
-2

ダブルバッファリングを探している

于 2016-08-23T20:27:59.367 に答える