2

Ok.I可以找到模拟设计为简单架构(编辑:绝对不一样的x86)。

例如使用int作为程序计数器,使用byte array作为记忆和等等。

但是,我怎样才能模拟图形卡(最简单的图形卡可想象)的功能?

类似于使用array来表示每个像素并逐一“绘制”每个像素。
但是何时绘制与CPU同步或异步?谁在该阵列中存储graphic data?是否有存储像素和绘制像素的指令?
模拟一个简单的图形卡

请考虑所有问号('?')并不意味着“你问了很多问题”,而是解释了问题本身 - 如何模拟显卡?

编辑:LINK到的基本实现设计CPU +内存模拟

+1

你想开始编写一个驱动程序,提供一个已知的API,可能是OpenGL。在这之后,你可以做任何你想做的事(并且有OGL软件实现可以参考)。 – ssube

+0

简单地说,我要求的是数据结构/ s来表示图形卡和算法来获得功能。 – Dinushan

+1

这是功课吗? :) –

回答

2

图形卡通常携带许多KB的或存储器的MB,其存储各个像素被然后在屏幕上显示的颜色。该卡片每秒扫描一次该存储器多次,将像素颜色的数字表示转换为显示器理解和可视化的视频信号(模拟或数字)。

CPU可以访问这个存储器,每当它改变它时,卡片最终将新的颜色数据转换成适当的视频信号,并且显示器显示更新的图片。该卡异步执行所有处理,不需要CPU提供太多帮助。从CPU的角度来看,它很像是将新的像素颜色写入显卡的内存中对应像素坐标的位置,然后忘记它。实际情况可能稍微复杂一些(由于较差的同步伪像,如tearing,snow等),但这是它的要点。

当您模拟图形卡时,需要以某种方式镜像模拟卡在物理图形卡内存中的内存。如果在操作系统中,您可以直接访问物理图形卡的内存,这是一件容易的事。简单地实现写你的仿真计算机这样的记忆:

void MemoryWrite(unsigned long Address, unsigned char Value) 
{ 
    if ((Address >= SimulatedCardVideoMemoryStart) && 
     (Address - SimulatedCardVideoMemoryStart < SimulatedCardVideoMemorySize)) 
    { 
    PhysicalCard[Address - SimulatedCardVideoMemoryStart] = Value; 
    } 

    EmulatedComputerMemory[Address] = Value; 
} 

以上,当然,假设模拟卡具有完全相同的分辨率(比如1024×768)和像素表现(比如,3个字节每像素,第一个字节为红色,第二个为绿色,第三个为蓝色)作为物理卡。在现实生活中,事情可能会稍微复杂一些,但这也是一般想法。

如果您的代码可以通过PC BIOS启动您的代码并将其限制为仅使用BIOS服务功能(中断)和直接硬件访问,则您可以直接在MSDOS中或在没有任何OS的裸机上访问物理卡的内存对于所有其他PC设备。

顺便说一句,它可能会很容易实现你的模拟器作为DOS程序,并直接运行它在Windows XP(Vista和7有非常有限的32位版本的DOS应用程序的支持,并没有在64位版本;但是,您可能会安装XP Mode,这是XP中虚拟机中的XP),或者更好,但类似于DOSBox,似乎可用于多个操作系统。

如果你将这个东西作为一个Windows程序来实现,你将不得不使用GDIDirectX来在屏幕上绘制东西。除非我错了,否则这两个选项都不能让您直接访问物理卡的内存,以便自动显示其中的更改。

如果有很多渲染,使用GDI或DirectX在屏幕上绘制单个像素可能会很昂贵。每当其中一个被改变时,重新绘制所有模拟卡的像素就会导致相同的性能问题。最好的解决方案可能是每秒更新一次屏幕25-50次,并且只更新自上次重绘以来更改过的部分。将模拟卡的缓冲区细分为代表64×64像素的矩形区域的较小缓冲区,每当仿真器写入它们时将这些缓冲区标记为“脏”,并在屏幕上绘制时标记为“干净”。你可以设置一个周期性的定时器驱动屏幕重绘,并在一个单独的线程中完成。你应该可以在Linux中做类似的事情,但我对那里的图形编程知之甚少。

+0

感谢您的优秀解释 – Dinushan