graphics - 在PC上编程图形和声音-共有新手问题,其中很多!

标签 graphics audio sprite

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

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

我对图形的猜测:

  • 某处有一些保留的内存空间,可以为监视器的一帧图形输出恰好有足够的空间。
    IE:800 x 600、24位彩色模式== 800x600x3 =〜1.4MB内存空间
  • 在每次刷新之间,程序会将视频数据写入此空间。此操作在监视器刷新之前完成。
    假设一个简单的2D游戏:图形数据以代表颜色值的字节数形式存储在机器代码中。根据正在运行的程序指示PC的方式,处理器读取适当的数据并将其写入内存空间。
  • 当监视器刷新时,它将逐字节读取每个内存空间,并根据每个像素每个颜色元素的值激活硬件。

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

    这是我的问题:

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

    b)如何将图形结合到纯C++代码中?我假设每个人都在实践中使用图形库(SDL,OpenGL等),但是例如,这些库如何完成其​​工作?在纯C++代码中手动包含图形(例如2D spite)是否会涉及创建位值的二维数组(或三维创建每个像素包含多个RGB值的三维数组)?这是怎么回事?

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

    d)在我上面的假设步骤3中,是否涉及任何寄存器?就像,您可以将某个字节值写入某个寄存器以在屏幕上输出一个字节的单色图像吗?还是纯粹的专用内存空间(= RAM)+硬件交互?

    e)最后,如何完成所有这些声音工作? (我不知道 :) )

    最佳答案

    一种。

  • 很久以前就是这种情况,但是已经有一段时间了。大多数硬件仍将支持这种类型的配置,但主要是作为后备-这并不是它们真正设计的工作方式。现在,大多数图形卡上都有一块内存,这些内存也已映射为可由CPU通过PCI / AGP / PCI-E总线进行寻址。但是,该块的大小或多或少与屏幕上显示的内容无关。
  • 再次说明,这一次通常是最有效的方式,但现在不再是这种情况了。
  • 大多数情况下正确。

  • b。 OpenGL通常分为几部分-操作系统的一部分是一个核心库,而图形芯片组(或可能是卡)供应商则提供了一个驱动程序。尽管CPU和GPU之间的确切劳动分配有所不同(在供应商之间,一段时间内单个供应商的产品内等等),但SDL围绕着您所描述的简单帧缓冲区的一般概念而构建。

    C。通常,您会按照特定的格式将位图,纹理等构建到单独的文件中。

    d。尽管主要的图形芯片组供应商(ATI / AMD和nVidia)倾向于或多或少地保持其寄存器级文档的 secret (尽管这种情况可能已经改变了,但开放源代码开发人员一直在不断要求其提供文档) ,而不仅仅是封闭源代码驱动程序)。大多数硬件都具有专用的线条画等功能,您可以在其中将(例如)线条参数放入指定的寄存器中,并绘制指定的线条。确切的细节差别很大...

    e。抱歉,但是已经很长了,声音覆盖的面积很大...

    关于graphics - 在PC上编程图形和声音-共有新手问题,其中很多!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3003215/

    相关文章:

    c++ - 世界空间的切线空间(TBN 矩阵)

    java - Java 中基于代理的建模 - 动画问题

    c# - 在 Azure 上使用 C# 修剪 AAC 音频文件

    html - 无法将 SVG 符号 Sprite 用作背景

    html - 导航 Sprite 未对齐

    iphone - Cocos2D随机 Sprite 运动

    java - Java图形中绘制平滑曲线

    Java代码优化

    matlab - 在 MATLAB 中使用两个 channel 生成声音

    android - 频率记录如何正确与扬声器配合使用?