Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отображение BMP (GDI+), Глюки .net или кривые руки? 
:(
    Опции темы
sindi8
  Дата 28.9.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

Репутация: нет
Всего: нет



Всем привет!
Наткнулся на одну непонятную мне весч. Может кто сможет пролить свет на проблему.
В общем суть следующая: есть задача отображать BMP файлы на экране (800х600), да не просто их отображать - а 25 картинок в секунду (по таймеру). Дабы не было тормозов при отображении - приходится грузить сразу все BMP-шки в память. На машине стоит 1 гиг ОЗУ. Так вот - если объем загружаемых картинок + уже занятая память меньше 1 гига (во всяком случае мне показалось что именно такая закономерность), то картинки отображаются без проблем. Если же объем больше гига - отображается серый прямоугольник формы (FormBorderStyle=none). Тут начинается самое интересное - ожидание не приносит никаких результатов - форма как была серой, так ей и остается - до тех пор пока не нажать Ctrl+Alt+Del. После этого работа приложения прерывается стандартным диалогом WinXP. И уже после выхода из этого диалога (не важно какого: хоть TaskManager открывай, хоть Esc жми) всё начинает работать как положено. Пробовал сворачивать форму, переключаться между задачами - никакого результата.
Собственно назревает вопрос: что это - мои кривые руки или какие-то глюки .net или GDI+? Пишу на .net 2.0. Система WinXP SP2. Релиз тестировался на двух машинах.
Кусок кода прилагается.
Буду рад любым ответам и предположениям. Спасибо.
Код

private void timerLoop_Tick(object sender, EventArgs e)
{
     Graphics graphics = this.CreateGraphics();
     Image img = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
     Graphics g = Graphics.FromImage(img);
     g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
//Заливка черным цветом не срабатывает, а отображается цвет формы, выбранный по умолчанию
     g.FillRectangle(new SolidBrush(Color.Black), ClientRectangle);
     g.TextRenderingHint = TextRenderingHint.AntiAlias;
//loop - типа Bitmap[], currentLoopBitmap - соответственно номер отображаемой картинки
     g.DrawImage(loop[currentLoopBitmap], ClientRectangle);
     graphics.DrawImage(img, ClientRectangle);
     img.Dispose();
     g.Dispose();
     graphics.Dispose();
}

PM MAIL   Вверх
arilou
Дата 29.9.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



sindi8, чисто навскидку предлагаю таймер с System.Windows.Forms.Timer сменить на System.Timers.Timer. А вдруг...


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 29.9.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Поставь try..catch, может оно вываливает OutOfMemoryException и не освобождает ресурсы. И сюда же: если юзается что-то, что в конце Dispos-ится, то удобнее использовать оператор using, т.к. ресурс будет гарантировано освобождён.

Кстати, отрисовывать по таймеру лучше так: в таймере делаешь Refresh формы, а рисуешь в обработчике события Paint, на Graphics-е, который в event args.


--------------------
user posted image
PM MAIL WWW   Вверх
sindi8
Дата 29.9.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

Репутация: нет
Всего: нет



arilou, да таймер работает нормально. 
Я в режиме отладки запускал - все команды выполняются. Никаких эксепшенов не выплёвывает. Блок try{} catch{} там уже есть.
Но вот на вскидку - то что писал mr.DUDA по поводу рефреша - возможно подойдёт. Попробую.
PM MAIL   Вверх
arilou
Дата 29.9.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(sindi8 @  29.9.2006,  14:28 Найти цитируемый пост)
Но вот на вскидку - то что писал mr.DUDA по поводу рефреша - возможно подойдёт

Да, похоже на то. Невнимательно на код посмотрел...


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
sindi8
Дата 29.9.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

Репутация: нет
Всего: нет



smile Попробовал. Стало хуже. Не смотря на использование двойной буферизации очень сильное мерцание. И при загрузке до 1 гига опять нифига не работает сразу...
PM MAIL   Вверх
arilou
Дата 29.9.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



sindi8, попробуй использовать DirectShow и его ф-ции потокового видео. Наверное, то, что ты делаешь сейчас, для WinForms - overkill  smile 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
sindi8
Дата 29.9.2006, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

Репутация: нет
Всего: нет



arilou, на DirectShow я это делал, и всё по большому счету работает, но есть определенные обстоятельства, по которым пришлось воспользоваться gdi+. Нет, то как это дело сейчас у меня работает - в принципе устраивает - но просто уже интересно стало - в чем может быть затык. Просто если бы это был действительно overkill - то всё не работало в общем-то. Но ведь работает, собака! Просто не совсем гладко начинает...
А на счет потокового видео - это функции всё таки для отображения видео, а у меня последовательность картинок.

Это сообщение отредактировал(а) sindi8 - 29.9.2006, 19:44
PM MAIL   Вверх
stab
Дата 29.9.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



попробуй после graphics.DrawImage вставить graphics.Flush(FlushIntention.Sync). вдруг поможет..  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Bogdan1024
Дата 29.9.2006, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



ИМХО, не нужно грузить всё сразу. Разве эйсидиси загружает все картинки из папки в память? ИМХО, стоит вычислить сколько времени уходит на загрузку+показ картинки+её освобождение и уже из этого числа исходить.


--------------------
user posted image
PM MAIL   Вверх
sindi8
Дата 4.10.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

Репутация: нет
Всего: нет



cully, не помогло...

Bogdan1024, я в первом посте написал что нужно отображать 25 кадров в секунду, так что сравнение с эйсидиси некорректно. Я не просмотрщик картинок делаю, мне нужно выводить графический фон, который бы не дергался (аналог анимации). Если он из оперативки не всегда успевает нормально прорисовывать всё, какое уж там чтение с жесткого диска...

Это сообщение отредактировал(а) sindi8 - 4.10.2006, 12:16
PM MAIL   Вверх
arilou
Дата 4.10.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(sindi8 @  29.9.2006,  19:42 Найти цитируемый пост)
arilou, на DirectShow я это делал, и всё по большому счету работает, но есть определенные обстоятельства, по которым пришлось воспользоваться gdi+.


поделись обстоятельствами. может найдем другое решение проблемы...


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Guest
Дата 10.10.2006, 13:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











arilou, вообще задача стояла следующая:
фон 25 кадров в секунду, поверх фона вывод текста по шаблону дизайна, антиалиасинг текста, текст должен быть всплывающим (эффект fade in, fade out и cross fade) - т.е. поддержка alpha-канала. У меня с surface не получилось сделать сглаживание для текста и как раз fades, а разбираться времени особо не было.
В общем - по большому счету основная задача решена - все функции реализованы. Но вопрос топика рсиаеися открытым.
  Вверх
sindi8
Дата 10.10.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

Репутация: нет
Всего: нет



предыдущий пост мой - прошу прощения.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.