![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| EKoshelev |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 509 Регистрация: 1.9.2004 Репутация: нет Всего: нет |
Какое-то время назад мною была написана программа. Суть её заключалась в том, что она должна была принимать Ethernet-пакеты с видео потоком (формат не стандартный) и отображать. Я выводил кадры на Image. Программа часть пакетов теряет, из-за чего fps слишком маленький. Начальник меня типа-пристыдил показав программу написанную специалистами другого отдела на Qt. Статистики пропущенных пакетов она не выводит, но чисто визуально видно, что пропускает заметно меньше (запускаем мою и их на одном компе).
Другой коллега подкинул интересную мысль предложив посмотреть в диспетчере задач сколько выжирает ресурсов одна и другая программы. И выяснилось, что программа вражеского отдела жрёт 80-95 процентов процессора, тогда как моя максимум 50. Чуть позже я заметил, что если окно моей программы не растаскивать на весь экран, и убирать мышь с Имаги (а лучше и вообще с окна), то моя вдруг тоже начинает выжирать почти все ресурсы и видое поток показывается вроде как даже лучше конкурирующей. Да. Перед этим ещё для своей проги я задал в диспетчере задач приоритет Выше Среднего. Ну вот собственно и вопрос. Можно ли как-нибудь (желательно даже без виндовозовских настроек, только лишь вписав какой-то код) заставить работать мою прогу с максимальной отдачей? Может быть можно сделать так, чтобы процесс не тормозился наличием курсора мыши над окном?.. Заранее благодарю за ответы. -------------------- Вежливым и адекватным предлагаю общаться на "ты". |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
вывод через directx в оверлей?
-------------------- Обижено школьников: 8 |
|||
|
||||
| PointerToNil |
|
|||
![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 17.6.2013 Репутация: 3 Всего: 6 |
а если просто Form1.Canvas.Draw(0, 0, MyBitmap) или типа того?
|
|||
|
||||
| EKoshelev |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 509 Регистрация: 1.9.2004 Репутация: нет Всего: нет |
PointerToNil, Не совсем понял о чем ты. В функции отображения есть такая строчка:
FImage.Picture.Bitmap := Bitmap; Битмапина в правой части формируется dll-евскими функциями. И тут же после finally удаляется. (Этот кусок кода писал не я). Поэтому считаю, что там, фактически, то же самое, что ты предложил. И как это может ускорить работу программы я не понимаю. bems, возможно, то что ты предлагаешь и ускорит работу проги, но с этим надо разбираться, наверное компоненты ставить. Хотелось бы сделать всё побыстрее. Т. е. как я написал, как-нибудь сделать так, чтобы система отдавала программе больше ресурсов. И не было бы тупизны, когда мышь над формой. P. S. А слово "и_х_н_ю_ю" робот исправил? Это сообщение отредактировал(а) EKoshelev - 13.11.2013, 07:43 -------------------- Вежливым и адекватным предлагаю общаться на "ты". |
|||
|
||||
| Illusion Dolphin |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Мышь рисуется драйвером, значит "когда мышь над формой" определяется только сугубо вашей программой. Если там есть обработчики MouseMove или функции типа GetCursorPos, то я советую обратить на них внимание.
Если хочется быстрее - откажитесь от TImage и делайте вывод ручками (Canvas (проще) или directx (сложнее, но результат наилучший)). Как минимум присвоение это создание нового объекта TBitmap внутри TImage и копироване данных туда, что является дополнительной ненужной операцией. -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||||||
|
|||||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Не видя кода трудно посоветовать как сделать быстрее.
Могу дать только очевидные советы. 1) Поскольку размер картинки не меняется постоянно, то не использовать выделение памяти в куче (выделять память заранее). 2) Не производить промежуточные конвертации кадров из одного формата в другой (присовение битмапов в разных форматах). 3) Использовать быстрые функции для вывода растров на экран. (например SetDIBitsToDevice). Пример реализации http://forum.vingrad.ru/forum/topic-40404/...vice/index.html Для картинки типа 800х600 не должна получаться загрузка более 50% для одного ядра. Я бы даже ориентировался на цифру 30% загрузки при фпс 25-30 кадров в секунду. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |