Foros - Stratos

Proyectos => IndieLib => Mensaje iniciado por: Loover en 28 de Marzo de 2008, 10:06:10 AM

Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 28 de Marzo de 2008, 10:06:10 AM
Ale, una nueva prueba: http://www.pixelartgames.com/temporal/ovnis.rar

En este caso quería dibujar muchos, muchos, muchos sprites a la vez y ver como se comportaba la librería. La demo muestra un terreno grande (puedes desplazarte con el ratón) que apenas se ve pues está cubierto por hileras e hileras de ovnis animados rotando.

Dentro del .rar, en la carpeta vc2008, hay dos ejecutables. Uno a una resolución tocha en panorámico (1440,900) solo os irá a los que tengais un monitor panorámico. El otro, 1024x768 en modo ventana, debería iros a todos.

Todos los objetos gráficos se dibujan independientemente unos de otros usando DrawPrimitiveUp. No hay instancing ni nada parecido. A mi me da unos 84FPS a  (1440,900). Usando DrawPrimitive me daba lo mismo, si acaso uno o dos FPS menos. Por lo que parece ser que para dibujar pequeños objetos haciendo varias llamadas, ambos se comportan igual, al menos en mi tarjeta.

El Vsync está desactivado (para poder ver a cuantos FPS llega), por eso puede que al desplazaros no quede muy bonito (temblará algo la imagen al no esperar al refresco del monitor).

¿Podrías probarlo por favor y comentarme cuantos fps os da? ¡Gracias!

(http://www.pixelartgames.com/temporal/hieleras_ovnis.jpg)
Título: BenchMark 01: Alien Invasion
Publicado por: [EX3] en 28 de Marzo de 2008, 11:38:19 AM
Cita de: "Loover"Todos los objetos gráficos se dibujan independientemente unos de otros usando DrawPrimitiveUp. No hay instancing ni nada parecido. A mi me da unos 84FPS a (1440,900). Usando DrawPrimitive me daba lo mismo, si acaso uno o dos FPS menos.
Viva la fuerza bruta :D

Weno, como tengo el macBook retirado temporalmente no me queda otra que hacer la prueba con el PC malucho de oficina que tengo en el trabajo :)

Si no me equivoco la maquina en cuestion es:
Intel Pentium 4 HT 3.00 GHz (aunque me aparecen dos procesadores, uno a 2.99 no se si es un doble nucleo primitivo :?)
512 Mb de RAM
Intel Graphics 82945G Express Chipset Family (Intel 945G Express)
Windows XP Pro SP2
DirectX 9.0c (sin actualizar seguramente)

La prueba a 1024x768 me iba a unos 74/75 fps constantes inclusive con el scroll en movimiento.

Cuando llegue a casa, si la tostadora del AMD se digna a arrancar antes de media hora (no todos los AMD sufren a 86º de temperatura y siguen funcioando :P) te lo pruebo en resolucion panoramica y con una GeForce3 con DirectX+Drivers actualizados al dia ;)

Salu2...

P.D.: 1440x900 es una resolucion panoramica estandar? por que creo mi monitor panoramico soportaban esta resolucion, que a lo mejor me equivoco (me sacas de los estandares 800x600 y 1024x768 ya me pierdo :lol:)
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 28 de Marzo de 2008, 12:22:09 PM
¡Muchas gracias [EX3]!

Pues parece que te va bien, ¿no? No están mal esos fps para esa máquina.

1440x900 => Bueno, no sé si es standard (¿standard con respecto a quién?) pero es la resolución máxima que permite mi monitor y la resolución máxima que me dejan poner varios juegos (Counter Strike, Harvest Massive encounter, etc). En realidad es la resolución a la que mejor veo las cosas.
Título: BenchMark 01: Alien Invasion
Publicado por: [EX3] en 28 de Marzo de 2008, 02:07:30 PM
Pues se me olvido comentarte pero si, para la chusta de maquina, la grafica integrada y lo mal que va ultimamente dicha maquina, creo que el resultado es mas que bueno :)

Sobre lo de las resoluciones, muchas graficas o monitores (creo que es el segundo quien lo define) soportan los estandares hasta 1280x1024 fijo (las mas antiguas, sobre todo las de 15' no pasaran de 1024x768), esto quiere decir que cualquier programa accedera a dichos modos si el driver y el hardware lo permiten. Despues comienzan a a񡤩r a veces resoluciones no estandares pero dentro del rango estandar (entre 640x480(VGA) y 800x600(SVGA) (y descontando los modos primitivos CGA y QCGA) hasta 1280x1024 (SXGA)) y otras resoluciones, varias panoramicas, dependen de cada hardware. Aqui te dejo un enlace de las resoluciones estandares y las derivadas que han surgido:

http://en.wikipedia.org/wiki/Display_resolution

Aun asi muchas resoluciones panoramicas estandares tampoco estan presentes en todos los monitores, por ejemplo, en el macBook 13' tengo 1280x800 (WXGA) mientras que mi monitor soporta 1280x720 (HD 720). La verdad que para 3D no tanto pero para 2D es un rollo calibrar muchas veces un juego para funcione en varias resoluciones, sobre todo si te fallan los calculos de escala como a mi, que intente implementar autoescalado para los modos de videos mas comunes y se me descuadraba todo :?

Salu2...

P.D.: Un detalle, esto de los modos de video solo afecta a modos de video a pantalla completa. En modo ventana puedes aplicar sin miedo cualquier modo que quieras o te inventes.
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 28 de Marzo de 2008, 02:14:33 PM
Sí, es un rollo intentar hacer algo de autoescalado y tal. Creo que para un juego, lo más normal es a mayores resoluciones permitir (si es por ejemplo un RTS) ver más terreno, a la par que redibujas la GUI de una forma u otra según la resolución. La puedes dibujar con posiciones relativas al tamaño y así te funcionará en todas.
Título: BenchMark 01: Alien Invasion
Publicado por: Vicente en 28 de Marzo de 2008, 02:48:36 PM
Lo de permitir ver más terreno si el juego tiene multijugador es un peligro, tener más resolución no debería darte una ventaja competitiva :S

Un saludo,

Vicente
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 28 de Marzo de 2008, 03:58:27 PM
Diselo a los del Age Of Empires :D
Título: BenchMark 01: Alien Invasion
Publicado por: Vicente en 28 de Marzo de 2008, 04:15:59 PM
Estooooo:

Intel Q6600 2.4GHz, 4GB Ram, 2x 8800GT 512MB, Windows Vista Ultimate 64, DirectX 9c (Agosto 2007)

90FPS

Espero que sea algo de tu librería porque si es de mi máquina me pego un tiro :p

Y respecto a los de Ensemble con el AoE: es una cagada igualmente :p

Un saludo!

Vicente
Título: BenchMark 01: Alien Invasion
Publicado por: yens en 28 de Marzo de 2008, 05:44:38 PM
Cita de: "Vicente"Estooooo:

Intel Q6600 2.4GHz, 4GB Ram, 2x 8800GT 512MB, Windows Vista Ultimate 64, DirectX 9c (Agosto 2007)

90FPS

Espero que sea algo de tu librería porque si es de mi máquina me pego un tiro :p

Y respecto a los de Ensemble con el AoE: es una cagada igualmente :p

Un saludo!

Vicente

No creo que sea de máquina.

A mi me da 70FPS a 1680x1050 con una 7800GT, San Diego 3700, 2gb de ram. Aunque mi PC no rinde todo lo que debería como ya comentara en otro post...
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 28 de Marzo de 2008, 05:56:37 PM
Hombre, 90fps, no está nada mal con la burra de sprites que hay en pantalla.

Habría que ver si con instancing la cosa iría mucho más rápida.


Lo del Age of Empires, jorobaba cuando algún colega tenía un ordenador mejor, y veía más pantalla :D. Pero es que un juego 2d, no hay otra manera si quieres dar diferentes resoluciones, porque para escalar los sprites simplemente mejor dejar solo una resolución. En el Harvest tb lo hacen como en el Age Of Empires. No recuerdo que hacía el StarCraft 1.
Título: BenchMark 01: Alien Invasion
Publicado por: Vicente en 28 de Marzo de 2008, 07:56:41 PM
Starcraft no te permitía cambiar de resolución :)

Respecto a los 90 FPS supongo que tu test está limitado por la CPU (solo aprovechará un core y cada core solo va a 2.4).

Un saludo!

Vicente
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 28 de Marzo de 2008, 08:20:04 PM
No tengo código específico para aprovechar los core, ni siquiera sabía que eso existía. Simplemente dibujo usando Direct3d y a correr.

¿Algún tutorial sobre eso de los cores?
Título: BenchMark 01: Alien Invasion
Publicado por: AgeR en 28 de Marzo de 2008, 09:21:16 PM
A mí la de 1440 meda una media de 50 fps bastante constante.

Athlon XP 2800+, 512Mb RAM, GF6200AGP 256Mb
Título: BenchMark 01: Alien Invasion
Publicado por: Vicente en 28 de Marzo de 2008, 10:57:11 PM
Para threading en .NET esta es la mejor página que conozco:

http://www.albahari.com/threading/

Pero para C++ npi, aunque muchas cosas son más de concepto que de lenguaje.

De todas formas si no has hecho la librería multihilo desde el principio, hacerla ahora multihilo me da a mi que es un jaleo descomunal :S (vamos, que no te merece la pena mucho).

Un saludo!

Vicente
Título: BenchMark 01: Alien Invasion
Publicado por: AK47 en 28 de Marzo de 2008, 11:09:14 PM
20 € a que calculando todo en la CPU y enviando todo de golpe (en los batchs que se puedan) en un DrawPrimitiveUp va más rápido  :twisted: Incluso se podrian aprovechar los dual core actuales para hacer los calculos multitarea :)

Mis resultados:

En ventana: 73 FPS
A pantalla completa: [ ERROR ]    Error creating SDL window

Mi máquina:
Portatil Dell Inspiron 6400
Microsoft Windows XP Home Edition
Fabricante del sistema   Dell Inc.
Modelo del sistema   MM061
Tipo de sistema   Equipo basado en X86
2 Procesadores   x86 Family 6 Model 14 Stepping 8 GenuineIntel ~1829 MHz
Memoria física total   2.048,00 MB
ATI Radeon X1400 con 256 RAM de video

Mola ver tantos "ornis" a la vez jejeje :D
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 28 de Marzo de 2008, 11:45:36 PM
Citar20 € a que calculando todo en la CPU y enviando todo de golpe (en los batchs que se puedan) en un DrawPrimitiveUp va más rápido Twisted Evil Incluso se podrian aprovechar los dual core actuales para hacer los calculos multitarea

Fijo que sí, la pregunta es: ¿cuánto? Respondiendo a esa pregunta tendría la que realmente me interesa: ¿merece la pena? :D

No entiendo porque a mi me da más FPS que a vosotros, tengo claramente peor ordenador, ¿por qué será? ¿será el core duo que se porta así de bien?:

Win XP SP2
Portatil Inspiron 9400
1GB RAM - DDR2
CORE 2 DUO Processor T7200 (2.0 GHZ)
Intel Media Accelerator 950 Graphics (128MB) => Caca de la vaca

Modo ventana: 95 FPS
Pantalla completa: 86 FPS

El caso es que nada más empezar, me da unos 50 fps o así, y un segundo después ya subre a las otras cifras.
Título: BenchMark 01: Alien Invasion
Publicado por: [EX3] en 29 de Marzo de 2008, 01:55:27 AM
Cita de: "Loover"Intel Media Accelerator 950 Graphics (128MB) => Caca de la vaca
No te creas. La 950 pego un cambio muy fuerte en rendimiento respecto a la 945, la que use esta mañana. Aun asi, en cuanto reinstale el Vista en el MacBook te lo confirmo.

Cita de: "Loover"El caso es que nada más empezar, me da unos 50 fps o así, y un segundo después ya subre a las otras cifras.
Eso es muy tipico y le pasa a casi todos los juegos o programas multimedia que conozco. Supongo que se tratara de alguna historia la gestion de recursos de la ventana o similar, alguna carga o gestion en segundo plano.

Salu2...

P.D.: Voy a ver si te puedo hacer la prueba con el AMD y la GeForce3.
Título: BenchMark 01: Alien Invasion
Publicado por: [EX3] en 29 de Marzo de 2008, 02:19:36 AM
Joder, va a ser que mi escritorio en mosaico semi ASCII semi iconos y demas artefactos graficos en el inicio anterior no era casualidad, eso o tu codigo se comporta de forma muy extraña segun tarjeta grafica :D

La tostadora de los 86º en 1 minuto:
AMD Athlon XP 1600+ (1533 MHz) medio jubilado... (chochea mas que el abuelo de los Simpsons)
1 GB de RAM (intactos espero xD)
nVidia GeForce 3 Titanium 64 Mb + Ultimos drivers para esta tarjeta
DirectX 9.0c + Actualizacion Noviembre 2007
Windows XP Pro SP2 Actualizado al dia

La prueba de 1024x768 me ha dado una media de 30/35fps nada mas!  :shock: Cojon! si la 950 del MacBook con el apoyo del Dual 2 Core no es capaz de mover el Half-Life 2 al minimo decentemente y la GeForce 3 soportando las chocheces del AMD tostado va sobrada! raro raro xDDDDDDD

La prueba de 1440x900 como me esperaba ni ha arrancado, si era en modo a pantalla completa, como leo en el log, era de esperar. Esa resolucion no la soporta mi monitor, lo mas cercano es 1600x900 (otra rara de las muchas que hay) y la anterior ya pasa al estandar 1280x1024. Te lo dije, las resoluciones panoramicas son un juego de azar segun monitores :D

Salu2...
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 29 de Marzo de 2008, 02:31:49 AM
Pues si es raro, pero vamos, no hago nada fuera de lo normal. Un DrawPrimitiveUp por objeto, como dije. Parece ser que cuando hay muchas llamadas a DrawPrimitiveUp seguidas, la aplicación se vuelve más dependiente de la CPU que de la GPU... ¿parece eso, no?
Título: BenchMark 01: Alien Invasion
Publicado por: zupervaca en 29 de Marzo de 2008, 11:06:23 AM
Hola,

Cita de: "Loover"Pues si es raro, pero vamos, no hago nada fuera de lo normal. Un DrawPrimitiveUp por objeto, como dije. Parece ser que cuando hay muchas llamadas a DrawPrimitiveUp seguidas, la aplicación se vuelve más dependiente de la CPU que de la GPU... ¿parece eso, no?
Hace unos años que ya comprobe esto con el test de los conejos de mi pagina web y ahora miles de tutoriales ya lo explican por fin, lo mejor que puedes hacer es que si vas a pintar la misma texturas repetidas veces tengas un vertexbuffer e indexbuffer grande y lo modifiques por con la cpu. (el indexbuffer solo se tendria que modificar una vez, cuando se cree)
El problema al usar una llamada por objeto es que la cpu espera a la confirmacion de la gpu de que lo ha pintado, asi que la cpu se queda parada mientras tanto.
Otro de los problemas es que cada llamada direct3d va a tener que llegarle al driver, cosa mala y que se debe de evitar ya que todas las llamadas de tu juego que salgan del codigo de tu juego seran lentisimas, de hay aquel codigo para el manager de cambios de estados.

Para demostrarte lo que te comento prueba este test de velocidad de los conejos que hice por el año 2006: http://www.davidib.com/projects/rabbits/rabbits.zip

Saludos

PD: El test de los ovnis me da ~53fps
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 29 de Marzo de 2008, 11:20:59 AM
Sip, es lo que comentó prompt y algunos más en otro hilo.

He probado los conejillos. El de Direct3d no se me inicia, en ogl, para cantidades altas se ralentiza bastante. ¿Eso es una llamada a Draw por conejo no? Es decir, como no debería hacerse en teoría. ¿No?

Pero lo malo de hacer solo una llamada a DrawPrimitive es:

Entiendo que podría calcular las posiciónes de los vértices de cada sprite y almacenarlos en un array y luego llamar a DrawPrimitive. Pero... ¿cómo le aplico a cada sprite diferente un estado de blending distinto llamando una sola vez a DrawPrimitive? Por que a mis sprites, a cada uno independientemente, le puedes cambiar el entitando, nivel de fade a un color, nivel de transparencia y el source y destination blending. ¿Hay alguna forma de almacenar dichos valores por vértice o algo así?

Porque está claro que si quieres hacer una sola llamada gigante a DrawPrimitive POR TEXTURA (pq no puedes hacer SOLO UNA llamada si cambia la textura, ¿no?), se lo tienes que pasar todo "mascado", vamos, todo transformado, no solo en el espacio, sino también lo que he citado de los estados de blending y demás.

Aparte, tendría que activar el DepthBuffer (cosa que ahora mismo no hago pues me basta con ordenar la lista de sprites por Z antes de dibujar).
Título: BenchMark 01: Alien Invasion
Publicado por: AK47 en 29 de Marzo de 2008, 01:24:28 PM
El color se puede guardar en los vertices, por lo que en ese caso si podrias dibujar todos a la vez. En cuanto a estados de blending, deberias agrupar los sprites por estado. Asi, tienes una lista de estados por blending, y dentro de cada estado los ordenas por textura. Si hay mas cosas a tener en cuenta, pues tendras que aumentar esta jerarquia para acomodar todos los casos. La idea es que si mas de un sprite tienen todo en comun, deben ir en la misma llamada DrawPrimitive(UP). En total igual harias algo asi como 10 llamadas de dibujado por frame, por ejemplo.

Por cierto, haces culling de los sprites en el test de los ovnis?

En cuanto a lo de usar hilos, puedes tirar de los hilos de boots, que son portables. O sino te paso el mio que no es portable pero es muchisimo mas ligero que bajarse toda la libreria boost ;)
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 29 de Marzo de 2008, 01:32:18 PM
He desactivado el culling ;)

La idea era probar si había diferencias entre DrawPrimitive y DrawPrimitiveUp => según el test, al menos para quads, no la hay.

Luego os mando una con el culling activado.

Lo de los hilos, lo dejo de momento. No voy a meterme con optimización aún (o quizás nunca).
Título: BenchMark 01: Alien Invasion
Publicado por: Vicente en 29 de Marzo de 2008, 01:49:06 PM
He probado el test de los conejos en DX y OGL y si parece aprovechar la máquina mejor.

En DX:

- tengo unos 90 FPS con 13.000 conejos.
- con 30.000 conejos se me queda en 33 FPS.

En OGL:

- tengo como máximo 60 FPS (parece que esté limitado? en DX no lo está)
- con 30.000 conejos se me queda en 38 FPS.

Por si valen de algo los números para comparar. Un saludo!

Vicente
Título: BenchMark 01: Alien Invasion
Publicado por: [EX3] en 29 de Marzo de 2008, 08:00:05 PM
Este tema me esta interesando cada vez mas, me temo. Acabo de hacer una prueba de estres con mi libreria dibujando una textura 128x128 cubriendo toda la pantalla (1024x768) y dibujando en todos los niveles de Z (17 en total, de -8 a 8, un total de 1070 sprites) y no pasa de 28fps en la GeForce 3 :( A mi si me va a tocar mirar lo de usar vertexbuffers si quiero meter caña al render de dx_lib32 y la verdad que hacer agrupaciones de vertexbuffers por jerarquias segun textura o renderstates como comentais si podria hacerlo tal y como tengo diseñado el render, pero seria casi como reescribirlo por completo, lo que no me merece tanto la pena a dia de hoy.

Tengo una pregunta para los expertos en materia. Yo utilizo el specular en los vertices para aplicar efectos de iluminacion en los sprites, al igual que el color de vertice. Mi duda viene en si yo en un vertexbuffer tengo definido dos sprites juntos. No se si estos compartirian vertices al estar consecutivos (la esquina superior derecha de uno seria la esquina superior izquierda del segundo), esto no haria que se aplicaran colores de un vertice sobre ambos sprites? A lo mejor es una burrada lo que pregunto pero es que no me queda claro el funcionamiento de los vb.

Salu2...

P.D.: Pregunto esto aqui por que supongo que a Loover si se ve en la necesidad de implementar los vb tambien le entrara la misma duda.
Título: BenchMark 01: Alien Invasion
Publicado por: AK47 en 29 de Marzo de 2008, 09:05:33 PM
Si los poligonos de dos sprites usan el mismo vertice, por supuesto que compartiran el specular o cualquier otra propiedad del vertice.

Lo de agrupar por estado del blender, textura, etc, es una de las partes criticas de cualquier motor 3D: hay que identificar que estados se pueden dar, y en funcion de eso crear los grupos y subgrupos que tocan a cada estado. Vamos, lo que se llama batching :)
Título: BenchMark 01: Alien Invasion
Publicado por: [EX3] en 29 de Marzo de 2008, 09:12:54 PM
Cita de: "AK47"Si los poligonos de dos sprites usan el mismo vertice, por supuesto que compartiran el specular o cualquier otra propiedad del vertice.
No me referia a que fuera mismo el vertice si no que hubiera dos vertices con las mismas coordenadas. Me referia mas a que si al procesar el buffer la GPU no mezclaria o "simplificaria" los dos vertices en uno, por algun proceso de optimizacion o algo similar, no?

Salu2...
Título: BenchMark 01: Alien Invasion
Publicado por: AK47 en 29 de Marzo de 2008, 10:14:26 PM
Si son dos vertices diferentes, aún teniendolo todo igual la GPU los tratara por separado.
Título: BenchMark 01: Alien Invasion
Publicado por: [EX3] en 29 de Marzo de 2008, 10:27:35 PM
Genial pues :) Gracias por resolverme la duda.

Salu2...
Título: BenchMark 01: Alien Invasion
Publicado por: zupervaca en 30 de Marzo de 2008, 08:45:48 AM
Si quieres un codigo de ejemplo pasate por aqui: http://www.codeplex.com/dibplus/Release/ProjectReleases.aspx?ReleaseId=610
No digo que sea el mejor codigo del mundo, pero como guia te valdra.
La clase que te interesa esta en System/Drawing/sprite.h
Si le pegas un ojo veras que se crea un vertexbuffer e indexbuffer, este ultimo se inicializa una vez (cuando se crea) y el vertexbuffer se le ponen valores mas o menos coherentes (aunque no haria falta).
Para comenzar el render se llama a la funcion Begin y cuando quieres terminarlo a la End, despues entra la llamada a estas dos funciones tienes funciones que te permiten cambiar el estado de los sprites, estas propias funciones se encarga de pintar todo si es necesario, es decir, si cambia algun estado del render.

Saludos y espero que esto te ayude a mejorar la dx_lib32
Título: BenchMark 01: Alien Invasion
Publicado por: [EX3] en 30 de Marzo de 2008, 09:30:45 PM
Gracias Zupervaca, para no seguir secuestrando el hilo de Loover he preferido seguir en uno nuevo que abierto donde he seguido con mis inquietudes :)

http://www.stratos-ad.com/forums3/viewtopic.php?t=10535

Loover, lo prometido es deuda (aunque no se si te servira de mucho a estas alturas):

MacBook Intel Core 2 Duo 2,16 GHz
2 GB de RAM
Intel Graphics 950
Windows Vista Business
DirectX 10 + DirectX 9.0c Actualizacion Marzo 2008

La media que me ha dado a 1024x768 ha sido de 32fps :? Me resulta curioso que en la Intel 945 de la oficina diera mas fps, quizas sea el lastre del Vista.

Salu2...
Título: BenchMark 01: Alien Invasion
Publicado por: Loover en 30 de Marzo de 2008, 10:15:11 PM
¡Gracias por probarlo!

Luego os pondré la versión con frustum culling activado, al menos a mi me va al doble de velocidad con eso.