c++ - C++ 图形库的内部工作原理

标签 c++ graphics

您可能知道,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/

相关文章:

graphics - 创建 2D 图形资源的最佳实践

java - JOptionPane 在 JPanel 中不能正常工作

c++ - 在 map 中存储具有不同签名的函数

c++ - 为什么我不能从另一个函数中调用匿名命名空间中的函数?

Java 图形 - 重新绘制图像而不删除另一个图像

c++ - 使用什么 Qt 小部件来绘制类似 "game-of-life"的应用程序?

android - 编写一个可爱的 Android GUI?

c++ - operator== 使用 msvc 编译,但不使用 gcc 和 clang 编译

c++ - 如何在不更改所有代码以使用 this-> 的情况下避免旧模板重库中的 'not declared' 错误?

C++ 对我的命令行计算器进行故障排除