* K$ u) A" j/ y6 W9 P- s
SGL的运作游戏的基本
- s2 G: {' G7 e. c, O! _4 N3 I5 S7 T" p$ d' i5 u- q' }4 n( o$ s
在讨论SGL之前,先和大家说明一下制作一个游戏的基本吧。不管是红白机还是MEGADRIVE还是PS都是共通的基本。2 D; [8 m) b: K; t+ w- M6 W
先想象一下《魂斗罗》吧。无论是通过手柄操纵的人物,射出的子弹,还是运动的敌人,都是程序在控制他们。游戏开始后只有自己操控的人物的时候和BOSS带着一帮小怪大闹的时候的运算处理量是不同的。8 J/ K m+ I/ _3 c' w; I4 m
当然程序的处理速度也会有变化。游戏开始当初,处理很快就会结束。但BOSS战时,程序处理就需要相当长的时间。5 s4 |' T+ A. i
但是,游戏并不会在开始的时候运行的飞快,BOSS战时运行的龟慢(红白机是性能过低所以才会如此。有种可爱的拼命感,所以个人挺喜欢)。这是因为游戏会根据「画面绘制的实际」来调整游戏的处理速度。5 T7 L( a8 \- s" E* [, [/ D7 n
电视的NTSC(日本的游戏机,日本的电视信号规格)信号制式,一秒钟描绘60帧画面,游戏的程序以描绘1帧的时间为基准处理。具体地说就是,游戏的程序必须在1/60秒内完成处理。程序提早完成处理也不会有问题。处理结束后,CPU会等待画面绘制结束。" ^+ \3 A0 j( ~+ l0 N
5 r3 G( X9 L Q4 P, P
6 i; ?1 ]+ O# g7 @等待画面绘制完成的处理是以一定的速度进行。画面绘制处理完成后,再输出新的画面,并进行下一轮的游戏程序处理。如此一般,游戏的画面就会完整,漂亮的出现在电视机上。
) @5 i! H% O& y. h6 L, q* P ]8 \顶点坐标演算6 B5 X" M% l0 a- a4 F* m3 c
运用SGL制作游戏,只要遵循刚才提到的「基本」就可以。游戏的处理过程中,想要展现多边形的话,只需要向SGL指示「在某个立体坐标系中放置多边形」。# {5 Z8 B. L" {% K, h! W
程序猿不需要去在乎顶点坐标演算的过程内容和结果。事实上,也无法知道。7 L) t! x# V0 y8 [4 N, S" y. U1 e
向SGL指示显示多边形,程序猿会以为「SGL会进行计算」。试着不然,SGL根本就不会去进行多边形演算,仅仅试将输入的值放进内存,随即重新开始处理游戏程序。所以程序猿无法通过SGL来访问顶点坐标演算的过程、内容和结果。
6 Y5 J$ o9 R. d) x7 f( A, @5 A3 X4 s进行顶点坐标演算的是副CPU。就是大家以为没有在工作的那个副CPU。一个员工放在工作岗位上,没有一个老板会容忍这个员工每天只会打瞌睡、划手机、吃垃圾外卖。副CPU在发现内存中有数据之后就会立刻对数据进行顶点坐标演算。
4 p; m! l" F3 j Q [: A- a刚才提到过顶点坐标演算很复杂,对于SH2来说是一个很大的负担。将顶点坐标运算交给副CPU,主CPU会继续进行游戏程序的处理。
: X* K4 G$ ]7 v+ Q2 r游戏程序处理就代表被显示的多边形数据也源源不断的被生成。副CPU根本就没有空闲。; \" e6 y8 l% z( o6 x
事实上,按照这个方法进行,处理时间依旧不够。对于副CPU而言工作量过多,主CPU往往会先完成处理。主CPU在完成游戏程序的处理之后,会等待画面绘制完成。这时,程序猿会对SGL设定激发SGL的功能指令「停止处理等待画面绘制完成」。对于程序猿来说CPU已经停止了,而SGL会依旧保持活跃。
8 ?" ]& H$ Q$ L$ c, C( t4 r仅依靠副CPU的算力,时间不够。在主CPU完成处理后SGL就会让主CPU也参与顶点坐标演算。顶点坐标演算结束后,SGL会继续调用两个CPU,将计算结果沿着Z轴排列,并处理成图像引擎VDP1可以调用的命令符。, L# n0 L3 s* q9 a
在这一切都完成之后,才会进入「等待画面绘制完成」的状态。主CPU会重新开始处理游戏程序;副CPU将处理画面输出的问题。5 r0 t) i0 s2 p, I
总体的思路就是,主CPU负责处理游戏程序,副CPU负责其他,在主CPU处理完游戏程序后会辅助副CPU。; S- ~, i# u! | ]: N4 a8 t+ R
副CPU的运行指令
+ j9 r' c) [7 ^) cSGL中有一个明确的指令「让副CPU运行程序」。这个指令会将放置程序的内存地址交给副CPU,副CPU在空闲时会进行处理。因为是空闲时进行处理,所以也无从知晓这个程序何时会被处理。如果是3D游戏,副CPU也很难会有空闲。世嘉提供的信息也很少,所以也很少会有游戏使用这个功能。
/ [* a: n8 l9 x( ~9 t3 }所以「很多游戏都只会用到一个CPU」这样一个误解,应该是来源于此。
8 g2 U+ W, Z8 gSGL本身也不是3D游戏专用的运行库,SGL也可以用来制作2D游戏。而在处理2D游戏时,副CPU也需要处理画面输出、音乐处理等工作。不管怎样,与「很多游戏都只会用到一个CPU」谣言相反,大部分游戏都会用到两个CPU。
- ]/ l# A* [7 }7 U, N; `有一种说法「两个CPU无法获得两倍的性能,大概就是1.2倍到1.4倍,撑死1.8倍」。这是必然。如今的PC/AT电脑也无法通过增加一个CPU来获得两倍的性能。问题的根本在于总线带宽。有两个CPU,两个CPU之间就会抢夺总线带宽,甚至会导致一方的CPU对内存或者其他存储器或者元件进行访问而停止工作。
7 P0 \' I, `8 ~3 t) q: g& [8 ^SGL则会将两个CPU进行合理分工,让副CPU主要进行顶点坐标演算。毕竟和PS相比土星最大的弱点是不擅长顶点坐标演算。SGL的顶点坐标演算部分完全由汇编编写,可以完整地收纳在缓存了并尽可能高速运作。9 p+ f1 U; _2 F9 Z) p- e+ q
在使用SGL时,副CPU不会占用总线来对程序进行访问。也就是说副CPU不会妨碍主CPU的工作。虽然副CPU在进行顶点坐标演算时会占用总线访问内存,但大部分时间还是在运算坐标。所以抢夺总线带宽的事情基本不会发生。主CPU在完成游戏程序的处理后会进入到等待状态。有SGL的存在,在主CPU完成工作后,SGL会继续调用主CPU,合理进行工作分配。& y2 C! b* E: u4 h2 C" u! e, p0 B) O
可以说世嘉尽了最大的努力去发挥双CPU的能力。/ j! S* U! U4 K" p" P8 I- M
|