您可能知道,C++ 没有标准图形库。大多数游戏使用 DirectX 或 OpenGL。
但是这些库实际上是如何工作的呢?也就是说,如果C++没有机制,第三方库如何绘制图形呢?它们只是用另一种语言编写的吗?
最佳答案
具体来说,DirectX 和 OpenGL 通过调用操作系统和/或视频硬件驱动程序来工作。反过来,驱动程序通过与图形设备交互来完成实际绘图。交互的具体细节因显卡而异。
在 DOS 时代,C++ 程序员可以直接使用硬件。这是通过两种方式实现的。首先,通过写入/读取存储像素或文本的特殊内存块(“帧缓冲区”)。它是一个位于已知地址的内存范围,因此要使用它,您必须将一个整数常量转换为一个指针并使用该指针。纯 C++ 机制。另一种交互方式是从 I/O 端口读取/写入。现在,这是一种 C 不直接支持的机制,除非您将内联汇编或编译器内在函数算在内。有两个库函数可以包装这两个操作(从字面上看,包装两个 CPU 命令 - INP 和 OUTP),但大多数程序员只会使用单行内联汇编代码片段。
即使是现在,大多数视频硬件交互都归结为这两条路径 - 帧缓冲区和 I/O 端口(DMA 和中断通常不用于图形)。但是我们应用程序级的程序员看不到这些。这是驱动程序的东西。
一个现代警告与保护模式有关;在保护模式下,C 指针与底层物理地址不相同。简单地将 0xA0000 类型转换为指针不会让您进入帧缓冲区,即使在内核模式下也是如此。然而,内核级代码(即驱动程序)可以请求内存管理器为其提供一个对应于特定物理地址的指针。
关于c++ - C++ 图形库的内部工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4887235/