踏破铁鞋无觅处

最近学习Chromium的UI渲染,于是编译一下ui/views/examples的例子工程来看看。运行views_examples_exe,发现界面是上下颠倒显示。

一开始以为是例子工程可能好久没有维护了,在代码升级的过程中出了偏差,导致界面颠倒显示。于是自己动手写了一个例子工程,也是颠倒显示。看了下aura_demo工程界面的坐标,显示也是颠倒。我意识到这不是Aura层的问题,可能是CC模块通过GPU硬件加速渲染出来的结果本身就是颠倒的。

我家虚拟机里有Chromium 48的代码,运行显示是正常,目前这份Chromium 50代码却是颠倒的,然后看看Chromium 55代码,也是颠倒的。大概问题就出在Chromium 49~50之间。

很自然的就想到对比Chromium 49~50之间ui目录下的提交变化,我本地用git去对比,很慢,最后越来越卡,难以忍受。幸好https://omahaproxy.appspot.com/ 有个提交对比功能。然后在48.0.2564.109与50.0.2261.102之间比较提交差异。差异的结果太大了,很难找到有效的线索。然后又试试在https://cs.chromium.org/里面查找ui目录下对应时间段的Git Revision Log,还是没有线索。那种感觉就像你明明知道凶手就是那几个人,但是失去了最终一步的线索,无法定罪到个人。

最后只好给代码目录的OWNERS写邮件,看看他们是否知道这个问题。一开始我以为这个机会渺茫,因为看起来这个问题已经出现了一年多还是没有人去修复,是不是他们根本没有意识到这个问题。出乎意料的是Sadrul Chowdhury几分钟之后就给我回邮件:他说知道存在这个问题,还有对应的issue。

我顺着他给的issue链接https://bugs.chromium.org/p/chromium/issues/detail?id=640748 跑过去看看,确实他们2016年8月份已经知道了这个问题,遗憾的是他们好像没空去管这个。

不过他给的issue信息还有有价值的,问题确实跟CC模块有关。我顺着InProcessContextFactory看进去,use_test_surface_这个参数确实对UI的绘制有影响。实际上上下颠倒的使用的是DirectOutputSurface,它的兄弟类PixelTestOutputSurface类里面有个成员变量capabilities_.flipped_output_surface。我眼睛一亮,flipped_output_surface不就是颠倒输出界面的意思么?我马上在DirectOutputSurface里面设置一下。好吧,果然有效。

这个问题困扰了我好几天,回头看看自己走过的路,感概万千。当时就想着假如这个问题解决了,要如何回顾?我曾Google过,也曾在chromium-dev找过,也在代码里各种尝试,想尽各种可能。当看到Sadrul Chowdhury给我回的邮件,当时就猛的一拍脑袋,怎么忘记了去https://bugs.chromium.org/p/chromium/issues/list 查一查。我也反思我这种性格,心里纠结着问题非要弄清楚。

最后拼凑两句诗来描述一下现在的心情:踏破铁鞋无觅处,柳暗花明又一村。

《踏破铁鞋无觅处》有2个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注