首先,让我们来看看主机的物理屏幕,这是用户可以欣赏到本节将要讨论的所有内容的地方。
显示
PSP 配备了4.3 英寸 TFT 液晶屏。 分辨率为480x272 (作为参考,像素数量相当于任天堂 DS 的 2.6 倍),最多可显示 16,777,216 种颜色。 色彩深度为 24 位(即所谓的 "真彩色")。
长宽比为几乎16:9,这种比例在当时正逐渐成为家用电视机的标准。 请注意,更大的视野范围也为游戏设计师提供了改进游戏体验的机会(尤其是在第一人称射击类游戏中)。
Graphics Engine介绍
现在我们来谈谈负责生成像素的组件-Graphics Engine (GE)。 该引擎位于"系统组"中,因此可以将其视为 "组中组"。 下面是它取得的一些成果:
PSP 游戏示例。 全部以最大分辨率(480x272 )显示。GE 负责绘制带有多种特性的 3D 图形(多边形),包括纹理映射、光照等,稍后您将看到这些特性。
Graphics Engine架构
GE子系统有许多有趣的特点值得一提,所以这部分会非常复杂。 别害怕! 为了避免混淆,我会尽量一步一步来。
首先,GE 由三个部分组成:
- 图形核心(graphics core):实际图形功能计算的地方。
- eDRAM 控制器(eDRAM controller):在 eDRAM 内存和核心之间调解访问。
- 总线矩阵(bus matrix):在系统总线和 GE 内部设备之间充当"总线仲裁器"(请记住,GE 位于系统组内)。
- 实际上,这个组件是一个带有逻辑的线网,但为了解释方便,我们可以用一个黑盒来简化表示。
采用这种设计的原因是主 CPU 和图形核心都可以访问这 2 MB 的 eDRAM。 因此,为防止拥塞,GE 内部的流量会通过另一条名为本地总线的高级高性能总线(AHB)(从 GE 的角度看是"本地")。 这允许图形核心执行其功能时无需系统总线来移动数据,防止系统其他部分阻塞。
本地总线与系统总线(128 位)一样宽,如果这还不够,图形核心还通过 512 位总线(由两条单向 256 位总线组成)直接连接 eDRAM。 在下一节中,您将看到它的必要性。
CPU 和 GE 之间如何通信? 如前所述,CPU 和图形核心都可以读取 eDRAM。 此外,图形核心还可以访问系统总线,从任何其他组件(包括主 RAM)获取数据。 这一切并不是凭空发生的。
简而言之,两个总线矩阵重新配置了本地总线和系统总线之间的连接。 每当有组件要访问"外部"总线时,总线矩阵就会对通信进行配置,使其中一个单元成为两条总线的主控单元,而不会出现其他重叠,这种情况会持续到指定的单元完成内存传输。
这种行为让我想起了众所周知的总线控制技术,即主导组件是"总线主控",完全控制总线,其余组件是"从属",等待命令。 不过,我不确定索尼工程师试图复制的是哪种协议/标准。 根据我的理解,我认为它可能与 I²C 有些类似,它是一种用于串行通信的协议(尤其适用于嵌入式系统),也执行总线控制。
硬件组织
现在,我们已经了解了各个组件及其相互之间的交互方式,让我们来看看有哪些与图形相关的信息可以存入内存。
GE 最终将向三个内存位置提取或填充数据:
- 2 MB eDRAM:前述 eDRAM。 用于存储帧缓冲区(frame-buffer)、深度缓冲区(z-buffer)和纹理缓冲区(texture buffer) 其内容由 GE 直接写入。 这块内存空间也被称为 "本地内存"。
- 如果需要,CPU 可以访问该内存,尽管其速度并不理想。
- 32 MB DDR SDRAM:CPU 的工作区,用于构建显示列表、顶点数据、纹理数据和颜色查找表(CLUTs,Colour lookup tables)。 在图形上下文中,这个内存块被称为"主机内存"(host memory)。
- 16 KB SRAM:一块便笺存储器,CPU 和 GE 都可以访问。
功能
与 PSP 的家用表亲一样,PSP 的图形系统侧重于光栅化。 不过,PSP 的 VRAM 只有 PS2 的一半大,总线速度也没有 PS2 快。 作为补偿,PSP的图形引擎采用了矢量处理器!
图形管线与 PS2 非常相似,只是增加了矢量处理阶段。 图形核心分为两个部分:表面引擎,负责矢量处理;渲染引擎,顾名思义,负责光栅化和效果处理。
虽然过去 已对其功能进行过解释,但图形管线本身的细节尚未说明。 事实上,程序员并不依赖这些信息来制作游戏。 不过,为了进行分析,我自己推导出了一个模型。
另外,我决定让这篇文章比以前的文章更具技术性。 我认为这是学习新概念和拓宽对计算机图形学视野的好机会。 说到这里,我强烈建议大家在继续阅读之前先了解一下 PS1 和 PS2 图形系统。
指令
Graphics Engine通过存储在主内存中的传统"显示列表"(display lists)进行控制。 CPU 构建它们,GPU 通过 DMA 读取。 显示列表告诉GPU要绘制什么、如何绘制以及在哪里绘制。 对于 PSP 而言,显示列表不仅限于渲染任务,还可以包括矢量转换。
为了确保 CPU 和 GPU 能够并行工作而不相互阻塞,处理列表的策略至关重要。 我们希望GPU加速操作,而不是成为负担。 因此,CPU 和 GPU 支持延迟渲染(deferred rendering),这种技术允许 CPU 在 GPU 处理前一组显示列表时构建下一组显示列表。 GE 通过指定显示列表在内存中的起始位置(基地址)和终止位置(停滞地址)来配置。 因此,有两种分配列表的方式:
- 双缓冲(Double buffered):有两块独立的显示列表区域。 一个传输到GPU,同时另一个由CPU填充。 当两个处理器都完成工作后,交换显示列表的位置。
- 存储控制(Store controlled):CPU填充的列表与DMA单元传输给GPU的列表相同,但CPU领先一些列表项,以避免重叠。 这种方法使用的内存较少,但如果 GPU 跟上 CPU 的速度,就会出现阻塞。
此外,索尼还表示 GPU 的 DMA 单元不仅仅是一个 "傻瓜式内存复制器",它还能理解传输的数据 。 因此,显示列表可以包括 jump 和 return 等 命令,以触发 DMA 分支并从其他地方获取数据。 这样,CPU 就不必在显示列表中嵌入模型、纹理等大型资源,减少了内存复制和带宽消耗。 这个系统继承自 PS2。
最后,DMA 还可以解释边界数据:结合存储在 GE 中的信息,DMA 将跳过不在显示区域内的绘制命令。 也可以在其他边界框内声明边界框,不过这个话题留到以后再说吧!
矢量处理
图形引擎首次具备了操作矢量的能力,这有助于减轻 CPU 的负担。 索尼公司使用它来加速过去经常由 PS2 的 VPU(矢量处理单元)通过微码 执行的任务。 虽然 GE 不如 VPU 灵活(GE 是一个固定功能单元),但它确实简化了许多编码工作(考虑到微码的学习曲线)。 GE 的矢量处理器被称为表面引擎(surface engine)。
表面引擎承担三种任务。 首先是对参数曲面的操作 。 还记得"无限世界"(Infinite Worlds)章节吗? 索尼公司解释说,虽然 PS2 有能力实现,但最终只有少数游戏使用了这个功能。 可能的原因包括多边形性能,以及设计和实现的难度。
为了解决这个问题,表面引擎实现了两种参数曲线:
- 贝塞尔曲线(Bézier):相对较快的函数,但其参数会改变整体形状。 此外,它还存在"连续性问题",表现为表面裂纹,因此不鼓励在动画中使用。 它通常用于地形生成。
- B-样条曲线(B-spline):需要更多计算,但可以解决连续性问题,并提供局部控制能力。 潜在的应用场景包括角色建模和动画。
两者都支持细节层次(levels of detail),这意味着开发人员可以设置任意值来改变细分级别,以影响生成模型的质量。
第二项任务称为顶点混合(vertex blending),这是一种用于动画的技术。 表面引擎提供了两种类型:
- 蒙皮(Skinning,又称骨架动画):运动依赖于附着在角色模型上的"关节"结构。 它通常用于行走、跳跃等普通动画。
- 变形(Morphing):使用一个模型的多个实例,并对使用线性插值它们进行平均,以获得"过渡效果"。 它通常用于人工动画(如面部动作)和特效。 这会带来更大的内存消耗和更陡峭的学习曲线。
需要指出的是,CPU 可能仍需要计算动画来处理游戏逻辑(如碰撞检测),因此它无法分担 CPU 上的所有工作。
最后,曲面引擎还提供剪切功能,即丢弃视口/矩形区域外的顶点。
光栅化
图形生成的下一阶段在渲染引擎(rendering engine)中进行(跳过指令处理器)。 在这里,矢量数据被转化为像素,与市面上的其他 GPU 基本一致。
引擎可绘制多种类型的图元,包括点、线、线段、三角形、三角形条、三角扇形,以及由二维矩形组成的精灵。 它还包含一个名为"数字差分分析器"(digital differential analyse)的单元,用于在光栅化和纹理映射过程中对数值进行插值。
开发人员可以提供一个投影矩阵来应用透视变换。 这将把他们的 3D 世界发送到 2D 空间(这样你就能在屏幕上看到它),并使用虚拟摄像头作为模型。
索尼并没有提供太多关于光栅工作原理的具体信息,因此也不清楚每个周期能够处理多少像素。 亚像素精度等现代功能被认为已经实现(否则,用户就会立即发现其缺失)。
纹理
对于一些人来说,这可能是最感兴趣的话题。 已是像素的多边形上可以绘制纹理。 在这一阶段,纹理贴图从内存中获取,并通过多种功能进行处理。 这一过程被称为纹理映射。
渲染引擎有三种映射模式,换句话说,有三种处理纹理贴图的方法:
- UV映射:模型的每个坐标都会映射到纹理的一个坐标上。
- 投影映射:简而言之,它模拟物理投影仪将纹理贴图投射到表面上。
- 阴影映射:在模型上最多可投射四种灯光(环境光、方向光、点光源或聚光灯)。 在将结果与另一张贴图混合时非常有用(您将在下一节看到更多内容)。
- 如果程序员提供的是纹理贴图而不是纯色贴图,就会产生"鱼眼"效果(适用于反射 ,又称环境贴图)。
- 该模式还允许卡通着色。
纹理可使用颜色查找表(CLUTs,Colour Lookup Tables)。 此外,该引擎还应用透视校正和双线性或三线性过滤进行插值。
另外,GE 中有 8 KB 纹理缓存,以节省带宽。 它采用"最近最少使用"(Lru)的方式管理。
最后,虽然该管线不可编程,但开发人员可以发送额外的颜色与纹理混合。 此外,还有颜色加倍(将颜色的 RGB 值翻倍)、颜色添加(将主要颜色与次要颜色结合)和雾化 (在远处的多边形上添加雾效果)。
像素操作
我们即将到达管线的尽头。 最初的几何图形已经转化为丰富多彩的像素,是时候决定如何处理它们了。
有些像素可能对应于本帧不需要的几何图形(它可能被遮挡、遮罩等)。 为了过滤掉这些像素,GE可以执行以下测试:
- 剪裁(Scissoring):丢弃远离任意区域的多边形。
- 深度范围(Depth range):放弃太远或太近的多边形(由开发人员设置参考值)。
- 颜色(Colour):丢弃等于或不等于 RGB 值的像素。
- Alpha:比较像素的 Alpha 值和参考值。
- 模版(Stencil):与 alpha 测试类似,但依赖于模版值。
- 深度测试(Depth test):延迟Z缓冲处理。
之后,像素还会通过以下可选的模块进行进一步的效果处理:
- Alpha混合(Alpha blending):使用不同的算术运算符将非不透明像素与帧缓冲区中的像素结合。
- 抖动(Dithering):平滑颜色变化。
- 颜色钳位(Colour clamping):对齐 RGB 值,使其适合帧缓冲区格式。
- 逻辑运算(Logical operation):使用逻辑运算符(
AND、OR等)决定如何将新帧与现有帧缓冲区合并。 - 屏蔽(Masking):顾名思义,屏蔽z缓冲区或帧缓冲区。
像 抗锯齿 这样的复杂功能是通过上述功能策略性组合实现的。 最后,输出的像素被写入帧缓冲区,然后再发送显示。
观察
事实证明,PSP 继承了 PS2 的各种功能。 但与提供许多需要手动配置的通用可编程单元相比,现在的功能都被硬编码在芯片上。 我推测这样做有两个原因:一是为了减少晶体管的数量,这样它就能装入 Tachyon 并保持主板的"便携性",二是为了方便将 PS2 代码移植到新的主机上。
交互模型
为了说明该系统对模型设计的影响,并将其与 PS2 和 Nintendo DS 进行比较,以下是两个为 PSP 设计的模型示例。 别忘了,查看器是可互动的!

"现代版本"中可用的互动模型
合金装备:掌上行动 加强版(2006)
1,383个三角形

"现代版本"中可用的互动模型
Daxter(2006).
1,374个三角形
视频输出
该控制台的第一个型号(1000)在左下角(音频插孔旁边)有一个名为远程端口(remote port)的专有视频端口。
远程端口使用 RS-232 协议 ,这是一种古老的串行数据传输标准。 尽管这个协议没有公开给开发者,也没有文档记录,但市场上还是出现了几款带有控制按钮的音频耳机。 显然,它们使用串行端口向主机发送播放、暂停等命令。
在后来的型号(2000 和 3000)中,远程端口增加了一个额外的 YCbCr 引脚。 索尼提供了三种视频线缆(component、S-Video 和composite),用户可以通过该接口在电视上看到 PSP 屏幕上的内容。
视频电缆将以逐行或隔行扫描模式发送分辨率为720x480(NTSC)或 720x576(PAL)的图像(后一种仅适用于 3000 型)。 由于 PSP 的分辨率为 480x272 像素,游戏将显示黑边以校正宽高比。 不过,当控制台运行"XMB"可视化界面时,黑边将不会显示,该界面原生支持根据视频线缆调整其分辨率。













