1 提高窗口移动速度(1)(harib23a)

昨天我们增加了可同时启动的应用程序的数量,窗口也跟着变多了,整个画面变得热闹起来。

话说,在对比color.hrb和color2.hrb的时候我们需要移动窗口,那个时候笔者感到窗口移动的速度很慢。在真机环境下的速度还算可以接受,但在QEMU下就慢得离谱,让人心烦。虽说在真机环境下速度不慢就可以了,但如果速度能再快点总归是件好事。因此,提高窗口移动的速度就成了我们今天的第一个课题。

■■■■■

导致窗口移动速度慢的原因有很多,其中之一就是sheet_refreshmap的速度太慢。这个函数在sheet_slide中被调用了两次,如果能提高它的速度效果应该会很明显。

这个函数是很久之前写的,因此在修改之前我们再来看一下它的代码。

修改前的sheet.c节选

  1. void sheet_refreshmap(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0)
  2. {
  3. (中略)
  4. for (h = h0;s h <= ctl->top; h++) {
  5. (中略)
  6. for (by = by0; by < by1; by++) {
  7. vy = sht->vy0 + by;
  8. for (bx = bx0; bx < bx1; bx++) {
  9. vx = sht->vx0 + bx;
  10. if (buf[by * sht->bxsize + bx] != sht->col_inv) {
  11. map[vy * ctl->xsize + vx] = sid;
  12. }
  13. }
  14. }
  15. }
  16. return;
  17. }

怎样才能提高这个函数的速度呢?我们可以尝试将里面的if语句去掉。这个if语句位于三层for循环之中,要被执行成千上万次,因此如果能去掉这个if语句的话,速度应该会有不小的提高。

要去掉这个if语句,我们得先思考一下它的含义。这个if语句的功能是判断图层是否为透明部分,如果强行去掉它的话图层的透明部分就没有了,鼠标指针就会变成一个方块,这样可不行。但换个角度想想,窗口基本上都是矩形的,没有透明部分,如果仅去掉窗口部分的if判断是没有影响的。

因此,我们在进入bx和by的for循环之前先判断这个图层是否有透明部分,如果有透明部分的话还按现有程序执行,否则执行一个没有if语句的两层循环。

本次的sheet.c节选

  1. void sheet_refreshmap(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0)
  2. {
  3. (中略)
  4. for (h = h0; h <= ctl->top; h++) {
  5. (中略)
  6. if (sht->col_inv == -1) { /*从此开始*/
  7. /*无透明色图层专用的高速版*/
  8. for (by = by0; by < by1; by++) {
  9. vy = sht->vy0 + by;
  10. for (bx = bx0; bx < bx1; bx++) {
  11. vx = sht->vx0 + bx;
  12. map[vy * ctl->xsize + vx] = sid;
  13. }
  14. }
  15. } else {
  16. /*有透明色图层用的普通版*/
  17. for (by = by0; by < by1; by++) {
  18. vy = sht->vy0 + by;
  19. for (bx = bx0; bx < bx1; bx++) {
  20. vx = sht->vx0 + bx;
  21. if (buf[by * sht->bxsize + bx] != sht->col_inv) {
  22. map[vy * ctl->xsize + vx] = sid;
  23. }
  24. }
  25. }
  26. } /*到此结束*/
  27. }
  28. return;
  29. }

■■■■■

完工啦!我们赶紧来运行一下看看,“make run”……嗯嗯,总之运行起来没有什么问题。窗口移动的速度呢……唔,也看不太出来,不过感觉好像快了那么一点,就当是成功了吧(笑)。

1 提高窗口移动速度(1)(harib23a) - 图1

截图上看不出来,不过感觉快了那么一点点