"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

소프트웨어 공학/코딩

Console.Clear()과 화면 깜빡임 문제 해결

허민영 2025. 2. 11. 20:45

1. Console.Clear()를 사용하면 화면이 깜빡이는 이유

C# 콘솔 애플리케이션을 개발할 때 Console.Clear()를 사용하여 화면을 새로 고칠 수 있다. 그러나 **사용자의 입력을 받아 화면을 지속적으로 갱신해야 하는 프로그램(예: 메뉴, 게임, UI 갱신)**에서 Console.Clear()를 반복적으로 호출하면 심각한 깜빡임 문제가 발생할 수 있다.

그 이유는 다음과 같다:

  1. 전체 화면을 삭제 후 다시 출력
    • Console.Clear()는 콘솔의 모든 내용을 지운 후 다시 그리기 때문에, 순간적으로 화면이 비어 보인다.
    • 이는 프레임이 새로 그려지는 과정에서 "깜빡이는" 효과를 유발한다.
  2. 비효율적인 렌더링 방식
    • 기존 UI를 단순히 업데이트하는 것이 아니라, 모든 요소를 처음부터 다시 출력하므로 불필요한 연산이 많아진다.
    • 특히, 선택지 이동이나 애니메이션과 같은 빠른 화면 전환이 필요한 경우 깜빡임이 더욱 심해진다.
  3. 입력 처리 시 사용자 경험 저하
    • 메뉴 선택지에서 위/아래로 이동할 때마다 Console.Clear()가 실행되면, 사용자가 자신의 선택지를 확인하기 어렵다.
    • 이는 마치 화면이 순간적으로 사라졌다가 다시 나타나는 느낌을 주어, UI가 자연스럽게 동작하지 않는 것처럼 보이게 한다.

2. Console.Clear()를 대체할 해결 방법

이 문제를 해결하기 위해 Console.Clear() 대신 기존 화면을 유지하면서 변경된 부분만 갱신하는 방식을 사용하면 된다.

해결 방법 1: Console.SetCursorPosition(0, 0) 활용

전체 화면을 지우는 대신, 커서를 맨 위로 이동하여 새 내용을 덮어쓰기하는 방식

Console.SetCursorPosition(0, 0);
Console.WriteLine("메뉴 선택:");
Console.WriteLine("-> 선택 1");
Console.WriteLine("   선택 2");
Console.WriteLine("   선택 3")
  • 장점: 화면이 깜빡이지 않으며, 빠르게 화면을 갱신할 수 있다.
  • 단점: 기존보다 출력 내용이 짧아질 경우, 남은 부분을 덮어쓰지 않으면 이전 내용이 잔상으로 남을 수 있음.

 해결 방법 2: StringBuilder를 활용한 화면 갱신

출력할 내용을 StringBuilder로 미리 생성한 후, 변경된 부분만 업데이트하는 방식

using System;
using System.Text;

class Program
{
    static StringBuilder previousScreen = new StringBuilder();

    static void Main()
    {
        while (true)
        {
            Console.SetCursorPosition(0, 0);

            // 새로운 화면을 생성
            StringBuilder newScreen = new StringBuilder();
            newScreen.AppendLine("메뉴 선택:");
            newScreen.AppendLine("-> 선택 1");
            newScreen.AppendLine("   선택 2");
            newScreen.AppendLine("   선택 3");

            // 변경된 부분만 출력
            if (!newScreen.ToString().Equals(previousScreen.ToString()))
            {
                Console.Write(newScreen.ToString());
                previousScreen = newScreen;
            }

            Console.ReadKey();
        }
    }
}
  • 장점:
    • 화면이 깜빡이지 않고 자연스럽게 갱신됨
    • 변경된 부분만 출력하므로 성능 최적화 가능
  • 단점:
    • StringBuilder를 사용하여 이전 화면과 비교하는 작업이 필요함

 해결 방법 3: Console.BufferSize 조정

버퍼 크기를 조정하여 화면을 보다 안정적으로 출력하는 방법도 있다.
이 방법은 SetCursorPosition(0, 0)과 함께 사용하면 효과적이다.

Console.SetWindowSize(80, 25); // 콘솔 창 크기 설정
Console.SetBufferSize(80, 300); // 버퍼 크기 설정 (출력 내용을 저장할 공간)
  • 장점:
    • 콘솔 창 크기가 일정하게 유지되면서, 스크롤 문제를 방지할 수 있음
    • 스크롤로 인해 화면이 깜빡이는 문제를 줄일 수 있음
  • 단점:
    • Windows 11에서는 SetBufferSize()가 정상적으로 동작하지 않는 경우가 있음
    • 창 크기보다 작은 버퍼 크기를 설정하면 오류 발생 가능

3. 최종 정리: 가장 효과적인 방법은?

빠른 UI 갱신이 필요한 경우 → SetCursorPosition(0,0)을 활용
메뉴 UI처럼 변경된 부분만 갱신하는 경우 → StringBuilder로 비교 후 출력
콘솔 크기 유지가 필요할 경우 → SetBufferSize() 설정