30天自制操作系统(26)
DAY26_为窗口移动提速
1. 提高窗口的移动速度(1)
导致窗口移动速度慢的原因有很多,其中之一就是sheet_refreshmap的速度太慢。这个函数在
sheet_slide中被调用了两次,如果能提高它的速度效果应该会很明显。
2. 提高窗口的移动速度(2)
sheet_refreshmap中有这样一句map[vy * ctl->xsize + vx] = sid;
在汇编语言中,如果我们用16位寄存器代替8位寄存器来执行MOV指令的话,相邻的地址中也会同时写入数据,而如果用32位寄存器,仅1条指令就可以同时向相邻的4个地址写入值了。
更重要的是,即便是同时写入4个字节的值,只要指定地址是4的整数倍,指令的执行速度就
和1个字节的MOV是相同的。也就是说,速度说不定能提高到原来的4倍!
3.提高窗口移动速度(3)
于是我们首先想到了sheet_refreshsub,窗口移动的时候也调用了这个函数,因此通过修改它可以提高窗口移动的速度,此外其他一些地方也会调用这个函数。
4.提高窗口移动速度(4)
为什么明明已经放开了鼠标键,窗口却还在挪动呢?这是因为伴随图层移动所进行的绘图操
作非常消耗时间,导致系统来不及处理FIFO中的鼠标移动数据。那么我们可以在接收到鼠标移动数据后不立即进行绘图操作,但如果一直不绘图的话鼠标和窗口就静止不动了,那不就没意义了吗?我们可以等FIFO为空时再进行绘图操作嘛。
5.启动时只打开一个命令行窗口
一般都是先打开一个命令行窗口,然后根据需要增加。下面我们就将启动时显示的命令行窗口数量改为一个,并且实现可以随意启动新命令行窗口的功能吧。
在Windows中,即便不在命令行中输入命令,只通过鼠标的操作也可以打开新的命令行窗口。不过鼠标点击开始菜单这种方式实现起来太难,我们还是做快捷键吧。
6.增加更多的命令行窗口
7. 关闭命令行窗口(1)
在Windows的命令行窗口中,输入“exit”命令就可以关闭当前窗口.
在关闭一个命令行窗口时系统需要做些什么事呢?首先需要将创建该窗口时所占用的内存
空间全部释放出来,然后还需要释放窗口的图层和任务结构。咦,问题来了,在创建任务时我们为命令行窗口准备了专用的栈,却没有将这个栈的地址保存起来,这样的话就无法执行释放操作了。怎么办呢?我们可以在TASK结构中添加一个cons_stack成员,用来保存栈的地址。
8. 关闭命令行窗口(2)
实现用鼠标关闭命令行窗口的功能。当鼠标点击窗口上的“×”按钮时,向命令行窗口任务发送4这个数据,命令行窗口接收到这个数据后则开始执行exit命令的程序。
9.start命令
Windows的命令行窗口里有一个start命令,它的功能是可以打开一个新的命令行窗口并运行指定的应用程序。void cmd_start(struct CONSOLE *cons, char *cmdline, int memtotal)
{
struct SHTCTL *shtctl = (struct SHTCTL *) *((int *) 0x0fe4);
struct SHEET *sht = open_console(shtctl, memtotal);
struct FIFO32 *fifo = &sht->task->fifo;
int i;
sheet_slide(sht, 32, 4);
sheet_updown(sht, shtctl->top);
/*将命令行输入的字符串逐字复制到新的命令行窗口中*/
for (i = 6; cmdline[i] != 0; i++) {
fifo32_put(fifo, cmdline[i] + 256);
}
fifo32_put(fifo, 10 + 256); /*回车键*/
cons_newline(cons);
return;
}
10. ncst命令
用start命令启动应用程序看起来很不错,但如果运行color这样的程序的话,我们并不希望真的新开一个命令行窗口出来,反倒是没有这个多余的窗口比较好。那么下面我们就来做一个不打开新命令行窗口的start命令吧,给它起个名字,叫做“no console start”,简称ncst命令。