Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Автор: Xttx
Дата сообщения: 17.06.2009 15:29
Omicron_Persey_8
Буду очень благодарен за все возможные примеры оверлея.
Насчёт видео, я, в принципе, так и пологал. Значит будем писать класс для видео на основе GDI. С этим я думаю справлюсь.
У меня стоит VS2008 Express, (т.е. Framework 3.5), win XP x64.
Вывод полностью непрозрачных элементов поверх видео мне вряд-ли что-то даст, а Ваш пример с наложением анимированных гифов был бы очень полезен! Спасибо!
Автор: Omicron_Persey_8
Дата сообщения: 17.06.2009 17:04
Xttx
Вывод анимированных Gif'ов

Код: using System;
using System.Drawing;
using System.Windows.Forms;

public class animateImage : Form
{

//Create a Bitmpap Object.
Bitmap animatedImage = new Bitmap("SampleAnimation.gif");
bool currentlyAnimating = false;

//This method begins the animation.
public void AnimateImage()
{
if (!currentlyAnimating)
{

//Begin the animation only once.
ImageAnimator.Animate(animatedImage, new EventHandler(this.OnFrameChanged));
currentlyAnimating = true;
}
}

private void OnFrameChanged(object o, EventArgs e)
{

//Force a call to the Paint event handler.
this.Invalidate();
}

protected override void OnPaint(PaintEventArgs e)
{

//Begin the animation.
AnimateImage();

//Get the next frame ready for rendering.
ImageAnimator.UpdateFrames();

//Draw the next frame in the animation.
e.Graphics.DrawImage(this.animatedImage, new Point(0, 0));
}

public static void Main()
{
Application.Run(new animateImage());
}
}
Автор: Xttx
Дата сообщения: 17.06.2009 19:48
Omicron_Persey_8
Да, это всё хорошо описывает анимацию, но тут нет никаких намёков на overlay... А мне нужно не столько сама анимация, сколько именно наложение одной анимации на другую, с выбором режима прозрачности первой (т.е. не просто степень прозрачности, а типа как слои в фотошопе, или тинт во флэше).
У меня одна анимация накладывается на другую, и нужно что бы задняя была видна, даже не просто видна, ~а выделенна~ цветом
Автор: Omicron_Persey_8
Дата сообщения: 17.06.2009 21:50
Xttx
В этих примерах рисование происходит прямо на форме, поэтому копайте в сторону ImageAttributes. Если вернуться на 63 страницу, то там мы с LuckyStrike обсуждали изменение интенсивности цветовых каналов в изображении. В GDI+ для отрисовки изображения можно использовать цветовую матрицу ImageAttributes.ColorMatrix вида
[R, 0, 0, 0, 0]
[0, G, 0, 0, 0]
[0, 0, B, 0, 0]
[0, 0, 0, A, 0]
[0, 0, 0, 0, 1]
Устанавливайте параметр A в 0,5 и получайте полупрозрачное изображение.
Нужно использовать версию Graphics.DrawImage, которая принимает в качестве параметра экземпляр ImageAttributes
Автор: muzzle
Дата сообщения: 18.06.2009 09:37
помогите разобраться как внедрить в файл информацию о версии.
просмотр версии я сделал так:
...
    FileVersionInfo^ myFileVersionInfo=FileVersionInfo::GetVersionInfo("c:\\temp\\example.exe");
    label1->Text=String::Concat("File: "+myFileVersionInfo->FileDescription+"\n"+"Version number: "+myFileVersionInfo->FileVersion);
...

для сторонних файлов все работает прекрасно. но в скомпилированный мною файл информация о версии не записывается и соответственно ничего не отображается.
естественно, что в верхнюю строку подставляется название скомпилированного файла.

пишу на Visual C++2008, экспресс
Автор: lacklustre
Дата сообщения: 21.06.2009 11:32
День добрый, есть небольшая проблемка, с компонентом TreeView. А именно, как добавить, изменить, удалить элементы и группы, если кнопки, добавить, изменить и удалить находятся не форме где расположен сам TreeView, а на других формах. Раньше я писал на C++Builder 6, и у меня таких вопросов не возникало.
Автор: Omicron_Persey_8
Дата сообщения: 21.06.2009 18:36
lacklustre
Проще всего объявить ваш TreeView как public, потому как по-умолчанию все контролы private'ные. Это либо в коде, либо свойство Modifiers в дизайнере.
Автор: Lihonosov
Дата сообщения: 22.06.2009 13:15
lacklustre

Код: class Form1
{
private TreeView myTreeView;

public void AddSetDel()
{
//делаем с myTreeView что нужно

}
}

class Form2
{
private Form1 myForm1;
public Form2(Form1 f)
{
myForm1=f;
}
private button_Click(...)
{
myForm1.AddSetDel();
}
}
Автор: Omicron_Persey_8
Дата сообщения: 22.06.2009 20:01
Lihonosov
Так, в принципе, правильнее, но нужно как минимум делать методы-заглушки для вставки и удаления элементов и очистки дерева. Для маленьких проектов оно того не стоит. Проще public-свойством обойтись.
Автор: rain_sx
Дата сообщения: 23.06.2009 14:43
Более элегантнее чем передавать всю форму во вторую, было бы использование делегатов и передавать в конструктор второй делегат на функцию первой, которая уже будет работать с деревом...

т.е public delegate void doSomethingWithTree(string something......);

Автор: Omicron_Persey_8
Дата сообщения: 23.06.2009 16:03
rain_sx
И чем ваш вариант отличается от дополнительной инкапсуляции методов:

Код: public void AddItem(string text)
{
this.threeView1.Nodes.Add(text);
}
Автор: rain_sx
Дата сообщения: 23.06.2009 16:26
Omicron_Persey_8,

хм, могу ошибаться, но:

Если public void AddItem(string text) имплементированна в первой форме, то во второй форме нужен будет обьект первой, чтобы можно было добраться до AddItem.

В моем же предложении во второй форме будет только делегат на функцию, а не весь form1-object.

Вот пример:

Form1:

Код:
using System;
using System.Windows.Forms;

namespace FormDelegate
{
public partial class Form1 : Form
{
public delegate void setText(string txt);

public Form1()
{
InitializeComponent();
}

private void insertText(string txt)
{
textBox1.Text = txt;
}

private void button1_Click(object sender, EventArgs e)
{
setText st = insertText;
Form2 frm = new Form2(st);
frm.Show();
}
}
}
Автор: Omicron_Persey_8
Дата сообщения: 23.06.2009 19:08
rain_sx
Вообще, задача заполнения элемента управления одной формы данными из другой - задача очень мутная и противная, потому как однозначно верного ответа не имеет. Вот представьте такую ситуацию: работаете вы проект, который представляет собой большую базу данных. Вы сделали форму, которая показывает список покупателей. Но тут пришла поправка, что хорошо-бы, чтобы менеджер видел только "своих" покупателей, (т. е. тех, которых он отоваривает). Как быть? Прога готова, переписывать не канает, так как придется половину логики переписать... Есть два варианта: этот список покупателей откуда-то но вызывается. Значит, перед вызом формы со списком нужно сделать что-то типа:
ShowCustomers()
{
CustomersForm frm=new CustomersForm(); // создаем форму
// как-то запоняем
// показываем
}
Это первый вариант, мы заполняем форму снаружи уже исправленными данными и показываем. Как только на втором курсе ВУЗ начинается Delphi или Visual Studio все начинают таким образом слова из одной формы в другую перегонять. Но есть одно, но большое НО: а если нам надо вызвать ту же форму, с теми же фильтрами, НО из другого места? Опять повторять все манипуляции с установкой фильтров? А их иногда бывает очень большая куча. А список покупателей штука популярная, вызываться может из десятков мест (формы заказа, например, или еще откуда-нибудь). А если после того, как вы в пятнадцати местах таки сделали так, как я только что показал, вдруг понадобилось убрать одно поле из списка покупателей??? Опять в пятнадцати местах все переписывать??? Приходим к выводу, что заполнение формы перед выводом не катит.
Вариант второй: сразу после своего вызова ломиться в какое-либо хранилище данных, смотрит свой случай вызова и если находит, то применяет фильтры. Все хорошо, весь код в одном месте, если что, то легко корректируется. Метод, естественно, не без недостатков, но прост и удобен. Он же чаще всего и применяется в больших системах, в частности 1С: Предприятие и Microsoft Dynamics.


Ну так вот, к чему я это все городил. Я так думаю, что вы вряд ли делаете какую-нибудь большую учетную систему, и все, что я тут нагородил, вам на фик не нужно. В вашем случае нужно просто передать какие-то данные вам на фик в голову не придет разбираться в том, что написано выше. Поэтому, чтобы просто заполнить TreeView из другой формы, поставьте ему модификатор доступа public. И тогда через form1.treeView1 делайте с ним что хотите. И не нужно совершать лишние телодвижения по поводу дополнительной инкапсуляции вызовов form1.treeView1.Items.Add или с делегатами играться.

Цитата:
Более элегантнее чем передавать всю форму во вторую, было бы использование делегатов
К вашему сведению, ссылка на форму абсолютно ничем не отличается от ссылки на делегат: ни по количеству памяти, ни по накладным расходам на обработку.
Автор: BlackVetal
Дата сообщения: 24.06.2009 05:32
Omicron_Persey_8
Я бы сделал все-таки в форме с treeview методы public , с помощью которых имел бы доступ к компоненту: я не сторонник "расшаривания" данных одного класса другим ... Это конешно философский вопрос ... но для меня мой вариант проще и понятнее. Пусть даже это "лаба" первокурсника - но наверно нужно писать как для большого проекта? Когда еще такие нюансы обкатывать?
Автор: Omicron_Persey_8
Дата сообщения: 24.06.2009 07:57
BlackVetal
Ну, это уже не лаба, а практическое применение наследования вложением
Я к чему это все писал: просили вариант "лучше/удобнее", вот я его и привел
А лучше потрогать руками оба варианта: "расшаренный" контрол, написание методов-оберток и т. д. Так проще понять, куда двигать дальше.
Автор: pavlikalex
Дата сообщения: 25.06.2009 11:12
Доброго времени суток господа!!!
Мне подкинули задачку по поиску похожих документов. На даный момент имею: SQL Server 2008, блобы лежат в столбце image и проиндексированы полнотекстовым поиском, документы все на разных языках и разных форматов(doc,docx,pdf,xls и т.д.). Хотелось бы найти алгоритмы, куски функций (SQL,C#), советы с чего вообще начинать это всё и всё что нибудь что может помочь. Если у кого нибудь есть какие нибудь наработки слёзно прошу поделится. Погуглил немного интернета такое впечетление что мне поставили эту задачу первому во всём мире. Но даже если и так то прошу мне помочь бо сам точно не справлюсь. Всем заранее спасибо.
Автор: Xttx
Дата сообщения: 01.07.2009 14:36
Уважаемые знатоки,
помогите пожалуйста оптимизировать код в 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
Автор: Omicron_Persey_8
Дата сообщения: 02.07.2009 12:22
Xttx
Может быть имеет смысл замутить из этого набора картинок два видеоклипа? С видео в WPF очень просто работать: пример
Автор: Xttx
Дата сообщения: 02.07.2009 20:50
Omicron_Persey_8
Не работает такая штука. Использовал твой пример, только перевел его на бейсик.

'LOAD VIDEO TEXTURE IN - LabelTexturesVideo
Dim Vtl As MediaTimeline = New MediaTimeline(New Uri(LabelTexturesPath + "\Avi\Label0000.avi"))
Dim Vcl As MediaClock = Vtl.CreateClock
LabelTexturesVideo = New VideoDrawing
LabelTexturesVideo.Rect = New Rect(0, 0, 300, 200)
LabelTexturesVideo.Player = New MediaPlayer
LabelTexturesVideo.Player.Clock = Vcl
Vcl.Controller.Begin()

В методе DRAWFRAME имею:
For N = 0 To Labels.GetUpperBound(0)
Dim Buffer As New DrawingGroup
Dim OpacityMask As New ImageBrush(LabelsBitmap(N))
Buffer.OpacityMask = OpacityMask
Buffer.Children.Add(LabelTexturesVideo)
Display.Children.Add(Buffer)
Next N

Не работает! Показывает черноту...
Причем все пункты меню теперь ещё и на одной Y координате (друг на друге рисуються).
Пробовал заменить
---
Buffer.Children.Add(LabelTexturesVideo)
---
на
---
Dim temptexture As New VideoDrawing
temptexture = LabelTexturesVideo
temptexture.Rect = New Rect(0, N * 50, 300, 150)
Buffer.Children.Add(temptexture)
---
Безрезультатно.
Но это вторичная проблема. Возможно с этим я разберусь, но видео не проигрываеться!
И с этим я ничего не смог сделать. В чём моя ошибка
Автор: Omicron_Persey_8
Дата сообщения: 02.07.2009 22:15
Xttx
Я вот чего-то самого главного не вижу: создание кисти на основе видео и рисования ею

Добавлено:
Слушай, а где у тебя тормозит?
Автор: Xttx
Дата сообщения: 03.07.2009 12:22

Цитата:
Я вот чего-то самого главного не вижу: создание кисти на основе видео и рисования ею

Дык, у меня в Buffer (type DrawingGroup) добовляеться тип Drawing, а не Brush.
Вот так я его добовляю, без всяких преобразований к кисти:
Buffer.Children.Add(LabelTexturesVideo)

А кисть разве обязательно????? Ведь потом её придеться опять к типу Drawing преобразовывать :/ Не очень понимаю....


Цитата:
Слушай, а где у тебя тормозит?

Да, всё верно, при четырёх метках на первом круге 60 фпс. Это нормально. Но меток же будет около десятка на одном экране отрисовываться!!!
А вот если убрать самую нижнюю (4-ую), то фпс поднимиться до 90! Если убрать любую другую такого эффекта не будет. Думаю это из-за её размера (тукстуру для неё приходиться не уменьшать, как для других меток, а увеличивать).
И если подождать один круг анимации, то фпс тоже поднимаеться до 90! Точнее, ровно до 97и! Ведь значит можно.....
Просто не хочеться что бы при запуске финальной версии, на первом круге оно всё тормазило, и только потом раскочегаривалось
Автор: Omicron_Persey_8
Дата сообщения: 03.07.2009 20:02
Я восемнадцать меток ставил и у меня было все те же 60 fps.
Кисть в DrawingGroup засовывать не надо, она сама по себе уже может служить отличным фоном. Мой пример смотрел, когда текст закрашивался содержимым видеофайла?

Цитата:
Просто не хочеться что бы при запуске финальной версии, на первом круге оно всё тормазило, и только потом раскочегаривалось

А вот от этого при текущей реализации боюсь не уйти. 500 файлов загружать. Их копировать-то секунд 10.
И так ли критично использовать в приложении именно раскадровку?
Автор: Xttx
Дата сообщения: 03.07.2009 20:47

Цитата:
Я восемнадцать меток ставил и у меня было все те же 60 fps.

У меня при 12и метках начинаеться с 14фпс. После первого-же цикла опять становиться 97фпс (думаю это предельная частота обновления окна). Но изначально 14фпс


Цитата:
Кисть в DrawingGroup засовывать не надо, она сама по себе уже может служить отличным фоном. Мой пример смотрел, когда текст закрашивался содержимым видеофайла?

Если ты об этом примере: http://ifolder.ru/12922039
private MediaTimeline videoTimeline;
private MediaClock videoClock;
this.videoTimeline = new MediaTimeline() { Source = new Uri(@"C:\Users\Public\Videos\Sample Videos\Wildlife.wmv") };
VideoDrawing v = new VideoDrawing();
v.Player = new MediaPlayer();
v.Rect = new Rect(0,0,1,1);
v.Player.Clock = videoClock = videoTimeline.CreateClock();
text.Foreground = new DrawingBrush(v);
то я именно им и пользовался для попытки создания своего. Только перевел его на VB (в виду отсутствия у меня С, то что получилось - постом выше), и пытался использовать некомпрессированную AVI вместо wmv, а потом, когда не получилось, попробовал MPG... С тем же результатом. Чернота на буквах.


Цитата:
А вот от этого при текущей реализации боюсь не уйти. 500 файлов загружать. Их копировать-то секунд 10. И так ли критично использовать в приложении именно раскадровку?

Совершенно не критично!!!
Там потом надо будет эффект шейдерный простенький применить, у меня такое подозрение что с раскадровкой это будет проще (если это вообще можно реализовать с видео, я ещё до этого не добрался). В остальном-же видео было-бы лучьше даже чем раскодровка, только не получилось у меня с видео
Насчёт загружать 500 файлов - я готов в начале подождать! Но как???? Все опции кэша я уже перепробовал. По умолчанию там как раз стоит самый правильный: загрузить в память и закрыть файл. Ставить threading.sleep - это абсолютно бесполезно. Прокручивать ролик один раз в холостую в невидимом режиме? Ну разве только так, но нет никаких гарантий, что при появлении в кадре меток меню которые не будут видны в первом кадре, он снова не захочет их перекэшировать всю раскадровку конкретно под их размер.


Крик души: )
******************
Бьюсь с этим меню уже три недели. Пытался сделать на
GDI+ - нет нужных методов, а попиксельно - долго;
DirectDraw - долго работает с масками;
WinAPI - графические функции типа bltblit на вход принимают только объекты с hdc, а это не приемлимо;
Direct2D (managed code) - больше не поддерживаеться, и описаний к нему нет вообще нигде никаких....
Вот теперь пробую на WPF... Уже зашел дальше чем в остальных случаях. Если б не эти дурацкие тормоза......
Автор: Omicron_Persey_8
Дата сообщения: 04.07.2009 09:06
Xttx
А мой пример у тебя не работает? Посмотри, чтобы файл существовал, который показываешь, а то MediaTimeline на это не ругается.
Я пробовал показывать и wmv-шку, и несжатый avi - все довольно шустро бегает

Добавлено:
И придется во время загрузки splash-screen показывать

Добавлено:
Посмотри книжку Jack Хu "Practical WPF Graphics Programming" Она хоть и на английском, но в ней есть 6 глава, посвященная анимации и в нете ее найти не составляет труда.
Автор: Xttx
Дата сообщения: 04.07.2009 10:23
Omicron_Persey_8

Цитата:
А мой пример у тебя не работает? Посмотри, чтобы файл существовал, который показываешь, а то MediaTimeline на это не ругается.

Дык не работает... Путь правильный. Показывает черный текст, даже если перед этим, его в форме выставить жёлтым. У меня такое чувство, что он накладывает первый кадр анимации, а потом просто не хочет воспроизводить.... хотя не уверен.


Цитата:
И придется во время загрузки splash-screen показывать

Да!!! Скажите мне только что делать в коде, во время этого сплжш-скрина!


Цитата:
Посмотри книжку Jack Хu "Practical WPF Graphics Programming"

Спасибо. Попробую найти.
Автор: Xttx
Дата сообщения: 04.07.2009 13:57

Цитата:
"Practical WPF Graphics Programming"

Книжка хорошая. Только там про видео ничего не нашел. Про анимацию много чего есть, но это всё мне в принципе уже было известно. Про скорость, тоже ничего не нашел...
Автор: Omicron_Persey_8
Дата сообщения: 04.07.2009 16:29
Xttx
Тогда в упор не понимаю, почему видео не показывается.


Цитата:
Да!!! Скажите мне только что делать в коде, во время этого сплжш-скрина!

Ну, вот тут как раз все просто. Два варианта: сделать какую-нибудь левую форму с твоей фотографией в качестве splash-screen'а и ее прописать в StartupUri твоей проги
и пока она показывается загружать картинки. Либо переопределить метод OnStartup класса Application и делать все вышеперечисленное там.

Добавлено:
Вот про оптимизацию WPF из MSDN'а. Может поможет.

Добавлено:
А это еще по WPF:
http://windowsclient.net/learn/video.aspx?v=82517
http://windowsclient.net/learn/video.aspx?v=73040
http://windowsclient.net/learn/video.aspx?v=62276
http://windowsclient.net/learn/video.aspx?v=54639
http://windowsclient.net/learn/video.aspx?v=50450
Автор: Xttx
Дата сообщения: 04.07.2009 20:24

Цитата:
Ну, вот тут как раз все просто. Два варианта: сделать какую-нибудь левую форму с твоей фотографией в качестве splash-screen'а и ее прописать в StartupUri твоей проги
и пока она показывается загружать картинки. Либо переопределить метод OnStartup класса Application и делать все вышеперечисленное там.

Это всё понятно! Вот _КАК_ИМЕННО_ загружать все эти картинки? Или как узнать что они загрузились? Методы OnDownload и OnDownloadComplete у них не работают, т.к. картинки локальные. Кэш у них установлен в "Загрузить и Закрыть". Так что делать пока показываеться сплэш форма?
Автор: DragonSigh
Дата сообщения: 04.07.2009 21:56
Здравствуйте. Хотел попросить помощи у C# программистов... У одной программы (Action Game Maker) есть собственный формат файлов .GTD, не упакованный, не зашифрованный или вроде того, в нём могут хранится строчки текста, png, wav и др. ресурсы. Так вот я занимаюсь переводом этой программы и мне нужно как-то перевести этот текст. Начальный язык - японский. Пример этих файлов можно найти тут: http://www.mediafire.com/?0djqkylxxju

Также имеется класс, вытащенный из программы для чтения этих файлов: http://paste.org/8809 (вытащен .нет рефлектором из этих файлов: http://www.mediafire.com/?djym5jwq5zk). Как я понимаю грузит это всё функция FromFile() совместно с LoadInfo().
Хочу попросить помочь основываясь на нём написать аналогичный класс, но для записи их обратно в файлы.

Надеюсь что кто-нибудь сможет помочь.
Автор: Xttx
Дата сообщения: 04.07.2009 22:05
Итак, после читки всех статей (кстати, спасибо!), и угробленных нервов, произведенные замеры показали что: при запуске программы она занимает в памяти около 60мб (много, конечно, ну да Бог с ней). Во время первого цикла анимации (на 20-30фпс) количество занимаемой памяти непременно растёт, и в конце цикла доходит до 160мб, после чего анимация прокручиваеться стабильно на 97фпс!
Ещё раз залез в мсдн/советы по оптимизации, выполнил все рекоммендации, теперь картинки грузяться так:
Dim uriBitmap() As BitmapDecoder
Dim cachedSource() As CachedBitmap
************************************
ReDim uriBitmap(LabelTextureFiles.GetUpperBound(0))
ReDim cachedSource(LabelTextureFiles.GetUpperBound(0))
For Each Item In LabelTextureFiles
uriBitmap(counter) = BitmapDecoder.Create(New Uri(Item, UriKind.Absolute), BitmapCreateOptions.DelayCreation, BitmapCacheOption.OnLoad)
cachedSource(counter) = New CachedBitmap(uriBitmap(counter).Frames(0), BitmapCreateOptions.None, BitmapCacheOption.OnLoad)
counter = counter + 1
Next
*************************************
Теперь уже при запуске проги имеем 210 мб занятой памяти! (конечно, теперь же используються два массива с картинками, причем с одинаковыми, только разных типов).
И что мы получили? Ровным счётом ничего! Занимаемая память в процессе первого цикла анимации больше не увеличиваеться (что говорит о том, что все битмэпы загружены в память), но этот самый первый цикл воспроизводиться по прежнему на 20-30фпс

Снова читаем о производительности, снова нервы, снова немного головной боли и..... С поправкой на то что я всё правильно понял, то при первом цикле анимации они кэшируються не в СИСТЕМНУЮ память, а в ВИДЕО, и только после этого может иметь место аппаратное ускорение, а первый цикл, стало быть воспроизводиться в програмном режиме....
Ещё одна тупиковая ветвь эволюции этой проги....
Опять бьюсь башкой об столь...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

Предыдущая тема: Как удалить/добавить/отключить/включить устройство?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.