MacOS环境-手写操作系统-23-消除刷新的闪烁

简介: 文章介绍了如何通过修改代码来解决因频繁刷新整个窗体导致的闪烁问题,重点在于只刷新需要更新的图层,从而提高效率并减少不必要的CPU资源消耗。通过在sheet_refreshsub函数中添加图层高度参数,实现了按需刷新,成功消除了图层闪烁。然而,当鼠标位于较高图层时,仍会出现闪烁,暗示需要进一步优化刷新算法。

消除闪烁1

1.简介

就以前几节我们创造的Message box为例


我们修改一下代码 不断的修改Box窗体内的字符 进而导致图层不断刷新


(在上节我们已经出现了这样的问题 22-突破连续读取72个扇区)


运行后 就疯狂的闪烁


这个现象的产生 是因为我们在刷新Box窗体时 我们也同时在刷新底层桌面


假设一个窗体 它的高度是10 那么它刷新时 高度为0到9的窗体根本不需要跟着刷新


如果高度低的窗体跟着刷新 不但产生闪烁的效果


而且是毫无必要的浪费CPU资源


接下来我们的改进就是 当窗体刷新时 只刷新同一层高度或高度更高的图层


2.代码

由此 代码改动如下 在win_sheet.c中


void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0) {

   ....

   for (h = h0; h <= ctl->top; h++) {

      .....

   }


   .....

}

1

2

3

4

5

6

7

8

sheet_refreshsub 是用来刷新图层的


这次改动就增加了一个参数h0


这个h0就表示当前要刷新的图层的高度 在for 循环不再从0开始


而是从h0开始 也就是从当前图层的高度往上进行刷新


其他调用它的函数也要做相应的修改 仍然在win_sheet.c中

int sheet_refresh(struct SHTCTL *ctl, struct SHEET *sht, int bx0, int by0, int bx1, int by1) {
    if (sht->height >= 0) {
        //多添加一个图层高度的参数
        sheet_refreshsub(ctl, sht->vx0 + bx0, sht->vy0 + by0, sht->vx0 + bx1,
        sht->vy0 + by1, sht->height);
    }
    return 0;
}

void sheet_slide(struct SHTCTL *ctl, struct SHEET *sht, int vx0, int vy0) {
    int old_vx0 = sht->vx0, old_vy0 = sht->vy0;
    sht->vx0 = vx0;
    sht->vy0 = vy0;
    if (sht->height >= 0) {
         sheet_refreshsub(ctl, old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize, 0);
         sheet_refreshsub(ctl, vx0, vy0, vx0+sht->bxsize, vy0+sht->bysize, sht->height);
    }
}

void sheet_slide(struct SHTCTL *ctl, struct SHEET *sht, int vx0, int vy0) {
    int old_vx0 = sht->vx0, old_vy0 = sht->vy0;
    sht->vx0 = vx0;
    sht->vy0 = vy0;
    if (sht->height >= 0) {
         //多添加一个图层高度的参数
         sheet_refreshsub(ctl, old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize, 0);
         sheet_refreshsub(ctl, vx0, vy0, vx0+sht->bxsize, vy0+sht->bysize, sht->height);
    }
}

void sheet_updown(struct SHTCTL *ctl, struct SHEET *sht, int height) {
     ....
       if (old > height) {
         ....
           if (height >= 0) {
         .....

         //多添加一个图层高度的参数
           sheet_refreshsub(ctl, sht->vx0, sht->vy0, 
           sht->vx0+sht->bxsize, sht->vy0+sht->bysize, height+1);
            }
       } else {
           ....
           //多添加一个图层高度的参数
            sheet_refreshsub(ctl, sht->vx0, sht->vy0, 
            sht->vx0+sht->bxsize, sht->vy0+sht->bysize,0);
       }
    else {
        ....
        //多添加一个图层高度的参数
        sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0+sht->bxsize, sht->vy0+sht->bysize,
        height);
   }
}

唯一需要改动的就是在调用sheet_refreshsub时 多添加一个参数 把当前更新图层所在的高度传进去


3.编译运行

图层的闪烁现象就消除了


但如果我们把鼠标挪到 Message Box 的上头


我们会发现鼠标自己出现了闪烁的现象


这是因为鼠标图层比Message Box 高


当鼠标与Box重叠时 Box自己的刷新会导致鼠标的刷新 要更改这个问题 需要做新的刷新算法改进

相关文章
|
1天前
|
存储 C语言 iOS开发
MacOS环境-手写操作系统-48-让内核从错误中恢复
MacOS环境-手写操作系统-48-让内核从错误中恢复
9 0
|
1天前
|
存储 API C语言
MacOS环境-手写操作系统-46,47-C语言开发应用程序
MacOS环境-手写操作系统-46,47-C语言开发应用程序
8 0
|
1天前
|
编译器 API C语言
MacOS环境-手写操作系统-45-C语言开发应用程序
MacOS环境-手写操作系统-45-C语言开发应用程序
10 0
|
1天前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
7 0
|
3月前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
3月前
|
Linux 虚拟化 数据安全/隐私保护
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
|
2月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
|
3月前
|
Linux 测试技术 数据安全/隐私保护
阿里云Linux os copilot 运维助手初体验
阿里云Linux os copilot 初体验
389 1
阿里云Linux os copilot 运维助手初体验
|
3月前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。
|
3月前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
151 1