您可能知道,C++没有标准的图形库.大多数游戏都使用DirectX或OpenGL.
但这些图书馆实际上如何运作?换句话说,如果第三方库在C++中没有机制,它如何绘制图形?他们只是用另一种语言写的吗?
特别是DirectX和OpenGL通过调用操作系统和/或视频硬件驱动程序来工作.反过来,驱动程序通过与图形设备交互来进行实际绘图.交互的确切细节因视频卡而异.
回到DOS时代,C++程序员可以直接使用硬件.这是通过两种方式完成的.首先,通过写入/读取存储像素或文本的特殊存储块("帧缓冲区").它是一个已知地址的内存范围,因此要使用它,您必须将一个整型常量强制转换为指针并使用该指针.纯粹的C++机制.另一种交互方式是读/写I/O端口.现在,这是一种C不直接支持的机制,除非您想要计算内联汇编或编译器内部函数.有两个库函数可以包装这两个操作(字面意思是,两个CPU命令的包装器 - INP和OUTP),但大多数程序员只使用一行内联汇编代码段.
即使是现在,大多数视频硬件交互归结为这两种途径 - 帧缓冲和I/O端口(DMA和中断通常不用于图形).但是我们应用级程序员不会看到这些.这是司机的东西.
一个现代的警告与保护模式有关; 在保护模式下,C指针不一样底层物理地址.简单地将0xA0000强制转换为指针将无法使您进入帧缓冲区,即使在内核模式下也是如此.但是,内核级代码(即驱动程序)可以请求内存管理器为其指定一个与特定物理地址相对应的指针.