pues mira... puedo equivocarme en bastante, pero mas o menos intentare acercarme:
2D:
la velocidad 2D esta muy influenciada por la velocidad en la que el blitter de video sea capaz de copiar datos de algun sitio a la RAM DE VIDEO (o VRAM). ¿cuantos sprites seria capaz de plantar determinado hardware? para eso habria que mirar el ancho de banda maximo que posee el blitter. Como normalmente en las consolas 2D el blitter de video es un chip dedicado con su memoria dedicada, el ancho de banda es el del interfaz VRAM<->GPU.
si imaginamos un sprite de 256x256x4(32 bits de color)=256KB, si tenemos un ancho de banda en el blitter de 1GB/s, pues cuestion de hacer la division. Ojo, hay que tener en cuenta que el blitter LEE el sprite de la VRAM y LO ESCRIBE(copia) en el frame a presentar, o sea, que si el ancho de banda en 1GB/s half-duplex, en realidad estariamos trabajando con 500MB/s:
500*1024(paso a KB)/256=2000 sprites/segundo. que si trabajamos en animacion 2D a 25fps (lo normal en animacion 2D) tenemos que por cada frame podemos plantar 2000/25=80 sprites de 256x256 a color real por frame.
por supuesto, la GPU debe ser capaz de dar entrada y salida a ese GB/s de ancho de banda que puede dar el bus.
antiguamente, donde el ancho de banda de la VRAM era superior a la capacidad de procesamiento de las CPU del momento (hablo por ejemplo de un motorola 68k clokado a 16Mhz), se usaba una GPU dedicada que estubiera especficamente diseñada para hacer ese 'blitting' lo mas rapido posible, y con todos los efectos posibles implementados en hardware, y de camino, se dejaba libre la CPU para mantener la logica del juego (numero de vidas, fisica, etc...)
3D:
Aqui ya hablamos de muchas cosas mas, en resumen un buen motor 3D es aquel que nos permite un mayor 'fillrate'. el fillrate es la capacidad de 'rellenado', que al fin y al cabo, es un blitter como los 2D. un motor 3D basico lo que hace es coger un poligono, diseñar y dibujar 'dentro de si mismo' el sprite que esta definido por ese poligono, y 'blittearlo' en la pantalla. basicamente es un blitter, pero ademas es creativo, porque tiene que 'imaginarse' el sprite definido por 3 coordenadas antes de blittearlo (o blittearlo mientras se lo imagina/calcula, para el caso es lo mismo)
lo que sucede es que esta mucho mas especializado, puesto que han evolucionado tanto que ademas de un blitter y un motor de coordenadas, ademas incluyen un motor de texturas (lineares, bilineares, trilineares, ...), un motor de translacion, un motor de iluminacion... se han especializado tanto que practicamente lo que se hace actualmente es decirle al motor 3D:
- estas son las 3 coordenadas de los 3 vertices
- rotamelo sobre si mismo x/y/z grados (FLOPS)
- trasladamelo a x/y/z (FLOPS)
- rotalo con respecto a la camara x/y/z (FLOPS)
- calcula como quedaria en pantalla (proyeccion) (FLOPS)
- calcula la iluminacion segun a1/a2/a3/... puntos de luz con diferentes colores (FLOPS)
- le tienes que aplicar esta textura, y algunas mas (multitextura) (BLITTER)
- ¡BLITTEALO! (Obvio...)
como ves, depende de muchas cosas, pero en principio... depende de 2 grandes cosas:
- ancho de banda con la VRAM (Blitter)
- FLOPS de potencia de calculo de la CPU/GPU dedicada al calculo de vertices
con respecto a los FLOPS, para calcular un unico poligono con un unico punto de luz se necesitan del orden de unos 50FLOPS (si, 50 operaciones matematicas con punto flotante, si realmente hiciera falta, se podria hacer con numeros enteros, pero en coma flotante es mas comodo) por poner un punto comparativo, DREAMCAST tiene una potencia segun caracteristicas de unos 500 GFLOPS, si ponemos el numero, vemos que una dreamcast tiene el potencial de calcular (ojo CALCULAR) 500/50=10Gpol/s=10.000 millones de Pol/s
pero claro, el problema esta en blittear eso, que es lo mas pesado, porque aqui vuelves a estar limitado por el ancho de banda de la VRAM, en coger la textura (o mas de una textura), calcular sus posiciones (por cada pixel tienes que calcular la coordenadas de la textura o texturas a colocar) y luego ver si segun el eje Z ese pixel termina tapado o no y entonces dibujarlo o no... Y OJO, ESO HACERLO POR CADA PIXEL... ahi es donde hace falta el resto de la potencia en MIPS o FLOPS, ahi es donde realmente se gasta, porque por cada pixel a plantar hacen falta 2 divisiones, 2 sumas y 1 lectura de VRAM por cada textura (por cada textura, ojo, a un poligono se le pueden aplicar varias texturas, entre ellas, mapas de iluminaciones y reflejos, hoy dia es normal dibujar 4 texturas por poligono), sumar los componentes RGB de todas las texturas (1 suma mas por textura), 2 divisiones y 2 sumas por el punto a colocar, otra lectura al Zbuffer para ver la profundidad, ver si corresponde colocar o no, escribir a la VRAM, escribir en el Zbuffer el valor actualizado... y seguimos con el siguiente pixel...
la regla del pulgar viene aqui... por cada 100Mhz en la GPU, puedes dibujar +o- 5 millones de poligonos completos (hablamos de una GPU dedicada y especializada en eso, si es una CPU generalista, son muchos, MUCHISIMOS menos, tanto que veriamos si llegabamo al medio millon).
realmente no son muchos, cogemos los 5 millones y lo dividimos entre 60 fps que queremos conseguir: 5/60=83.333 pol/frame. ahora empezamos a calcular... un escenario tipico 3D medianito-pequeño gasta 100.000 poligonos... pero claro, el 80% del escenario queda fuera de la vista del espectador, asi que podemos pasar de pintar positivamente el 80%, pero claro, hay que rotarlo y calcularlo aunqeu no se pinte... pongamosle que a efectos estadisticos el escenario nos pesa 40.000 poligonos. un cuerpo humano para que sea creible debe tener entorno a los 1000 poligonos (los de quake1 tenian unos 100-200 poligonos, los de Quake3 tenian 1200 poligonos largos, los de DOOM3 tienen mas de 5000 poligonos con su respectivo bump-mapping, los modelos de DOA3 andan por los 20.000 poligonos). un coche lo podemos hacer con 100 poligonos y se vera de pena. PGR2 tenia coches de 20.000 poligonos y ya se veian bien.
bueno, eso es todo... ¿tochazo grande eh...?