Graphics 在PC上编程图形和声音-完全是新手问题,而且很多!

Graphics 在PC上编程图形和声音-完全是新手问题,而且很多!,graphics,audio,sprite,Graphics,Audio,Sprite,这并不是一个明确的编程问题(或者是吗?),但我想知道: 电脑如何从代码和输出中处理图形和声音 我对图形的猜测是: 某个地方有一些保留的内存空间,正好可以容纳显示器的图形输出帧。 IE:800 x 600,24位颜色模式==800x600x3=~1.4MB内存空间 在每次刷新之间,程序将视频数据写入此空间。此操作在监视器刷新之前完成。 假设一个简单的2D游戏:图形数据以表示颜色值的字节数存储在机器代码中。根据正在运行的程序指示PC的内容,处理器读取适当的数据并将其写入内存空间 当显示器需要刷新时,

这并不是一个明确的编程问题(或者是吗?),但我想知道:

电脑如何从代码和输出中处理图形和声音

我对图形的猜测是:

  • 某个地方有一些保留的内存空间,正好可以容纳显示器的图形输出帧。 IE:800 x 600,24位颜色模式==800x600x3=~1.4MB内存空间

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

  • 当显示器需要刷新时,它逐字节读取每个内存空间,并根据每个像素的每个颜色元素的值激活硬件

  • 所有这些当然发生得非常快,每秒重复x次,x是显示器的刷新率。我通过避免谈论双缓冲等简化了自己可能不正确的解释

    以下是我的问题:

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

    如何在纯C++代码中合并图形?我假设每个人都会使用一个图形库(SDL、OpenGL等),但是,例如,这些库是如何完成它们的工作的呢?在纯C++代码中手动包含图形(例如,2D恶意)是否涉及创建二维值(或三维以包括每个像素的多个RGB值)的二维数组?这就是今天要做的吗

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

    d) 在我上面假设的步骤3中,是否涉及任何寄存器?比如,你能把一些字节值写入寄存器,在屏幕上输出一个字节的单色吗?还是纯粹的专用内存空间(=RAM)+硬件交互

    e) 最后,这些声音是如何做到的?(我不知道:)

    a

  • 很久以前,情况就是这样,但好久不见了。大多数硬件仍然支持这种类型的配置,但主要是作为一种后援——这不是它们真正设计的工作方式。现在,大多数图形卡上都有一块内存,该内存也映射为可由CPU通过PCI/AGP/PCI-E总线寻址。不过,该块的大小多少与屏幕上显示的内容无关

  • 再一次,在一段时间里,这就是它的工作原理,但现在已经不是这样了

  • 基本上是对的

  • b。OpenGL通常由几个部分组成——作为操作系统一部分的核心库,以及图形芯片组(或可能是卡)供应商提供的驱动程序。CPU和GPU之间劳动力的精确分配有所不同(在供应商之间,随着时间的推移,在单个供应商的产品中,等等)。SDL是围绕您所描述的简单帧缓冲区的总体思想构建的

    c。通常将位图、纹理等构建到单独的文件中,格式专门用于此目的

    d。虽然主要的图形芯片组供应商(ATI/AMD和nVidia)倾向于或多或少地对其寄存器级文档保密(尽管这可能已经发生了变化——开源开发人员对文档不断施加压力,而不仅仅是封闭源代码驱动程序)。大多数硬件都有类似于专用线条绘制的功能,您可以将(例如)线条参数放入指定的寄存器中,然后它将绘制您指定的线条。但具体细节差别很大


    e。对不起,这已经很长时间了,而且声音覆盖了相当大的区域…

    对于图形,Jerry Coffin得到了一个相当好的答案

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

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

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

    在写位置后面一点,音频子系统从缓冲区中的读位置进行读取

    该读取位置将稍微落后于写入位置。后面的距离称为延迟。距离越长,延迟越大,但也有助于避免读位置赶上写位置,使声音设备无法实际播放