2010-06-21 5 views
0

Permettez-moi de décrire le "champ de bataille" de ma tâche:rendu de texte avec Direct3D

  • audio/vidéo multi-chat room avec plus de 1M utilisateurs;
  • Convertisseur Direct3D personnalisé;

Ce que j'ai besoin de mettre en œuvre est une fonctionnalité TextOverVideo. Le texte lui-même passe par le réseau et doit être rendu du côté du destinataire avec le rendu Direct3D. AFAIK, il est couramment utilisé dans le développement de jeux pour créer votre propre texture avec des lettres/chiffres et dessiner ces éléments. Parce que notre application doit supporter de nombreuses langues, nous devrions utiliser une norme. C'est pourquoi j'ai travaillé avec l'interface ID3DXFont mais j'ai découvert quelques limitations insatisfaites.

Ce que j'ai rencontré est un manque d'évolutivité. Par exemple. si l'utilisateur redimensionne la fenêtre vidéo, je dois recréer D3DXFont avec le nouveau D3DXFONT_DESC pendant qu'il fait cela. Je pense que c'est inacceptable. C'est pourquoi la seule solution que je vois (en raison de mes compétences) est en quelque sorte rendre le texte à une texture et donc dessiner sprite avec mise à l'échelle, traduction, etc

Donc, je ne suis pas sûr si je vais dans le bon direction. S'il vous plaît aider avec des conseils, de l'expérience, de la littérature, des sources ...

Répondre

3

Votre question est un peu floue. Si je comprends bien, vous voulez une police facilement extensible.

Je pense qu'il est inacceptable

Pour autant que je sache, ce comportement est standard pour les polices - même pour les polices système. Ils ne sont pas supposés être facilement évolutifs.

solutions possibles:

  1. Utilisez ID3DXRenderTarget pour le rendu du texte sur la texture. La police sera filtrée lorsque vous l'agrandirez trop. Certaines personnes vont penser que ça a l'air moche.
  2. Écrire une bibliothèque personnalisée qui prend en charge les polices vectorielles. C'est à dire. - Il devrait être capable d'extraire le contour de la police de la police, et de construire du texte à partir de celle-ci. Il sera BEAUCOUP plus lent que ID3DXFont (qui est déjà plus lent que les polices "texture" traditionnelles). Le texte sera facilement évolutif. De cette façon, vous aurez très probablement des artefacts visibles ("bruit") pour les petits textes. Je n'utiliserais pas cette approche à moins que vous ne vouliez d'énormes lettres (plus de 40 pixels). La bibliothèque Freetype peut avoir des fonctions pour le traitement des contours de polices.
  3. Ou vous pourriez essayer d'utiliser D3DXCreateText. Cela va créer du texte 3D pour une chaîne. Ne sera pas rapide du tout.

Je l'oublierais. Tant que l'utilisateur est satisfait de la performance globale, l'amélioration des routines de rendu des polices (de sorte que leur comportement ressemble sympa à vous) ne vaut pas la peine.

--EDIT--

A propos ID3DXRenderTarget.
EVen si vous utilisez ID3DXRenderTarget, vous aurez besoin de ID3DXFont. C'est à dire. vous utilisez ID3DXFont pour rendre le texte sur la texture, puis utilisez la texture pour créer un texte à l'écran. Parce que vous avez dit que les performances sont critiques, vous pouvez retarder la création de ID3DXFont jusqu'à ce que l'utilisateur arrête de redimensionner la vidéo. C'est à dire. Lorsque l'utilisateur commence à redimensionner la vidéo, vous utilisez une ancienne police, mais vous l'augmentez en utilisant la texture.Il y aura un filtrage, bien sûr. Une fois que l'utilisateur cesse de redimensionner, vous créez une nouvelle police lorsque vous avez le temps. vous pouvez probablement le faire dans un fil séparé, mais je ne suis pas sûr à ce sujet. OU vous pouvez simplement toujours afficher du texte dans la même résolution que la vidéo. De cette façon, vous n'aurez pas à vous soucier de le redimensionner (il sera toujours filtré - avec la vidéo). Certains lecteurs vidéo fonctionnent de cette façon.
Plus de choses sur ID3DXFont. Il y a un problème avec ID3DXFont - il est lent dans les situations où vous avez besoin de beaucoup de texte (mais vous en avez toujours besoin, car il prend en charge unicode, et l'écriture de texturefont avec le support unicode est douloureuse). La dernière fois que j'ai travaillé dessus, j'ai optimisé les choses en mettant en cache les chaînes les plus utilisées dans les textures. C'est à dire. toute chaîne qui a été dessinée plus de 3 images dans la ligne a été rendue sur D3DFMT_A8R8G8B8 texture/render target, puis j'ai copié cette chaîne à partir de la texture au lieu d'utiliser ID3DXFont. Les chaînes qui n'ont pas été restituées pendant un certain temps ont été supprimées de la texture. Cela a donné un coup de pouce sérieux. Cette solution est cependant délicate: surveiller l'espace vide de la texture, supprimer les chaînes inutilisées et défragmenter la texture n'est pas vraiment trivial (il n'y a rien d'exceptionnellement compliqué, mais il est facile de faire une erreur). Vous n'aurez pas besoin d'un système aussi complexe à moins que votre écran ne soit littéralement couvert par du texte.

+0

Merci beaucoup pour votre réponse! "Inacceptable" - Je voulais dire que créer D3DXFont demande beaucoup de ressources et que les performances sont cruciales pour notre logiciel. Mais si je vous ai bien compris, les solutions possibles numéro 2 et 3 sont encore plus mauvaises. ID3DXRenderTarget-oui, j'ai pensé à ça comme ça. Mais je ne pourrais pas trouver assez d'exemples de comment l'utiliser. Ce dont j'avais peur - c'est que quelqu'un me disait "Hey, N'utilisez PAS D3DXFont! Ses performances sont les pires! ID3DXRenderTarget EST la solution!" Dites-moi s'il vous plaît, devrais-je passer à l'approche D3DXFont ou approfondir la technique ID3DXRenderTarget? – Dalamber

+0

@Anton: J'ai mis à jour ma réponse. – SigTerm

+0

Merci encore! J'apprécierais si vous pouvez me donner un exemple de comment rendre ID3DXFont à une texture. * SCRATCH * Trop peu d'informations sur ID3DXRenderTarget. Merci d'avance! Btw, j'ai essayé de recréer la police dynamiquement pendant le redimensionnement et oui - l'utilisation du processeur pendant le redimensionnement est relativement élevé. – Dalamber

0

Les polices ID3DXFont sont plates, toujours parallèles à l'écran. D3DXCreateText sont des maillages pouvant être mis à l'échelle et pivotés.

Les polices de texture sont floues et ne semblent pas très claires. Pas bon pour une application qui utilise beaucoup de petit texte. J'écris une application qui peut créer 500 mailles de texte, chaque maille faisant en moyenne 3 000 à 5 000 sommets. Les mailles de texte sont créées une fois, puis sont statiques. Je reçois 700 fps sur une GeForce 8800.