![]() |
1
4
没有单独的缓冲区可供VGA卡读取。(记住,当vga是新的时,即使32kib的dram也是昂贵的。而且,内存带宽很低。一些视频卡过去使用 dual-ported RAM 因此,CPU的访问不会干扰扫描;当CRTC/RAMDAC读取像素数据时,它可以在一个端口上读/写。) 在A期间 vertical-blanking interval 视频卡根本不读写视频RAM;它的存在使得CRT可以将电子束偏转板的电压改变回屏幕顶部,而不需要在屏幕上画一条线。然后,VGA硬件开始读取视频RAM,以便下次扫描出下一帧。 (当然,现代硬件不驱动CRT,但按“空白间隔”顺序读取VRAM仍然是一回事)。 等待位被设置然后清除,有助于使代码在空白间隔开始时开始运行,而不是在空白间隔结束时开始运行。 如果修改视频RAM的代码运行得足够快,那么在硬件再次开始读取之前就已经完成了,这样就不会被撕破。(实际上,因为你是按扫描顺序写屏幕的, 它只需要足够快来保持在光栅扫描之前 ,因此屏幕输出不会通过memcpy,稍后在帧中显示一些“旧”像素。)
在旧硬件上,
如果源数据在l1d或l2缓存中是热的,因为您刚刚写入了它,而目的地是uswc视频RAM,则使用
(顺便说一句,
顺便说一句,即使集成图形“视频RAM”仍然只是常规DRAM的一部分,它也将是UC(不可缓存)或WC(不可缓存写入组合))。当然,现在大部分的VGA接口都是模拟的。不过,VGA内存可能是图形硬件使用的真正帧缓冲区(如果在裸机上运行,则不是Dosbox或其他模拟器)。 不管怎样,在低REZ的现代硬件上,您可能只需要检查清除的位就可以了,因为拷贝的运行速度比刷新速度快,几乎没有任何撕裂的机会。或者第一个或两个像素可能来自旧帧。 在Dosbox上用真实的时钟速度模拟真实的旧PC :
@Ped7G says
|