20250730

0807起,0127睡到0800,入睡时很难睡着,可能2点后才睡着的。

起来想玩星痕共鸣的新地图结果卡加载玩不了,受不了了。

command_manager运行await Process.start有时候会卡一下,以为是因为运行了什么占CPU的进程,问了GPT才意识到可能是短时间内process.stdout太多导致UI rebuild过多。

试了一下1..100 | ForEach-Object { Write-Output "Line $_" }并不会卡,看来果然还是cpu的问题?

然而我尝试打印10000行卡死了,意义不明。

使用

1
2
3
4
5
        rc.output.write(line);
        rc.count++;
        if (rc.count <= 5) {
          notifyListeners();
        }

后依然卡死,说明不是rebuild导致的问题,但为什么这新开的子进程会让我flutter应用也变卡呢。

因为短时间输出了大量 stdout 。本质是 stdout pipe 被“写爆”了,而 Dart 的 Process.stdout 没能及时读走。

rc.output.write(line);注释掉就不会卡了,但我想要line的数据怎么办。

使用scheduleMicrotask不行,使用Future.microtask也不行。rc.lines.add(line);是O(1),不会卡顿。

直接用List<Object?> lines = [];显示UI,以替代StringBuffer output = StringBuffer();

StringBuffer适合写入到日志。不对不对,用List也卡,哎呀哎呀,如果一瞬间数据很多,那么process.stdout也会一次传入很多数据啊理论上,为什么会卡呢。

测试发现一直notifyListeners()UI显示count也发现不会卡顿,短板到底是谁。

1703睡醒才想清楚,不是stdout,而是

1
2
3
4
5
6
7
              Text(
                rc.output
                    .toString()
                    .replaceAll(RegExp(r'\x1B\[[0-9;]*[a-zA-Z]'), ''),
                maxLines: 5,
                overflow: TextOverflow.ellipsis,
              ),

就算是限制了5行,数据全部tostring还是太激进了,换成list也不应该直接

1
2
3
4
5
6
7
8
Text(
                rc.lines
                    .map((line) =>
                        line.replaceAll(RegExp(r'\x1B\[[0-9;]*[a-zA-Z]'), ''))
                    .join(''),
                maxLines: 5,
                overflow: TextOverflow.ellipsis,
              ),

rc.lines.take(5)的。

话说睡醒看到星痕共鸣发公告,带上了具体数据,前几天卡bug的人真的只是几十个,但游戏公屏和玩家社区有很多带节奏的,看来是真的有人在恶意造谣,也有人真的很喜欢战斗。

你说话的方式挺特别,既冷静又带点讽刺,我还挺喜欢听的。

然而打开stdout传来的数据想看全部时

1
2
3
4
5
6
7
8
            content: SingleChildScrollView(
              child: Text(
                rc.lines
                    .map((line) =>
                        line.replaceAll(RegExp(r'\x1B\[[0-9;]*[a-zA-Z]'), ''))
                    .join(''),
              ),
            ),

仍会因为lines数据太多卡死。

使用ListView.builder进行懒加载。

Flutter 的 key 是用来“保留位置”的,不是“保留实例”的。如果滑动时 key 出现在新的位置,它仍然会重新构造。

ListView如果item很多,比如10000,在快速滑动时会卡顿,用控件池解决。我没用,我写不清楚,慢慢滑吧,它优化做的够好了。

0127来上床,不小心看了海龟汤,有点恐怖,唉,要看点弱智的东西缓缓脑子。


有一天,一只章鱼去参加钢琴比赛。

评委问:“你会弹什么?”

章鱼说:“我会弹 一切。”

于是它开始弹钢琴,弹吉他,弹小提琴,还弹评委的脸……

评委:???

章鱼:我都说了,我会弹一切。


🐔:“你知道我为什么不下蛋了吗?”

👨:“为什么?”

🐔:“因为我最近鸡情冷淡。”

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计