Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Rendimiento bajo con ID3DXFont

Iniciado por MA]Mestre, 23 de Mayo de 2007, 11:12:48 AM

« anterior - próximo »

MA]Mestre

Hola,

Estoy intentando realizar unos títulos de crédito que se desplazan ( SCROLL ) de abajo a arriba con C++/DirectX 9. Para ello uso ID3DXFont en el renderizado del texto.

El rendimiento de la aplicación disminuye propocionalmente a la cantidad de texto ( y el tamaño ) renderizada con ID3DXFont::DrawText alcanzando sutuaciones bastante pésimas de rendimiento.

Puedo llegar a formatear cadenas muy largas de hasta más de 1000 carácteres. Puedo hacer clipping con el parámetro pRect de DrawText, pero sálo por la parte del bottom. Dado que como es en movimiento ascendente necesito arrastrar el top hacia arriba aún con valores negativos...

rect.top--; // Cada vez que renderizo
               // rect.top alcanza valores negativos, pero como el texto es
              //  muy largo se sigue viendo en pantalla.

He probado usar Scissor, pero no mejora el rendimiento, por lo que supongo que el cuello de botella esta en la generación de todo el texto con la fuente seleccionada.

Cosas/dudas que tengo en mente:

*Creo que el problema radica en la 'creación del texto' cada frame y no en el renderizado. Se deberia poder guardar en 'algún sitio' para solo tener que volcarlo. DirectDraw ?¿.

*Algun otro sistema para generar texto ?¿ que admita cualqueir fuente instalad en el sistema. D3DXCreateText mejorara ?¿ Tambien he leido algo acerca de CD3DFont. Comentan que es más rápido pq no usa GDI. Deberia encontrar esa clase en \Samples\C++\Common pero en la SDK de DirectX9 de dec2006 no esta. ?¿

Estoy abierto a todas las ideas, cuanto mas ingeniosas mejor.  Pero trocear el texto en N porciones ( 10 porciones de 100 ), e irlas renderizando solo si se encuentran dentro pantalla me complicaria muchisimo la vida por la arquitectura del soft que ya esta implementado.

Un saludo, y gracias de antemano.

[EX3]

ID3DXFont es lentisima, mas bien las funciones de renderizado de texto de Direct3D, por que dx_lib32 y proyectos similares que conozco sufren el mismo problema. Si el texto siempre es estatico yo optaria por pintar el texto en una textura (mediante un reder target por ejemplo, que es una de las razones por la que dx_lib32 los implementa) y usar la textura para imprimir el texto. Solo harias una unica pasada de texto cuando generas la textura y el resto del tiempo a pintar dicha textura, que ira notablemente mas rapido.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

marcode

No tengo mucha idea sobre la generación de texto en DirectX pero al parecer con D3DXCreateText puedes crear un mesh de texto. Tal vez se podría hacer un mesh de cada letra y así ya lo tienes generado y sólo hay que renderizar cada una para componer los textos necesarios.

No sé si será correcto, es sólo por dar una idea.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

MA]Mestre

[EX3]
Generar la textura puede resultar muy "molesto" en textos que tranquilamente pueden alcanzar 2000 caracteres.

marcode
Generar un mesh de texto convierte en sumamente más lento aun el proceso de render. Claro q en textos muy grandes podria darse el caso de que el rendimiento pasara de ser muy malo a solo malo.

Creo que no me va a quedar otra q trocear el texto. Lo que precisamente no queria hacer.

Saludos y gracias.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.