Graphics 当我连续放置像素并将其清除时,如何避免闪烁?(SVGA/DOS)

Graphics 当我连续放置像素并将其清除时,如何避免闪烁?(SVGA/DOS),graphics,dos,16-bit,Graphics,Dos,16 Bit,我在dos环境中,有一个64k的段内存(在16位dos中,从:0xA000:0000开始),直接映射到svga卡的帧缓冲区 我可以通过将数据写入该段来操纵屏幕上显示的像素(还可以借助一个选择页面的功能,只需64k就可以访问整个视频内存) putpixel函数类似于: char far* scr = 0xA0000000 addr = (unsigned long)y*((unsigned long)COLS*4)+((unsigned long)x*4);// offset bytes scr+

我在dos环境中,有一个64k的段内存(在16位dos中,从:0xA000:0000开始),直接映射到svga卡的帧缓冲区

我可以通过将数据写入该段来操纵屏幕上显示的像素(还可以借助一个选择页面的功能,只需64k就可以访问整个视频内存)

putpixel函数类似于:

char far* scr = 0xA0000000
addr = (unsigned long)y*((unsigned long)COLS*4)+((unsigned long)x*4);// offset bytes
scr+=addr; // scr will be limited in one segment
if((NewPage=addr>>16)!=OldPage) {  // equal to:addr/65536 
    OldPage = NewPage;
    SelectPage(NewPage);
}


// color--4bytes,store the value of the pixel

*scr++=color;
*scr++=color>>8;
*scr++=color>>16;

The question is,how can I avoid flickering if I need to putpixels and clear them very often on the screen?(For example,I need to make a small piece of image move on the screen fluently).
我听说过双缓冲,但在dos中,我不知道如何处理页面更改(因为您直接将64k复制到0xA0000000)

有人有在dos下进行svga编程的经验吗?我应该在调用putpixel之前等待CRT的垂直消隐吗

我找到了文件,但不知道如何直接在svga视频卡的寄存器上编程:

对于vga卡,许多人使用此选项等待:

    while(!inportb(0x3da)&0x08);

有人知道如何做这一点吗?(或者有别的方法可以解决这个问题)?< / P>见它是用C++编写的,它使用内联ASM访问IO。如果您真的在DOS环境中,那么它应该可以工作。只需将IO地址更改为SVGA寄存器。。。如果您在Windows或其他环境中(不在emulator中),则需要具有内核模式特权,因此请使用类似DLL端口IO或任何类似的驱动程序(但请注意这会带来安全风险)。另外,backbuffering可以在普通内存中完成,然后只将生成的图像复制到SVGA,这样可以完全消除闪烁,因此您可以等待同步,但不能在单像素级别!!!那就太慢了。而是在复制/渲染整个对象之前执行此操作。。。。