Уважаемые знатоки,
помогите пожалуйста оптимизировать код в WPF / VB.NET. Тормозит, зараза
Сначала делал на VB.net, потом переделал на C# - абсолютно никакой разницы в скорости!
Делаю меню, с анимированными текстовыми метками, и анимированным ползунком.
Вот урезанно-наикратчайшая версия кода, просто алгоритм того что происходит, сама суть:
Dim CurFrame as integer = 0
Dim Labels() as string = {Пункт меню1, Пункт меню2 ....... Пункт менюN}
Dim LabelsImage as ImageSource
Dim LabelsTexture() as bitmapimage
Dim SelectorTextures() as bitmapimage
ON FORM LOAD:
----------------------------------------------------------------------------------------------------
For n=0 to Labels.GetUpperBound(0)
Рисуем нужным шрифтом эти метки в графике, и делаем из них ImageSource, и присваиваем LabelsImage()
Next
F = Все файлы из директории с текстурами для пунктов меню - 500штук, 17мб.
Грузим в LabelsTexture() - все текстурки из F
F = Все файлы из директории с текстурами для селектора меню - 300штук, 15мб.
Грузим в SelectorTextures() - все текстурки из F
AddHandler CompositionTarget Rendering AdressOf DrawFrame
----------------------------------------------------------------------------------------------------
DRAW FRAME
----------------------------------------------------------------------------------------------------
//Тут хитрый код для определения FPS.
------------------------------------------------
Dim Frame as new DrawingGroup
Frame.Children.Add (FPS)
For n=0 to LabelsImageю.GetUpperBound(0)
Dim TDG as new DrawingGroup
TDG.children.Add (LabelsTexture(CurFrame)
TDG.opacityMask = LabelsImage(n)
Frame.Children.Add (TDG)
Next N
Display Frame
CurFrame += 1: if CurFrame >= LabelsTexture.Lenght then CurFrame = 0
----------------------------------------------------------------------------------------------------
Так вот эта штука, при двух текстовых метках выдает ~90fps!!!
При трёх - четырёх - ~45fps.
При семи-восьми, получаеться 10-15фпс, что уже никуда не годиться
Маленький ньюанс: при восьми метках, 10фпс выдаёться первые полторы минуты!!! Потом переходит на 60, причем резко, сразу после окончания очередного цикла. Значит может всё-таки!!!
Пробовал кэшировать загружаемые картинки, пробовал ждать после загрузки каждой из них... Но дело всё-таки не в картинках, а в методе DRAW FRAME. Уж не знаю что он там куда потом кэширует и буферизует, но только после первого цикла всё начинает идти с нормальной скоростью.
Как сделать так что бы при выводе на экран, уже сразу скорость была нормальной???
Подскажите...
Заранее спасибо!!!
Добавлено: Ой, забыл! Если кому нужен полный код, с целью помочь мне, или с целью помочь себе в обозрении WPF (там много премудростей есть: изменение формата картинки, чтение картинки из файла или из стрима, кейфреймовая анимация, frame-based анимация, маски прозрачности, группировка наложений) - вот сурсы в виде проэкта VB.NET 2008.
http://rapidshare.com/files/249874165/GraphicsTest_Wpf.rar.html