Дикие тормоза, как убрать?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Дикие тормоза, как убрать?

Сообщение d3drm » 28.03.2005 (Пн) 0:00

у меня программа в цикле должна заполнять массив 256х256. но при этом выдает дикую нагрузку на FPS. вот я и задался вопросом, почему? Ведь код не осложнен сложными математическими операциями - только сложение и вычитание. Ведь взять, к примеру, directX - с какой скоростью он обрабатывает текстуру 256х256? в тысячи раз быстрее! Как можно добиться этого? Врядли поможет написать библу на С++ думаю результат будет таким же... не уж-то только на ассемблере можно писать по настоящему быстрые программы?

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 28.03.2005 (Пн) 1:19

d3drm
А покажи-ка, как ты это делаешь. Кусочком кода.
Не строки ли фигурируют в массивах случаем? :)

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 28.03.2005 (Пн) 1:23

LДа в принципе процедура вылизану круче некуда, вот:

Код: Выделить всё
Public Sub doBump()
Dim lx As Long, ly As Long, c As Long, r As Long
Dim xdelta As Long, ydelta As Long
Dim tByte As Integer

lx = -cx + 15 + b_wid
For c = 1 To pic_w
    ly = cy - 274 + b_hgt
   
    For r = 1 To pic_h
        xdelta = lx + PixL(c - 1, r) - PixL(c + 1, r)
        ydelta = (ly + r) + PixL(c, r - 1) - PixL(c, r + 1)
        With Pix2(c, r)
            If ydelta And 65280 Or xdelta And 65280 Then
                .g = 0
                .r = 0
                .B = 0
            Else
                tByte = phong(xdelta, ydelta)
                If tByte > 255 Then tByte = 255
                .r = tByte * cz
                .g = tByte * cz
                .B = tByte * cz
            End If
        End With
    Next
    lx = lx + 1
Next
DrawOnTex Tex, Pix2(), 256
End Sub


проверено, что все тормоза практически на пустом месте, то есть во внутреннем цикле. Хоть кусок на АСМ переводи...

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 28.03.2005 (Пн) 1:28

phong - это массив? функция? Или где?

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 28.03.2005 (Пн) 7:00

А cz часом не действительного типа? Если да, то большинство ресурсов съедает операция умножения. Также, если PixL() - двумерный массив, и чтение/запись его производится последовательно прямоугольными областями, как в приведенном примере, то можно поднять быстродействие его "разворачиванием" в одномерный массив.
Листинги не горят!

Морфий
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 119
Зарегистрирован: 11.01.2005 (Вт) 18:06

Сообщение Морфий » 28.03.2005 (Пн) 16:55

FleX_2004
Если решится, киньте в тему :wink:
Вот оно — счастье...

Samrat
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 11.08.2004 (Ср) 10:32

Всё очень просто....

Сообщение Samrat » 28.03.2005 (Пн) 19:14

Всё очень просто нужно заложить тайм - аут по таймеру хотя бы на 100мс и тормоза исчезнут просто после внутреннего цикла, пускануть таймер и подождать его срабатывания. Главное контрол - таймер на форму "брякнуть" . Просто сам делал нечто подобное когда увлекался криптографией (немного). Конечно прога работает чуть медленнее но система сохраняет управляемость.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 28.03.2005 (Пн) 19:44

можно без таймера
но только обновлять массив раз 0.037 секунды
на глаз не видно а ФПС возрастает в двое :wink:

Samrat
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 11.08.2004 (Ср) 10:32

Сообщение Samrat » 30.03.2005 (Ср) 18:14

Гы - Гы это круто, но в рамках VB Решения данной проблемы действительно нет (остальные среды разработки пока не рассматриваем) CPU Всё равно будет перегружен. Просто в моём предложении рациональным зерном является сохранение управляемости решения. Если же Вам необходимо получить работу со скоростными логическими функциями, скажем для эффективного брутфорса DES и т.д. необходимо построить специализированную машину на ПЛИС или процессорах другой архитектуры. Так как современные ПК для этого подходят слабо.
Конечно можно попробовать написать dll на С но выигрыш будет в проценты, а не в разы.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 02.04.2005 (Сб) 23:23

Я гашел выход, решил не изобретать колесо и перевести всю работу на DX шейдеры, чего в принципе я и хотел добиться =) А вообще действительно, в рамнах VB это не решабельно, да и на Си тоже. Для таких задач - ассемблер и больше ничего.

ne_tapka
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 13.04.2005 (Ср) 23:03

Сообщение ne_tapka » 03.05.2005 (Вт) 4:03

То есть когда какой нить фотопэинт мгновенно картинку больше 1000 пикселей обрабатывает (например складывает цвета с другой картинкой) - это только ассемблер? чего то не верится.. вообще проблемма ооочень актуальна.


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 65

    TopList