30天自制操作系统(第十一天)

本文介绍了如何通过将部分函数参数合并到结构体中来减少shtctl函数的复杂性,以及通过优化高速定时器和窗口刷新算法提高代码效率和可读性,减少窗口闪烁。
摘要由CSDN通过智能技术生成

一、shtctl的指定省略

1、目的

这里作者是想减少函数的形式参数shtctl。我理解的原因是,如果形参过多,函数的定义会变得臃肿和难以理解,降低了代码的可读性。其他人阅读代码时可能会难以理解函数的功能和参数之间的关系。

2、实现方式

原本两个形参SHEET和SHTCTL ,把其中的一个参数,写进另一个参数的结构里面,如下:

struct SHEET {
	unsigned char *buf;
	int bxsize, bysize, vx0, vy0, col_inv, height, flags;
	struct SHTCTL *ctl;
};
struct SHTCTL {
	unsigned char *vram;
	int xsize, ysize, top;
	struct SHEET *sheets[MAX_SHEETS];
	struct SHEET sheets0[MAX_SHEETS];
};

这里是把给struct SHTCTL *ctl写进了图层SHEET 。

需要在初始化时,为每个图层SHEET指定ctl起始地址(这里是相同的,因为只有一个结构体变量)。后续就只需要传递图层SHEET,而不再需要传递SHTCTL。想访问SHTCTL时,直接使用sht->ctl来访问。

二、显示窗口

三、高速定时器

1、定义

 所谓高速计数器,其实就是定义一个变量counter,在系统的大循环中无条件快速累加,再把这个counter的值打印到我们创建的窗口中。

for (;;) 
	count++;
	sprintf(s, "%010d", count);
	boxfill8(buf_win, 160, COL8_C6C6C6, 40, 28, 119, 43);
	putfonts8_asc(buf_win, 160, 40, 28, COL8_000000, s);
	sheet_refresh(sht_win, 40, 28, 120, 44);

这样直接一直打印和累加的写法不高明,作者做了两次优化

2、优化(1)

 只刷当前图层和当前图层以上的图层(鼠标),实现起来比较简单,只需要多传递一个形参:当前图层高度,在循环刷新的时候,从当前图层高度向上刷新即可。

3、优化(2)

 建立map,大小与VRAM相同,用于精细控制刷新区域。

刷新时,先判断是不是要刷新的区域,保证只刷新需要的区域,减弱窗口闪烁。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值