2009-12-23 7 views
1

Ill essayer d'expliquer ma situation mieux que je peux, désolé s'il est pas trop clair ...WPF efficacité de la mémoire vidéo 3D

J'ai un Viewport3D qui contient quelques grands rectangles 3D qui ressemblent à de grands cristaux. Lorsque l'utilisateur clique sur l'un des cristaux, j'ajoute un nouveau matériau au cristal à l'endroit où l'on clique sur l'utilisation d'un ImageBrush. Ensuite, je itère sur une liste de bitmaps (List<BitmapImage> collection) et mettre à jour le ImageBrush chaque image pour créer une animation sur le cristal 3D. Cela fonctionne bien et j'ai jusqu'à 5 effets différents jouant sur les cristaux, mais après le profilage de mon application, j'ai découvert qu'en raison de mipmaps (je pense) et de la façon dont les rendus 3D, ma mémoire vidéo saute à travers le toit !!

D'après mes calculs, si j'ai une animation 75 cadre, par 400x400 en cours d'exécution à 4 octets par pixel, et ayant ~ 5 animations différentes entassées, vous pouvez voir comment cela peut devenir grand :)

75 * 400 * 400 * 4 * 5 = ~ 250MB

c'est un problème, non seulement en raison de la taille, mais aussi, les BitmapImages restent dans la mémoire vidéo jusqu'à ce que je les rende nuls, ce qui est très ennuyeux et les performances coûteuses.

Mon idée de résoudre ce problème est de changer d'avoir la collection List<BitmapImage>, d'avoir un List<Byte[]> et plutôt que de mettre à jour un ImageSource, je voudrais essayer d'utiliser un WriteableBitmap qui écrivent les octets à elle. Le problème est que je ne sais pas comment lire les octets à partir d'un fichier PNG, puis créer un WriteableBitmap et écrire les octets à plusieurs reprises dans un manoir efficace.

Quelqu'un peut-il m'aider s'il vous plaît?

+0

Quelques questions. Lorsque l'utilisateur clique sur un rectangle, tous les cristaux réagissent-ils ou seulement le clic? L'animation, ça marche? Si non, avez-vous besoin de conserver les 75 cadres d'animation? –

+0

Aussi, je ai juste googlé WriteableBitmap et trouvé ce (http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c4d95bf2-9b92-442b-8572-1b43bd2f2908/) fil avec mentionne le fait que WriteableBitmap est un cochon de mémoire et n'a pas été conçu pour de nombreux objets/mises à jour multiples scénarios comme le vôtre. –

+0

Tout d'abord, un seul réagit, mais il est conçu pour multi-touch, donc je suis à la recherche de nombreux clics à tout moment. Certaines des 5 animations font du cycle. Définir "garder" toute l'animation ... En outre, j'ai vu exactement le contraire a été dit à propos de la WBM, donc je voudrais peut-être essayer par moi-même :) – Mark

Répondre

1

WriteableBitmap est réellement mauvais avec les performances, même s'il prend des régions sales. Essayez d'utiliser InteropBitmap. J'ai une classe prête à aller ici:

http://silverlightviewport.codeplex.com/SourceControl/changeset/view/33100#809062

+0

Hey thanks! Les grandes questions sont ici, 1 va-t-il fonctionner à un rythme raisonnable, et utilisera une technique comme celle-ci aide à la réduction de la mémoire vidéo? – Mark

+0

J'ai aussi du mal à obtenir une image affichée dans WPF en utilisant cette classe, en utilisant un octet [] ... pouvez-vous s'il vous plaît fournir un échantillon? – Mark

+0

Essayez Marshal.Alloc et Marshal.Copy pour allouer la mémoire native et copiez votre tableau d'octets géré dans votre tampon natif –