dirty list机制分析

本文介绍了在文件读写过程中使用DirtyList提高写操作效率的方法。DirtyList作为一种缓存机制,在数据库设计中常见,它能暂时存储用户写入的数据,并在提交时一次性写入磁盘。文章还解释了DirtyList的工作原理及其在读写操作中的应用。

    对文件一边读一边写的应该场景中,我们一般采用dirty list来提高写的速度,dirty list在一些数据库的设计实现里(oracle),是作为Least Recently Used Write(LRUW)来使用的,即将用户新写入的值临时保存在内存中,提交时将dirty list中的数据一次性写入文件或db中。内存中的dirty list在未写入文件或db时,对于用户的读取操作也是可见的。

    保存在dirty list中的数据单元一般为块数据,固定字节大小。有dirty list的读取流程图如下,其中free list是干净的数据列表,可以采用各种讨论算法保证列表数量的稳定,如FIFO,LRU等等。inuse list是目前正在使用的对象列表,起一个过渡的作用,读操作的示意图如下:


 
    读或者写操作结束后,均需要释放块数据,根据块数据是否被写脏,需要执行不同的操作,如果写脏了(包括之前就是脏数据),需要放到dirty list里,没有写脏,放到free list里。


 

写操作基于上面的两个操作:

 


 
最终commit的时候,将dirty list里的数据一次性写入文件或db即可。


 

在这段代码中,以下代码块的作用是**在游戏初始化阶段,将蛇的初始身体部分和食物的位置标记为“脏区域”(即需要刷新绘制的区域)**,并通过 `applyDirty()` 函数实现局部屏幕更新。这是为了提高渲染效率,避免每次全屏重绘。 ```c // 初始化时标记所有蛇身和食物为脏 dirty_count = 0; for (int i = 0; i < snakelenth; i++) { dirty_list[dirty_count++] = (DirtyCell){snakeX[i] + 1, snakeY[i] + 1, '@'}; } dirty_list[dirty_count++] = (DirtyCell){foodX + 1, foodY + 1, '*'}; applyDirty(); ``` ### 功能与作用详细分析: #### 1. **`dirty_count = 0;`** - 清空脏区域列表,表示开始记录新的需要刷新的单元格。 - 这是为了确保每次初始化或绘制前,脏区域列表是干净的,不会包含上一次残留的数据。 #### 2. **`for (int i = 0; i < snakelenth; i++) { ... }`** - 遍历当前蛇的每一个身体节点(初始长度为3),将其位置加入脏区域列表。 - 使用 `snakeX[i] + 1` 和 `snakeY[i] + 1` 是因为: - 地图有边框(`#`),实际内容显示时坐标偏移了 `(1,1)`。 - 即:地图左上角内容 `(0,0)` 在控制台输出时对应的是 `(1,1)` 的位置。 - 每个蛇身单元用字符 `'@'` 表示。 > 示例:如果蛇头在 `(12,12)`,那么它在屏幕上应显示在 `(13,13)`,所以插入 `x+1, y+1`。 #### 3. **`dirty_list[dirty_count++] = (DirtyCell){foodX + 1, foodY + 1, '*'}`** - 将食物的位置也添加到脏区域列表中。 - 食物使用字符 `'*'` 显示。 - 同样进行 `(x+1, y+1)` 坐标转换以匹配带边框的显示布局。 #### 4. **`applyDirty();`** - 调用该函数,根据 `dirty_list` 中记录的所有“脏单元格”,逐个在控制台对应位置重新打印字符。 - 实现**局部刷新**,仅更新发生变化的部分,提升性能并减少闪烁。 --- ### 整体作用总结: 这段代码的功能是在游戏初始化完成后,**首次将蛇身和食物绘制到屏幕上**,但不是通过重新绘制整个界面,而是利用“脏区域机制”进行高效局部更新。 这种方式的优点包括: - 避免调用耗时的全屏重绘(如 `draw()`); - 提高响应速度,使画面更流畅; - 为后续每一帧的增量更新奠定基础(逻辑统一); 换句话说: ✅ 它完成了“把初始状态的蛇和食物画出来”的任务, ⚡ 并且是以一种**高性能、局部刷新的方式**完成的。 --- ### 补充说明:“脏区域”机制的意义 这个程序采用了“脏矩形”(Dirty Region)优化技术的一种简化形式——只记录发生变化的格子,在下一帧只重绘这些格子。这种思想广泛应用于图形系统、GUI 和游戏开发中,用于降低渲染开销。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值