RDP 描画问题汇总
2017-03-17 本文已影响15人
李书文
Icon 描画问题
在Outlook中添加附件,附件的图标变成了黑色的方块
实验与现象:
- 当选中一个Attachment的时候,Icon可以正确描画了。究其原因是因为,此时的描画并不是由Orders来负责的,而是由另外一个PDU(Bitmap Update)来进行更新的
- 进行了一个测试,就是把一些Orders的描画动作去掉,看看在Bitmap Update后,再通过窗口的遮挡与显示来看看是否仍有问题。 测试后发现,黑色的色块应该是 MEMBLT_ORDER 画上去的。
原因:
进行了各种测试来排除到底是什么原因导致的,测试过:Bitmap Decompress(移植了FreeRDP的代码),Color Depth Translate 16to32, 24to32。但是还是一直有这个问题。
最后定位到了症结所在,MEMBLT_ORDER的XOR Operation导致了这个问题。为什么呢?因为在做XOR操作时,以前的代码把Alpha通道也一并做了操作。因为是亦或操作,一般情况下Alpha的值都是255,在做亦或操作之后都变成0了。也就导致这个区域变成了透明,而我们的Canvas的默认颜色就是黑色。所以看起来就是一个黑色的色块。
细节:
- 这个问题说起来简单,但是找起来十分麻烦。那是怎么机缘巧合找到的呢?说起来也要归功于我们Canvas的背景有公司的Logo也就是说并不是一味的都是黑色的。在调试的时候发现那个黑色的色块竟然有一部分其它颜色出现了不是纯黑色块了。这就改变了我原来的查找方向,我原来一直认为是解压缩或者转换出了问题导致整块的Bitmap Cache都解析错误了,从而展现出来的就是一个黑色的色块。但是从这个细节包括之前的测试来看,问题最终还是定位到了MEMBLT_ORDER
- 说起来还有一个细节,就是在JS单步调试的时候,我看到了一个黑色的图形出现在了图标的位置,然后才是被一个黑色色块覆盖住。那么Icon的描画方式也揭示出来了
- 先画一个纯色(Mask Color)的Icon的标志
- 再用另一个Bitmap盖在上面来画,因为有了Mask,所以Icon就可以正确描画出来并且把Icon的背景色显示出来
- 好了,根据以上的细节,这个问题最终被定位并解决掉了
IE 卡顿
在Windows Server 2008 上(10.103.220.113),发现如果打开IE浏览器之后,整个画面的更新就会变的异常的卡顿。
猜测
- 有可能是,IE浏览器上的某些部分在快速的刷新与描画导致前端无法相应如此之多的刷新