其他分享
首页 > 其他分享> > 30天自制操作系统:第十天 叠加处理

30天自制操作系统:第十天 叠加处理

作者:互联网

1 内存管理(续)(harib07a)

***memman_alloc***和***memman_free*函数能够以1字节为单位进行内存管理,这种方式虽然不错,但是有一点不足:在反复进行内存分配和内存释放之后,内存中就会出现很多不连续的小段未使用空间,这样就会把man->frees(该属性指示了空闲空间块的总个数)消耗殆尽。

因此,作者编写了一些总是以0x1000字节为单位进行内存分配和释放的函数,它们会把指定的内存大小按0x1000字节(4KB)为单位向上舍入,选择0x1000这个数值非常精妙,我们慢慢来理解这个“精妙之处”。
在这里插入图片描述
刚看程序,有点懵,但是后面作者给出了对向上向下取整详细的解释:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里都是作者解释如何完成向上向下取整的操作,非常通俗易懂。

拓展阅读

作者深度解释了使用0x1000字节作为单位的高明之处。
在这里插入图片描述
在这里插入图片描述

2 叠加处理(harib07b)

之后的这几个小节中包含了非常多的程序代码,笔者就给出一些理解吧,刚学确实有点懵懂。
在这里插入图片描述
在这里插入图片描述
结构体中的内容比较多,首先 SHEET 表示“透明图层”的意思。

只有一个图层是不能实现叠加处理的,所以必须创建一个管理多重图层信息的结构。
在这里插入图片描述
在这里插入图片描述
结构体SHTCTL(sheet control,图层管理):

sheet_alloc函数

在这里插入图片描述

函数对所有图层进行遍历,找出第一个 flags 等于 0(未使用) 的图层,将其标记更改为 “正在使用”,设置 height 属性为 - 1, 表示隐藏,最后再返回这个图层的地址即可;如果没有找到符合条件(未使用)的图层,那么返回0表示所有的SHEET都处于正在使用的状态

设定图层内容的sheet_setbuf函数

在这里插入图片描述
用于设定图层的缓冲区大小和透明色的函数,函数中只完成了一些简单的赋值。

设定底板高度的 sheet_updown函数

在这里插入图片描述
程序中包含了比较多的注释,只能慢慢看程序一次又一次去理解了。

从下往上描述图层的sheet_refresh函数

在这里插入图片描述
对于已经设定了高度的所有图层而言,要从下往上,将透明以外的所有像素都恢复到VRAM中。由于是从下开始复制,所以最后最上面的内容就留在了画面上。

sheet_slide函数

在这里插入图片描述
不改变图层高度而只上下左右移动图层的函数。

释放已使用图层内存的sheet_free函数

在这里插入图片描述

HariMain函数

在这里插入图片描述
在这里插入图片描述
主函数负责调用这些函数完成实际功能,这部分需要仔细琢磨。
这里有两个图层,分别是sht_backsht_mouse,还准备了两个缓冲区buf_backbuf_mouse,用于在其中描绘图形,以前我们指定为 binfo->vram的部分,现在有很多都改成了 buf_back。而且每次修改缓冲区之后都要刷新。

3 提高叠加处理速度(1)(harib07c)

鼠标指针虽然最多只有16 x 16 = 256个像素,但是上一章节里卖的程序,只要它稍一移动,程序就会对整个画面进行刷新,也就是重新绘制320 x 200 = 64000个像素。而实际上,只重新描绘移动相关的部分,也就是移动前后的部分就可以了,即 256 x 2 = 512个像素,这只是原来64000像素的0.8%而已,根据这个思路改写一下程序。

sheet.c节选

在这里插入图片描述
函数几乎和sheet_refresh一样,唯一的不同点在于它能使用vx0 ~ vy1指定刷新的范围,而我们之追加了一个if语句就实现了这个新功能。

现在用这个 refreshsub函数来提高sheet_slide的运行速度。

在这里插入图片描述
这段程序所做的是:首先记住移动前的显示位置,再设定新的显示位置,最后只需要重新描绘移动前和移动后的地方就可以了。

移动鼠标的时候,由于要在画面上显示坐标等信息,结果又执行了sheet_refresh程序,所以还是很慢, 必须解决一下图层内文字显示的问题。
这里所说的在图层上显示文字,实际上不是改写图层的全部内容,假设我们写了20个字,那么8 x 16 x 20 = 2560,也就仅仅重写2560个像素的内容就足够了,但现在每次都要重写64000个像素的内容,所以速度才会那么慢。
在这里插入图片描述
所谓指定范围,并不是直接指定画面内的坐标,而是以缓冲区的坐标来表示。这样一来,HariMain就可以 不考虑图层在画面中的位置了。

在这里插入图片描述在这里插入图片描述

4 提高叠加处理速度(2)(harib07d)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

感受

中秋节快乐呀,今天的内容看的还是有点懵懂,大体上好似明白,但是一旦细节一点的内容有点绕不过去,现在的窘境就是函数太多了,有些地方没有完全吃透,有一些小疑问还需要解决。已经第十天了,希望能熬过去,加油

标签:sheet,第十天,30,程序,像素,内存,图层,操作系统,函数
来源: https://blog.csdn.net/Genius_bin/article/details/120400009