在PC上编程图形和声音 - 总新手问题,以及很多问题!

时间:2010-06-09 05:11:04

标签: graphics audio sprite

这不完全是一个编程问题(或者是它?)但我想知道:

如何通过PC从代码和输出处理图形和声音?

我对图形的猜测:

  1. 某处有一些预留的内存空间,可以为显示器的图形输出框架提供足够的空间。 IE:800 x 600,24位色彩模式== 800x600x3 = ~1.4MB内存空间

  2. 在每次刷新之间,程序将视频数据写入此空间。此操作在监视器刷新之前完成。 假设一个简单的2D游戏:图形数据存储在机器代码中,代表颜色值的字节数。根据正在运行的程序指示PC,处理器读取适当的数据并将其写入存储空间。

  3. 当监视器需要刷新时,它会逐字节地从每个存储空间读取数据,并根据每个像素的每个颜色元素的值激活硬件。

  4. 所有这一切当然都是疯狂的,并且每秒重复x次,x是显示器的刷新率。我通过避免谈论双缓冲等来简化我自己可能不正确的解释

    以下是我的问题:

    a)上述猜测有多接近(三个步骤)?

    b)如何在纯C ++代码中加入图形?我假设每个人都做的实际操作是使用图形库(SDL,OpenGL等),但是,例如,这些库如何完成它们的工作?在纯C ++代码中手动包含图形(例如,2D恶意代码)是否需要创建二维位值数组(或三维以包含每个像素的多个RGB值)?这是怎么回事当天回来的?

    c)另外,从上面继续,SDL等使用位图的库实际上只是将位图/ etc文件构建成可执行文件的机器代码并使用它们就好像它们是在问题b中提到的相同内容中构建的一样以上?

    d)在我假设的上述第3步中,是否涉及任何寄存器?比如,您可以将一些字节值写入某个寄存器,以在屏幕上输出一个字节的单一颜色吗?或者它是纯粹的专用内存空间(= RAM)+硬件交互?

    e)最后,声音的所有这一切是如何完成的? (我不知道:))

2 个答案:

答案 0 :(得分:2)

一个。

  1. 很久以前,就是这样,但已经有一段时间了。大多数硬件仍然支持这种类型的配置,但主要是作为后备 - 它们不是真正的设计工作方式。现在大多数显卡上都有一块内存,它也被映射为CPU可通过PCI / AGP / PCI-E总线寻址。该块的大小或多或少与屏幕上显示的大小无关。

  2. 同样,有一段时间它是如何运作的,但现在大多不是这样了。

  3. 大部分是正确的。

  4. 湾OpenGL通常包含几个部分 - 一个作为操作系统一部分的核心库,以及一个由图形芯片组(或可能是卡)供应商提供的驱动程序。 CPU和GPU之间的精确分配虽然有所不同(供应商之间,随着时间的推移,来自单个供应商的产品等)SDL是围绕像您所描述的简单帧缓冲的一般概念构建的。 p>

    ℃。您通常将比特图,纹理等构建为专门用于此目的的单独文件。

    d。虽然主要的图形芯片组供应商(ATI / AMD和nVidia)倾向于保持他们的寄存器级文档或多或少的秘密(虽然这可能已经改变 - 开源开发人员对文档的持续压力,但涉及到相当多的寄存器。 ,而不仅仅是闭源驱动程序)。大多数硬件都具有专用线绘图等功能,您可以将(例如)线参数放入指定的寄存器中,并绘制您指定的线。确切的细节因广泛而有所不同......

    即对不起,但这已经很久了,声音覆盖了很大的区域......

答案 1 :(得分:-1)

对于图形,Jerry Coffin有一个很好的答案。

声音实际上与您(OP)对图形处理方式的描述类似。在一个非常基础的层面上,你有一个“缓冲区”(某些内存,某处)。

您的软件会将您想要播放的声音写入该缓冲区。它基本上是在给定时刻对扬声器锥体位置的编码。

对于“CD质量”音频,您每秒有44100个值(“采样率”为44.1 kHz)。

稍微落后于写入位置,您可以从缓冲区中的读取位置读取音频子系统。

此读取位置将略微落后于写入位置。后面的距离称为延迟。较大的距离会带来更多的延迟,但也有助于避免读取位置赶上写入位置的情况,使声音设备无法实际播放!