Есть ~100 файлов png
нужно их как бы анимировать, весят они от 8кб до 4мб.
Но как то через чур всё тормознуто выходит.
Можно ли тут что то оптимизировать или сделать более правильно ?
int counter = 0;
DispatcherTimer dT = new DispatcherTimer();
public Png()
{
InitializeComponent();
dT.Interval = new TimeSpan(0, 0, 0, 0, 25);
dT.Tick += new EventHandler(dT_Tick);
dT.Start();
}
void dT_Tick(object sender, EventArgs e)
{
var image = new BitmapImage(new Uri("C:\\" + counter + ".png"));
imageKonteiner.Source = image;
counter++;
if (counter == 100)
{
dT.Stop();
}
}
UPD - Пробовал и так заранее в память запихать, вышло тоже не очень(, память процесса подпрыгивает до 4гб :
int counter = 0;
DispatcherTimer dT = new DispatcherTimer();
private BitmapImage[] images;
public Png()
{
InitializeComponent();
images = new BitmapImage[100];
for(int i = 0 ; i < images.Length; i++)
{
images[i] = new BitmapImage(new Uri("C:\\" + i + ".png"));
}
dT.Interval = new TimeSpan(0, 0, 0, 0, 25);
dT.Tick += new EventHandler(dT_Tick);
dT.Start();
}
void dT_Tick(object sender, EventArgs e)
{
imageKonteiner.Source = images[counter];
counter++;
if (counter == 100)
{
dT.Stop();
}
}
У меня оригинальные изображения в 1920 x 1080 и отображать их
нужно в том же размере. Что то похожее на screensaver у Windows
такие изображения отрисовать быстро(на всех компьютерах) невозможно. Все упирается или в количество оперативки(загрузить все обьекты) или в быстроту работы винчестера(считать каждую картинку на НЕдефрагментированном диске будет довольно медленная задача, но с ССД выйдет быстренько)
_
Можно пойти неправильным путем:
Сделать FIFO-list (в шарпе это Queue) и при помощи его сделать буфер картинок, и картинки подгружать на 10-15 штук относительно того что сейчас используется. Кароче, буферизация изображений в нужном количестве размером(подбирается опытным путем оптимальный из соображений занятая оперативка/быстрота работы). А так же не забываем диспоузить изображения что б оперативу освобждать!
Внутри FIFO сохранять, скажем, инстансы структуры: Index Image
Так же иметь Array путей. Индекс аррея будет равнятся индексу элемента FIFO. Но имеет в себе полный список путей изображений что бы понятно было с какого пути нужно будет грузить следующую картинку. Собственно, если индекс превышает количество ячеек - нужно начинать с первой.
Этот буфер в отдельном потоке подгружает нужное количество изображений, скажем, до 15 элементов начиная с занаддного индекса (картинка которая сейчас отрисовывается).
Заданный индекс меняется в то время, как отрисовывается теперешний твой кадр.
Можно пойти ВОЗМОЖНО правильным путем (GIF):
Смонтировать большую гифку и подгружать ее. Я не уверен сработает ли этот путь т.к. не знаю как гифки сохраняются в оперативке. Вполне возможно что как набор BMP кадров... Так что может и не сработать.
А можно пойти ПРАВИЛЬНЫМ путем (Video):
теперь на тему:
и память процесса переваливала за 4гб, хотя файлов там было на 1гб.
это потому, что ты подгружаешь в BMP (Bitmap) то есть в несжатую картинку. По-другому не выйдет.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь к инталлятору положить DotNetFX461Если не выполнять ни каких действий, то при сборке проекта ругается:
Друзья помогите побороть ошибку при отправке email , обычная форма обратной связи