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月前
|
监控 Linux 云计算
Linux操作系统在云计算环境中的实践与优化###
【10月更文挑战第16天】 本文探讨了Linux操作系统在云计算环境中的应用实践,重点分析了其在稳定性、安全性和高效性方面的优势。通过具体案例,阐述了Linux如何支持虚拟化技术、实现资源高效分配以及与其他开源技术的无缝集成。文章还提供了针对Linux系统在云计算中的优化建议,包括内核参数调整、文件系统选择和性能监控工具的应用,旨在帮助读者更好地理解和应用Linux于云计算场景。 ###
41 3
|
1月前
|
存储 C语言 iOS开发
MacOS环境-手写操作系统-48-让内核从错误中恢复
MacOS环境-手写操作系统-48-让内核从错误中恢复
38 0
|
1月前
|
存储 API C语言
MacOS环境-手写操作系统-46,47-C语言开发应用程序
MacOS环境-手写操作系统-46,47-C语言开发应用程序
35 0
|
1月前
|
编译器 API C语言
MacOS环境-手写操作系统-45-C语言开发应用程序
MacOS环境-手写操作系统-45-C语言开发应用程序
45 0
|
1月前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
22 0
|
3月前
|
关系型数据库 MySQL 数据库
【Mac os系统】安装MySQL数据库
本文详细介绍了在Mac OS系统上安装MySQL数据库的步骤,包括下载、安装、配置环境变量、启动服务、授权设置以及解决常见问题,并提供了一些常用的MySQL命令。
209 0
【Mac os系统】安装MySQL数据库
|
4月前
|
Linux 虚拟化 iOS开发
部署06--MacOS安装VMware Fusion安装
部署06--MacOS安装VMware Fusion安装
|
3月前
|
测试技术 Linux 虚拟化
iOS自动化测试方案(五):保姆级VMware虚拟机安装MacOS
详细的VMware虚拟机安装macOS Big Sur的保姆级教程,包括下载VMware和macOS镜像、图解安装步骤和遇到问题时的解决方案,旨在帮助读者顺利搭建macOS虚拟机环境。
146 3
iOS自动化测试方案(五):保姆级VMware虚拟机安装MacOS
|
3月前
|
虚拟化 数据安全/隐私保护 iOS开发
VMware——安装MacOS 系统教程(仅供学习交流)
VMware——安装MacOS 系统教程(仅供学习交流)
74 4
|
5月前
|
Java Shell 开发工具
03. 【Java教程】在 MacOS 上安装 Java
03. 【Java教程】在 MacOS 上安装 Java
59 1