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?
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? –
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. –
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