为什么核心C或C ++文本不提及声音或图形?

set*_*arn 2 c c++ audio graphics

这些被认为是综合性的“圣经”类型的编程书籍为什么没有提及有关编程声音或图形的内容?

我的C编程语言第二版书今天由Brian Kerninghan和Dennis Ritchie寄来,我认为这本书应该是全面的,但是我首先注意到的是它很薄。而且,除了我们已经学到的基本知识以外,似乎并没有讨论太多。

因此,我以为我可以看一看Bjarne Stroustrop的C ++编程书,该书厚得多,要看IT部门对图形和声音的看法,至少要看目录,至少有1200多个页面,在图形或声音上似乎都没有。

图形和声音是否需要专业书籍或某些特定库中的内容或其他某种额外的主题?

因为可以肯定,核心语言本身必须在声音和图形方面有一些基础性的东西,不是吗?

如果不是,那么从哪里开始学习有关图形和声音编程的知识?

Eri*_*hil 6

声音和图形不属于C或C ++编程语言的一部分。C和C ++标准仅定义了必须扩展才能提供其他服务的核心语言。

总体而言,C和C ++是抽象编程语言。他们为输入和输出指定了一些功能,这些功能取决于解释和实现的选择,但没有指定与设备的交互,包括声音系统或图形显示。它们指定了具有数据的计算功能,并为交互和存储提供了最少的资源。

C和C ++标准定义了核心语言。这些核心语言以各种方式扩展,包括:

  • 为外部库提供任何类型的服务,包括声音和图形功能。
  • 使用volatile对象与机械交互,包括连接到处理器的设备。
  • 通过在编译器中支持其他关键字或语言构造,在语言中构建更多功能。


Xir*_*ema 5

C ++(和C)没有图形库作为其标准库的一部分

许多新手程序员都为之苦恼。

C ++当前缺少图形库的原因多种多样。有人建议将2d图形库添加到C ++标准中,但是它多次添加失败,并且从今年起或多或少已经失效。

Reddit上有一些文章试图详细介绍出了什么问题,我将在下面链接,但我将总结一些基本问题:

首先,该提案本质上并不是所有架构+操作系统都可以支持的功能。任何可行的Graphics API都需要具有可由操作系统支持的一些基本组件,例如Surface(可在其上绘画的东西),Display(显示器)以及用于在该表面上绘制任意图像并将其呈现给显示器的命令。许多操作系统都有:Windows,Linux,MacOS。但是,还有很多人没有这样做,而尝试构建一个API会使整个API可能由于无法提供必要功能的操作系统而变得无效的麻烦。标准库的理念是,它为所有正确实现该标准的编译器提供功能,而一项无法确保该功能本质上不合适的功能。

第二个问题是,实际上在如何连接该库方面没有达成共识。基本的2D图形API(例如Java,Python或BASIC(的某些变体)提供的API)可以通过多种方式来实现,每种方式都有很大的利弊,而且提案的作者似乎没有关于应如何实施的连贯愿景。

尤其是,现代图形很大程度上是异构计算的问题,在DirectX11 / OpenGL 4.x尝试实现其API的方式(在前一种情况下比在后者的情况下要实质性得多...)或DirectX12 / Vulkan的方式之间。代表试图“尽可能接近金属”的尝试,而C ++标准库缺乏许多有价值的工具来处理这些功能。

像这样的工具std::future可能已经足够了,但是根据我在图形编程方面的经验,我怀疑它是否足够,即使是这样,您仍然要问是否在标准库中实现一个图形库?这样的钝词。这使Networking提案推迟了很多年,甚至只是在C ++ 23中才添加,因为还有其他库功能将支持它,例如Executors提案,Networking库在很大程度上依赖于Executors提案。

还有很多其他方法可以解决问题,但我将其留给这两个大问题解决,因为它们不仅解释了为什么这个具体的提案没有进展,而且还解释了为什么还有许多其他雄心勃勃的提案需要解决相同的地方也没有解决,包括将音频库添加到C ++的许多建议。

那你该怎么办呢?

对于图形,您至少需要两件事:

  • 用于获取Windows / Surfaces / etc的API。显示在
  • 用于生成显示图像的API

前者可以由操作系统的本机窗口化api处理,但是您也可以使用QT,GLFW,SDL或您更喜欢为跨平台兼容性设计的其他任何api。

后者可以通过良好的图形API(例如OpenGL)或DirectX(11-)(如果您正在为Windows环境开发)来处理。如果您想了解最先进的技术,也可以使用Vulkan或DirectX12,尽管我现在警告您,两者都比其前任产品复杂得多,因为它们除了最基础的东西外没有其他任何东西,因此请注意,对于那些人而言,这是一条陡峭的学习曲线。

对于音频处理,我没有任何我可以保证的建议(我的经验在那方面更受限制),但是有很多为此专门设计的API,因此只需对可用功能进行一些研究即可。


参考文献:

  1. https://www.reddit.com/r/cpp/comments/89q6wr/sg13_2d_graphics_why_it_failed/
  2. https://www.reddit.com/r/cpp/comments/89we31/2d_graphics_a_more_modest_proposal/