AI 富有四海,但却没有品味
如图所示,是 drill 的系统栏托盘图标。默认的托管图标,只能通过 tray.set_title 设置一个 title,只有一行,要显示两行,没有这个接口。
但 ClashX 明明实现了两行网速展示,它是怎么实现的?
本质上,ClashX 是在不停地重绘托盘图标,它的图标是动态生成的。
既然 ClashX 可以这么干,我也可以,没有理由我用了 Rust 语言开发,对系统的控制能力就短一截。很快,实现了,但是,图是糊的,为什么?
怎么看也不清晰,还有,图标存在跳动。这又为什么?
图标跳动是因为宽度不固定,当网速文本不同的时候,就会跳动。当我把宽度固定的时候,还是跳动?为什么?因为字体不是等宽的,我把字体换成等宽字体,不抖了,但狭小的空间又不紧凑了。怎么办?还得改回非等宽字体,但要通过!format 把绘制区域的宽度给固定下来。这个问题终于解决了,在对比字体的时候,由于选择了一个比较清晰的字体,图标糊的状况也附带解决了。
随之而来的还有一个问题,就是图标会抖动,也不是一直抖,偶尔会抖一下,很影响观感。为什么?
为了避开实时计算影响渲染,我将图标的计算,和 tray.set_icon 强行分开了。本来项目就引入了 tokio,于是开辟一个通道,计算好了,往通道里塞;另一端,定时从通道里取,取出图片调用 set_icon。这个计算与渲染分离的方案,在游戏开发中很普遍,但用在这里屁用没有。
经过进一步调查,发现抖动与一个方法 set_icon_as_template 的调用有关,去掉这个方法就不抖动了。但去掉这个方法,图标会变灰。变灰好办,我们可以用图标的颜色通道去掉,只留 alpha 通道,单独存为一个 icon_template 图片,将此图片用作托盘图标,效果不灰了,也不抖动了,问题完美解决了。
之前使用 tokio(异步类库)改写的渲染方式,还需要改回来吗?不需要!这种分离渲染的方式,表面看起来有点多余,但其实是正确的,当系统资源不足的时候,非常不足,也不会影响它的渲染。
好,这就是一个小托管图标的问题解决与优化过程。从这里我们可以看出来,AI 是什么都 知道的,可以有富有四海,但它没有口味,它不知道如何取舍。当我指出计算与渲染分离,使用 tokio 进行异步渲染的时候,它立马就明白了我的意图;但是,如果我不说,它不这么做。还有只有 alpha 通道的 template 图片,我告诉 AI,生成一张这样的图片,它马上生成并使用了,但我不说,它宁肯让图标是灰色的,也不会主动改变。或许在 AI 眼里,灰色也是漂亮的。我这样想不对,其实 AI 没有感觉,不存在灰色、白色哪个好看的问题。
看吧,AI 富有四海,知道一切,但它没有口味,不知道如何选择,在可行性验证通过的情况下,对诸多方案的选择,AI 的选择可能是随机的。选择,必须由我们人类把握。
bye,就说这么多吧。有了 AI,或许写程序没那么难了,但要写好,仍然是需要知道许多东西的;尤其要见过许多程序,见过许多世面。我是幸运的,我知道的多,但不精,我不精的地方,AI 全给我补足了。这个时代,视野要打开,就是要多涉猎。
就聊这么多,下次再聊。
📅 2025 年 12 月 19 日周五

该文由 rustpress 编译。
评论