Je crée actuellement un système de fenêtre pour les jeux XNA à partir de zéro. Je développe principalement pour Windows, mais qui sait quelles plates-formes je pourrais soutenir à l'avenir. N'hésitez pas à répondre si vous le savez pour Direct3D natif, car la sémantique des performances devrait être similaire. Si possible, pensez à ce qui changerait si la plate-forme cible était X-Box 360.stratégie de rendu pour un système de fenêtre XNA (performance RenderTarget)
Je fais des progrès, mais maintenant je ne suis pas sûr sur la façon de rendre exactement les fenêtres. Je suis venu avec quatre approches:
Juste render tous les contrôles directement sur l'écran. C'est ce que je fais maintenant. Les contrôles peuvent être animés par un mélange entre les états tant qu'ils ne sont pas semi-transparents. Je n'ai pas trouvé un bon moyen d'animer entre un nombre arbitraire d'états (supposons un bouton qui est en train d'animer de bouton en bas à bouton en bas et de souris en passant par souris, puis il est désactivé. Avec cette approche, cela ne fonctionne que si une animation est jouée après la fin de la dernière, ou si vous avez des sauts dans l'animation
Rendu chaque fenêtre de haut niveau tous les contrôles dans une cible de rendu, puis l'utiliser pour rendre les fenêtres de haut niveau avec semi-transparence sur l'écran.Cela rend la semi-transparence au travail de haut niveau et est facile à gérer, mais ne change pas la chose avec les animations.
le rendu de chaque commande en un Rende r cible, qui n'est mise à jour que lorsque le contrôle devient sale (c.-à-d. doit animer ou le texte a été modifié). De cette façon, la semi-transparence par contrôle fonctionnerait.
Comme le précédent, mais en plus de résoudre le problème d'animation ont une deuxième cible de rendu pour chaque contrôle. Chaque fois qu'une animation démarre, permutez les cibles de rendu, de sorte que nous ayons l'état au démarrage de l'animation et que nous l'associons à l'état de destination dans l'autre cible de rendu. Cela ne devrait pas ajouter de surcharge par rapport à l'approche précédente, nous avions seulement deux fois plus de cibles de rendu, dont dans une trame donnée, une seule serait rendue (au maximum). Mais voici le problème: pour que cela fonctionne, il faudrait que l'ancienne cible de rendu conserve son contenu. Cela devrait fonctionner avec de bonnes performances sous Windows, mais semble avoir un sérieux impact sur les performances sur X-Box 360. D'un autre côté, le bit "preserve" n'est nécessaire que lorsqu'une animation est active.
Et voici les vraies questions. Tout ce qui clarifie est le bienvenu. Avec les questions de performance, souvenez-vous que ce serait juste le système de fenêtre d'un jeu - le jeu derrière pourrait utiliser de nombreuses cibles de rendu et aspirer les performances aussi, et probablement beaucoup plus que le système de fenêtre. Supposons que nous ayons cinq fenêtres de haut niveau avec 20-40 contrôles chacun sur l'écran dans le pire des cas.
- Laquelle de ces approches, le cas échéant, recommanderiez-vous et pourquoi? N'hésitez pas, bien sûr, à ajouter une autre approche.
- Y at-il un impact sur les performances quand tout avoir, disons 200 ou 400 cibles disponibles render, à condition que peut-être seulement 20 d'entre eux sont rendus à chaque image?
- L'impact des PreserveContents sur les performances est-il vraiment si mauvais sur X-Box 360? À quel point est-ce que c'est Windows?
- La propriété RenderTarget2D.RenderTargetUsage peut être écrite dans. Est-ce une bonne idée de changer cela à l'exécution, pour activer PreserveContents seulement si nécessaire?Pourriez-vous (en tant que joueur) si les animations de contrôle sauteraient dans certaines situations, par exemple en survolant un bouton, en déplaçant la souris puis en revenant, de sorte que l'animation "normal-> hover" est jouée deux fois depuis le début parce que c'est plus lent que toi?
Merci de votre participation. Je n'ai pas eu l'idée de rendre plusieurs contrôles dans une grande cible de rendu, mais maintenant que vous avez dit que cela semblait évident. Je regarderai plus en profondeur quand j'en aurai le temps, et j'accepterai probablement votre réponse. – OregonGhost