首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Curses 庫清屏函數詳解與最佳實踐

     編輯:關於C語言

函數對照表

函數作用範圍光標行為備註
int clear(void)整個標準畫面移至 (0,0)自動呼叫 clearok(),強制下次 refresh() 重繪物理屏幕,清除 curses 無法追蹤的殘留字符
int erase(void)整個標準畫面不動僅清除 curses 內部緩衝區,**不**呼叫 clearok(),速度較快但可能留下殘影
int clrtobot(void)當前光標至屏幕底部不動包含當前行光標右側所有字符及之後所有行
int clrtoeol(void)當前光標至行尾不動僅清除當前行光標位置及右側字符
int wclear(WINDOW *win)指定窗口移至窗口 (0,0)窗口版 clear()
int werase(WINDOW *win)指定窗口不動窗口版 erase()
int wclrtobot(WINDOW *win)窗口光標至窗口底部不動
int wclrtoeol(WINDOW *win)窗口光標至窗口行尾不動

選擇指南

  • 全屏重繪、切換場景、初始化時 → clear() / wclear()(最徹底)。
  • 高頻局部更新、遊戲迴圈每幀 → erase() / werase()(無 clearok() 開銷)。
  • 狀態列、提示行覆寫 → move(y, x); clrtoeol(); 或 wmove(win, y, x); wclrtoeol(win);。
  • 從光標處清空到結尾(如刪除操作) → clrtobot() / wclrtobot()。

實戰範例:雙緩衝動畫幀清理

#include <curses.h>
#include <unistd.h>

#define WIDTH 60
#define HEIGHT 20

int main() {
    initscr(); cbreak(); noecho(); curs_set(0); keypad(stdscr, TRUE);
    nodelay(stdscr, TRUE);  // 非阻塞輸入

    WINDOW *game_win = newwin(HEIGHT, WIDTH, 2, 5);
    box(game_win, 0, 0);

    int x = 1, y = 1, dx = 1, dy = 1;
    int ch;

    while ((ch = getch()) != 'q') {
        // 1. 清除上一幀軌跡(僅清除小球區域更高效,此處示範全窗口)
        werase(game_win);
        box(game_win, 0, 0); // 重繪邊框

        // 2. 更新位置
        x += dx; y += dy;
        if (x <= 1 || x >= WIDTH-2) dx = -dx;
        if (y <= 1 || y >= HEIGHT-2) dy = -dy;

        // 3. 繪製新幀
        mvwaddch(game_win, y, x, 'O');

        // 4. 刷新
        wrefresh(game_win);
        usleep(30000); // 30ms ~ 33 FPS
    }

    delwin(game_win);
    endwin();
    return 0;
}

進階技巧

  1. 避免閃爍: 全屏動畫請使用 clearok(stdscr, TRUE) 配合 refresh(),或改用 ncurses 的 newterm/set_term 實現雙緩衝。
  2. 局部清除優化: 記錄物體外接矩形,僅對該區域呼叫 wclrtoeol 逐行清除,比 werase 快數倍。
  3. 清除屬性殘留: clear() 會重置屬性;若需保留底色/邊框屬性,先 wbkgdset(win, ' ' | COLOR_PAIR(n)) 再 werase。
  4. 跨平台注意: PDCurses (Windows) 下 clear() 可能較慢,建議統一用 werase + 手動重繪邊框/背景。

參考來源:「暗日」博客 原文連結

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved