MS-DOS默认鼠标光标不擦除底层内容原理及VGA硬件精灵相关疑问
MS-DOS鼠标光标运行时不擦除底层内容的原理说明
首先先明确两个基础结论:
- 标准VGA硬件本身不存在硬件精灵(hardware sprites)能力,也没有独立的光标叠加显示层,你记忆中VGA只有单层图形帧缓冲的认知是正确的,所有最终要显示的内容都需要写入同一块VGA显存区域才能输出。
- 原生MS-DOS环境下没有专供鼠标使用的独立硬件层,你在DOSBox里感受到的「光标独立于底层图形」的表现是模拟器的实现优化,不是原生DOS/VGA的特性。
原生DOS鼠标光标的实现逻辑
当时主流的DOS鼠标驱动(比如微软官方鼠标驱动、Mouse Systems驱动等)完全靠软件逻辑实现光标不破坏底层内容,核心流程如下:
- 光标绘制前,驱动会先读取目标绘制位置的原有显存像素数据,缓存到驱动自身管理的常规内存区域中
- 绘制光标时,驱动大多采用
XOR(异或)位运算将光标像素值和原有显存像素值做计算后写入显存:异或运算的特性是对同一区域执行两次相同的异或操作,就会完全恢复原始像素值,不需要额外备份整个区域的内容也能快速还原 - 光标需要移动时,驱动会先对原有光标位置再执行一次相同的
XOR运算,或者直接把之前缓存的背景像素写回原位置,就能完全恢复底层的原有画面,之后再在新的光标位置重复缓存、绘制的流程即可
DOSBox的特殊表现说明
DOSBox中鼠标光标看起来类似精灵层的效果,是模拟器做的额外优化:很多版本的DOSBox会把模拟的DOS鼠标光标和宿主操作系统的硬件光标绑定,或者将光标单独渲染在模拟器输出画面的最顶层,不需要走模拟的VGA显存写入流程,所以看起来和底层DOS图形内容完全独立,这不是原生DOS的能力。
内容的提问来源于stack exchange,提问作者puppydrum64
相关产品推荐
相关产品推荐

