Зависимость скорости API GetDiBits от... фиг поймёшь чего.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Зависимость скорости API GetDiBits от... фиг поймёшь чего.

Сообщение Mikle » 19.12.2012 (Ср) 9:54

Делаю такой тест - очищаю PictureBox, у которой Visible=False с помощью Line(0, 0)-(w, h), Color, bf (это быстрее, чем Cls), забираю изображение в массив с помощью API функции GetDiBits, далее вывожу на форму с помощью SetDiBitsToDevice и замеряю fps. При некоторых параметрах получаю fps=200, компилирую программу, запускаю скомпилированную - fps=70, отключаю опции оптимизации, компилирую - fps=70, компилирую в P-Code - fps=70. Запускаю из среды - fps=200.
Далее, запускаю любую из скомпиленных программ, но не закрываю среду VB6 - fps=200, даже если среда свёрнута в панель задачь. При работе программы закрываю среду VB6 - fps остаётся 200. Соответственно, если программу запустить без наличия среды, а потом запустить среду - fps остаётся 70.
Исключением выяснил, что меняет скорость GetDiBits.
Так же, как среда VB6, на работу программы влияет запущенный Internet Explorer, но не влияет проводник.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Хакер » 19.12.2012 (Ср) 14:29

То есть среда и IE ускоряют работу программы? Причём только если среда или IE были открыты именно на момент рождения процесса твоей программы?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Mikle » 19.12.2012 (Ср) 16:31

Хакер писал(а):То есть среда и IE ускоряют работу программы? Причём только если среда или IE были открыты именно на момент рождения процесса твоей программы?

Да, вот пример, конкретно этот EXE-шник ведёт себя так, исходник присутствует.
Вложения
GetDiBits.zip
(6.22 Кб) Скачиваний: 145

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Хакер » 20.12.2012 (Чт) 3:02

Блин. Сколько раз говорил людям не использовать DoEvents для организации подобных циклов. Всё равно используют.

В DoEvents есть вызов Sleep. В DoEvents есть обращения к реестру с целью получения информации об EventMonitor-ах. В DoEvents вагон и маленькая тележка всяких тяжеловесных штуковин.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.12.2012 (Чт) 6:41

А что надо использовать?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Хакер » 20.12.2012 (Чт) 7:21

Сформулируй вопрос полностью. Только не пользуйся словом «вместо» и «взамен».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.12.2012 (Чт) 7:59

Хакер писал(а):Сформулируй вопрос полностью.


Хакер писал(а):Блин. Сколько раз говорил людям не использовать DoEvents для организации подобных циклов. Всё равно используют.

А что надо использовать для организации подобных циклов?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Хакер » 20.12.2012 (Чт) 8:03

Ты думаешь вопрос «что надо использовать взамен DoEvents», задавание которого я запретил, многим хуже вопроса «что надо использовать взамен DoEvents»?

Хорошо. У меня этот демопример выдаёт 1200 fps. Внимание вопрос: зачем вообще иметь такой цикл, который генерирует 1200 кадров в секунду, если монитор способен показать только ~70 кадров в секунду?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Mikle » 20.12.2012 (Чт) 8:36

Хакер писал(а):Сколько раз говорил людям не использовать DoEvents для организации подобных циклов.

До сих пор наоборот, слышал только противоположное - "не забывайте DoEvents!".
Я убирал GetDiBits - скорости выравнивались. И я проверил на других компьютерах - такого нет. Подозреваю, что зависит от видюшки/её драйвера/его настроек. На компе, где такая зависимость есть - встроенный Intel G31/G33.
Хакер писал(а):Внимание вопрос: зачем вообще иметь такой цикл, который генерирует 1200 кадров в секунду, если монитор способен показать только ~70 кадров в секунду?

Естественно, в таком виде цикл никому не нужен, это просто тест скорости. Я формирую изображение на битмапе и отправляю его в текстуру DirectX или в спрайт SR2D.
1200 fps - это под семёркой? Там GetDiBits и SetDiBitsToDevice ускоряются аппаратно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Хакер » 20.12.2012 (Чт) 8:42

Mikle писал(а):До сих пор наоборот, слышал только противоположное - "не забывайте DoEvents!".

Надо отправлять в топку все советы в стиле «делайте так», которые ограничиваются этим самым «делайте так», и не заставляют задумываться, что к чему.

Ну а насчёт того, что DoEvents в подобных циклах, это настоящее зло, можешь почитать тут:
1) viewtopic.php?f=1&t=41820
2) viewtopic.php?f=1&t=40185
3) Ещё что-то тут http://forum.sources.ru/index.php?showt ... ew=showall — но по-моему только с отсылами на меня.

Mikle писал(а):1200 fps - это под семёркой?

Да ни за что на свете. Это под Windows XP.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение ger_kar » 20.12.2012 (Чт) 12:05

И я протестировал (Процессор Core2Duo 4500 (2,2ГГц) nForce570 Видео GeForce 6600GT) на Windows XP.
У меня хоть в скомпилированном виде, хоть под IDE дает одинаковый и неизменный результат 112-115.
Причем VB IDE и IE6 вообще на показания никаким боком не влияют, как я только не пробовал.

И я так и не понял какая вообще может быть взаимосвязь между DoEvents и открытым VB IDE, либо EI влияющим на производительность. Походу DoEvents здесь вообще никаким образом на такое поведение влиять не должен.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.12.2012 (Чт) 12:15

Mikle писал(а):1200 fps - это под семёркой?

У меня под семёркой 600-700, под другой - около 400. Запуск IE ни на что не влияет. Запуск VB6 ни на что не влияет (где 600-700, где 400 - нет VB6).

Хакер писал(а):Ты думаешь вопрос «что надо использовать взамен DoEvents», задавание которого я запретил, многим хуже вопроса «что надо использовать взамен DoEvents»?

Есть же конкретный код, про него и спрашиваю.
Собственно, по ссылкам из твоего последнего поста вроде понятно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Хакер » 20.12.2012 (Чт) 12:47

ger_kar писал(а):И я так и не понял какая вообще может быть взаимосвязь между DoEvents и открытым VB IDE, либо EI влияющим на производительность. Походу DoEvents здесь вообще никаким образом на такое поведение влиять не должен.

Сколько можно повторять. Если взять DoEvents в виде исходника, выйдет пару тысяч строк кода. Там всякие разные COM-вызовы, вроде бы как даже иногда межпроцессные. Я уже не помню деталей. Но суть примерно такая. Так что влиять оно может.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Хакер » 20.12.2012 (Чт) 12:59

Кстати, сама фраза
Mikle писал(а):под семёркой? Там GetDiBits и SetDiBitsToDevice ускоряются аппаратно.

звучит достаточно абсурдно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Mikle » 20.12.2012 (Чт) 13:07

Хакер, вот ты тоже не вникаешь в то, что тебе пишут. Я конкретизировал, что тормозит именно GetDiBits. Сейчас я убрал DoEvents, сделал так, как в твоей первой ссылке. Как и следовало ожидать, программа продолжает вести себя так же. Я ПРИНЯЛ ВО ВНИМАНИЕ информацию на счёт DoEvents, впредь буду пользоваться указанной альтернативой, но В ДАННОМ ПРИМЕРЕ ДЕЛО НЕ В ЭТОМ.
На компьютере стоит WinXP SP3, встроенное видео - Intel G31/G33, процессор - Core2 Quad Q6600.
На других компьютерах я тоже этого эффекта поймать не могу, но пока других со встроенным видео и WinXP не попадалось.
звучит достаточно абсурдно

Там используется DirectX для пользовательского интерфейса, подробнее не скажу, не уточнял, но убеждался не раз - GetDiBits и SetDiBitsToDevice работают в разы быстрее. А вот TextOut, к примеру, значительно медленнее.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Хакер » 20.12.2012 (Чт) 13:16

Хорошо, если ты сам понимаешь, что проблема наблюдается только под одной конкретно взятой конфигурации, и не получается воспроизвести её на других конфигурациях, то чем мы (или конкретно я) можем помочь?

Mikle писал(а):но убеждался не раз - GetDiBits и SetDiBitsToDevice работают в разы быстрее

Ну это значит, что они её просто оптимизировали :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение ger_kar » 20.12.2012 (Чт) 15:58

Хакер писал(а):и не получается воспроизвести её на других конфигурациях, то чем мы (или конкретно я) можем помочь?
НУ как вариант проверить на своих компах и убедиться в наличии/отсутствии эффекта или даже глюка. Я к тому же могу и на аналогичной конфигурации как как у майкла потестить, так как у меня есть компьютеры на Intel G31, причем там есть как встроенное видео, так и отдельная видеокарта GF9500GT.
Завтра я достану такой комп и потестирую.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.12.2012 (Чт) 22:59

Хакер писал(а):Если взять DoEvents в виде исходника, выйдет пару тысяч строк кода. Там всякие разные COM-вызовы, вроде бы как даже иногда межпроцессные. Я уже не помню деталей.

А для каких целей они там?

Filyus
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 07.07.2011 (Чт) 11:54

Re: Зависимость скорости API GetDiBits от... фиг поймёшь чег

Сообщение Filyus » 26.02.2013 (Вт) 9:14

Про альтернативный DoEvents написал здесь:
viewtopic.php?f=1&t=41820&p=6767847#p6767847

Разницы между стандартным DoEvents и альтернативным не заметил. Также, как разницы FPS в Windows XP и Windows 7 - не обеих FPS около 280.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 48

    TopList