1 提高窗口移动速度(1)(harib23a)
昨天我们增加了可同时启动的应用程序的数量,窗口也跟着变多了,整个画面变得热闹起来。
话说,在对比color.hrb和color2.hrb的时候我们需要移动窗口,那个时候笔者感到窗口移动的速度很慢。在真机环境下的速度还算可以接受,但在QEMU下就慢得离谱,让人心烦。虽说在真机环境下速度不慢就可以了,但如果速度能再快点总归是件好事。因此,提高窗口移动的速度就成了我们今天的第一个课题。
■■■■■
导致窗口移动速度慢的原因有很多,其中之一就是sheet_refreshmap的速度太慢。这个函数在sheet_slide中被调用了两次,如果能提高它的速度效果应该会很明显。
这个函数是很久之前写的,因此在修改之前我们再来看一下它的代码。
修改前的sheet.c节选
void sheet_refreshmap(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0)
{
(中略)
for (h = h0;s h <= ctl->top; h++) {
(中略)
for (by = by0; by < by1; by++) {
vy = sht->vy0 + by;
for (bx = bx0; bx < bx1; bx++) {
vx = sht->vx0 + bx;
if (buf[by * sht->bxsize + bx] != sht->col_inv) {
map[vy * ctl->xsize + vx] = sid;
}
}
}
}
return;
}
怎样才能提高这个函数的速度呢?我们可以尝试将里面的if语句去掉。这个if语句位于三层for循环之中,要被执行成千上万次,因此如果能去掉这个if语句的话,速度应该会有不小的提高。
要去掉这个if语句,我们得先思考一下它的含义。这个if语句的功能是判断图层是否为透明部分,如果强行去掉它的话图层的透明部分就没有了,鼠标指针就会变成一个方块,这样可不行。但换个角度想想,窗口基本上都是矩形的,没有透明部分,如果仅去掉窗口部分的if判断是没有影响的。
因此,我们在进入bx和by的for循环之前先判断这个图层是否有透明部分,如果有透明部分的话还按现有程序执行,否则执行一个没有if语句的两层循环。
本次的sheet.c节选
void sheet_refreshmap(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0)
{
(中略)
for (h = h0; h <= ctl->top; h++) {
(中略)
if (sht->col_inv == -1) { /*从此开始*/
/*无透明色图层专用的高速版*/
for (by = by0; by < by1; by++) {
vy = sht->vy0 + by;
for (bx = bx0; bx < bx1; bx++) {
vx = sht->vx0 + bx;
map[vy * ctl->xsize + vx] = sid;
}
}
} else {
/*有透明色图层用的普通版*/
for (by = by0; by < by1; by++) {
vy = sht->vy0 + by;
for (bx = bx0; bx < bx1; bx++) {
vx = sht->vx0 + bx;
if (buf[by * sht->bxsize + bx] != sht->col_inv) {
map[vy * ctl->xsize + vx] = sid;
}
}
}
} /*到此结束*/
}
return;
}
■■■■■
完工啦!我们赶紧来运行一下看看,“make run”……嗯嗯,总之运行起来没有什么问题。窗口移动的速度呢……唔,也看不太出来,不过感觉好像快了那么一点,就当是成功了吧(笑)。
截图上看不出来,不过感觉快了那么一点点