You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#控制台渲染速度过慢求助:自制游戏绘图库性能优化

控制台渲染性能优化方案

你的代码渲染速度慢的核心原因是频繁调用Console的颜色设置和逐字符输出——每次Console操作都会触发系统级IO,开销极大。另外渲染顺序逻辑错误,导致你实际看不到绘制内容(先绘制再清屏)。以下是针对性的优化方案:

核心优化点

  • 批量处理输出,减少Console系统调用次数
  • 避免重复设置相同的控制台颜色
  • 调整渲染流程:先清屏再绘制,消除无效操作
  • 隐藏光标减少额外开销与闪烁

修改后的代码

Console.Title = "Pyrite";
Console.CursorVisible = false; // 隐藏光标,降低闪烁和性能损耗

int winWidth = Console.BufferWidth;
int winHeight = Console.BufferHeight / 190;
char[,] screen = new char[winWidth, winHeight];
ConsoleColor[,] screenColours = new ConsoleColor[winWidth, winHeight];

// 初始化屏幕缓冲区
for(int y = 0; y < screen.GetLength(1); y++){
    for(int x = 0; x < screen.GetLength(0); x++){
        screenColours[x, y] = ConsoleColor.Green; 
        screen[x, y] = '■';
    }
}

void drawPixel(int x, int y, char character, ConsoleColor colour){
    // 边界检查,避免越界报错
    if(x < 0 || x >= winWidth || y < 0 || y >= winHeight) return;
    screenColours[x, y] = colour;
    screen[x, y] = character;
}

void drawRect(int x, int y, int width, int height, char character, bool outlineOnly, ConsoleColor colour){
    if(!outlineOnly){
        for(int j = 0; j <= height; j++){
            for(int i = 0; i <= width; i++){
                drawPixel(x + i, y + j, character, colour);
            }
        }
    }else{
        // 绘制上下边
        for(int i = 0; i <= width; i++){
            drawPixel(x + i, y, character, colour);
            drawPixel(x + i, y + height, character, colour);
        }
        // 绘制左右边(跳过已绘制的角落,减少重复操作)
        for(int j = 1; j < height; j++){
            drawPixel(x, y + j, character, colour);
            drawPixel(x + width, y + j, character, colour);
        }
    }
}

void draw(){
    Console.SetCursorPosition(0, 0); // 定位到左上角,避免不必要的屏幕滚动
    ConsoleColor currentColor = ConsoleColor.Gray; // 记录当前颜色,避免重复设置

    for(int y = 0; y < screen.GetLength(1); y++){
        for(int x = 0; x < screen.GetLength(0); x++){
            if(screenColours[x, y] != currentColor){
                currentColor = screenColours[x, y];
                Console.ForegroundColor = currentColor;
            }
            Console.Write(screen[x, y]);
        }
        Console.WriteLine(); // 换行,比手动输出'\n'更高效
    }
}

while(true){
    Console.Clear();
    drawPixel(20, 20, '■', ConsoleColor.Cyan);
    drawRect(0, 0, 25, 15, '■', true, ConsoleColor.DarkMagenta);
    draw();
    Console.ResetColor();
    // 添加小延迟,避免CPU满载,同时控制帧率(约60帧/秒)
    System.Threading.Thread.Sleep(16);
}

进阶优化建议

  1. 双缓冲区机制:准备两个屏幕缓冲区,一个后台绘制、一个前台输出,彻底消除屏幕闪烁
  2. 增量渲染:记录前后帧的差异,只重绘变化的像素区域,大幅减少输出量
  3. 颜色分段输出:将每行字符按颜色分组,拼接同颜色字符块后一次性输出,进一步减少Console调用
  4. 窗口尺寸修正:winHeight = Console.BufferHeight / 190会导致高度极小,建议改用Console.WindowHeight或合理比例计算

内容的提问来源于stack exchange,提问作者I_Suck_At_Coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:35:51