Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анимация средствами VB, как достичь равномерности? 
:(
    Опции темы
JusTalionis
  Дата 25.3.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



Задача:
Сделать, чтобы во время ожидания ответа от устройства, крутился рисунок на форме (в точности как иконка браузера во время загрузки, только где-т 150x150рх)

Решение:
Заготовил стопку картинок. Положил их в массив изображений одно над другим. IF по таймеру переключает им Visible:

Код

Private Sub Ani1_Timer()
Dim c As Long
c = rFrame(0).Tag 'номер текущего видимого кадра сунул в тег, чтобы не вводить глобальную перемеменную

If c = 35 Then 'переключение последнего кадра на первый
  rFrame(c).Visible = False
  rFrame(0).Visible = True
  rFrame(0).Tag = 0
Else 'переключение текущего кадра на следующий
  rFrame(c).Visible = False
  c = c + 1
  rFrame(c).Visible = True
  rFrame(0).Tag = c
End If

End Sub


Всё работает, мерцания, бликов не наблюдается.  Но! Вращение получается неравномерным, переключение кадров периодически задерживается, что приводит к неприятному "дерганью". Впечатление, что таймер вызывается не через равные промежутки.
Машина - 1GHz (не очень заметно, но что же будет на более медленных?..)

Кто что порекомендует?

PM MAIL   Вверх
~FoX~
Дата 26.3.2007, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

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



Юзаем ФАК
http://vingrad.ru/VB-ART-002308

Это сообщение отредактировал(а) ~FoX~ - 26.3.2007, 08:08


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Black_Star
Дата 26.3.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



~FoX~, возможно имелось не то.
JusTalionis, тормоза возникают по многим причинам. Все дело в очереди обработки процессов. Как выход, могу посоветовать установить приоритет приложения в REALTIME. Будет немного лучше.
PM ICQ   Вверх
Akina
Дата 26.3.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Код

If c = 35 Then 'переключение последнего кадра на первый
  rFrame(c).Visible = False
  rFrame(0).Visible = True
  rFrame(0).Tag = 0
Else 'переключение текущего кадра на следующий
  rFrame(c).Visible = False
  c = c + 1
  rFrame(c).Visible = True
  rFrame(0).Tag = c
End If


Тупо меняем на:

Код

rFrame(c).Visible = False
c = (c + 1) MOD 36
rFrame(c).Visible = True
rFrame(0).Tag = c


Цитата(JusTalionis @  25.3.2007,  16:34 Найти цитируемый пост)
переключение кадров периодически задерживается, что приводит к неприятному "дерганью".

Каков TimeR Tick?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
cardinal
Дата 26.3.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



Насколько я знаю mod (div) считается дольше чем if (djnz).

Может это и не на всех процессорах так, но на некоторых именно так...
http://www.computer-museum.ru/technlgy/pro...MCS51/instr.htm


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Akina
Дата 26.3.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(cardinal @  26.3.2007,  18:39 Найти цитируемый пост)
Насколько я знаю mod (div) считается дольше чем if 

Если бы мы писАли на Ассемблере - да.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
cardinal
Дата 26.3.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



А из VB тот же ассемблер делается компилятором, вопрос только насколько эффективно что заменяется...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
JusTalionis
Дата 26.3.2007, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



Akina:
Мысль красивая! Не вдаваясь в теоретические вопросы, я ее проверил. Заработало точно так же. Ни малейшего различия с работой моего варианта заметить не удалось.
(Предупреждая ненужные гипотезы: ушел от обращения к тегу, создав нормальную глобальную переменную. Изменений также нет.)
Интервал таймера- 40.



~FoX~:
Код, приведенный в твоей статье неработоспособен (копировал из текста).

 Ошибки:
Dim PicWidth As Single,'ширина картинки - не нужна запятая
Установим у всех Image свойства ... AutoRedraw=True, AutoSize=True. - у Image нет таких свойств
два PictureBox ... их тоже сделаем невидимыми Visible=False - тогда тогда вообще ничего не видно
PictureBox1.Picture = Msk(i).Picture
PictureBox2.Picture = Kadr(i).Picture
Здесь вместо (i) должно быть (SKadr).

Исправив это, запустил с горем пополам - тормозит жутко, форма вся мерцает, кошмар. Может на шести кадрах такое и прокатывало, но не на 36.



Black_Star:
Вот я тоже сразу про это подумал! Но как сделать это правильно пока не волоку...  Ведь все ресурсы забирать нельзя - в это же время будет ожидание ответа от устройства, нужно же хоть что-то ему оставить тоже. (А когда анимация отработает, лучше вообще максимально понизить, чтоб освободить ресурс.)
smile

PM MAIL   Вверх
Akina
Дата 26.3.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(JusTalionis @  26.3.2007,  23:10 Найти цитируемый пост)
Ни малейшего различия с работой моего варианта заметить не удалось.

Их нет. Не считая компактности и (имхо) читабельности кода.

Цитата(JusTalionis @  26.3.2007,  23:10 Найти цитируемый пост)
Интервал таймера- 40.

Мерцать будет однозначно... попробуй поставить не менее 55... впрочем, все одно будет мерцать.

я бы пошел по иному пути... грубо где-то вот так:

36 картинок. Скажем 55.6 мс на картинку - это 2 с на прокрутку всего набора.

Делаем таймер 5-10 мс. Помним текущую картинку. В процедуре таймера спрашиваем у системы точное время через API. Делим на 2 с, берем остаток, множим на 18, берем целое, получаем номер картинки, которая в данный момент ДОЛЖНА быть на экране. Если она - процедуру закончить, иначе отрисовать нужную.

В этом случае вместо ПРИТОРМАЖИВАНИЯ вывода очередной картинки ты в худшем случае будешь получать ПРОПУСК очередной картинки - а это не так заметно.




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 27.3.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Код

' in common module

Type SystemTime
    Year As Integer
    Month As Integer
    DayOfWeek As Integer
    Day As Integer
    Hour As Integer
    Minute As Integer
    Second As Integer
    Milliseconds As Integer
End Type

Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SystemTime)

' in declarations

Dim CurrentTime As SystemTime

' in timer

Call GetSystemTime(CurrentTime)
PictureToShow = ((CurrentTime.Second MOD 2) * 1000 + CurrentTime.Milliseconds) * 36 \ 2000
If PictureToShow <> PictureShown Then
    rFrame(PictureShown).Visible = False
    rFrame(PictureToShow).Visible = True
    PictureShown = PictureToShow
End If



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
JusTalionis
Дата 27.3.2007, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



Akina:
Я пробовал разные значения таймера. При 50 и более, дерганье еще хуже заметно. Уменьшал до 20 .. 10 - вот тогда еще ничего! Причем реально скорость вращения не увеличивается настолько, так и остается где-то оборот в полторы секунды. Ну я и раньше знал, что таймер в VB "символический"...
Интересная идея вообще от него отказаться и переключать чисто по системному времени, всё написав "руками". НО! ведь надо будет еще попутно опрос устройства там как-то вставлять тогда... Таймер был бы, конечно, удобнее значительно!
Короч, есть, что вспахивать. Сегодня вечером, надеюсь, попробую; что получится отпишу.

ЗЫ Пропуск кадра - это дерганье вперед. При такой маленькой скорости (20FPS) все равно заметно. Хотя, в нормальном видео - это неплохой вариант синхронизации для тормозящих машин.

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


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(JusTalionis @  27.3.2007,  10:18 Найти цитируемый пост)
реально скорость вращения не увеличивается настолько, так и остается где-то оборот в полторы секунды. Ну я и раньше знал, что таймер в VB "символический"...

а таймер-то тут при чем? на отрисовку картинки нужно время - быстрее чем система отрисовывает, никакой таймер не сможет обновлять. Ни VB-шный, ни другой. Так что если и двигаться - то в сторону ускорения именно процесса вывода картинки на экран.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
JusTalionis
Дата 27.3.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



Akina:
Я обратил внимание на следующую вещь. В режиме работы в среде VB, когда эту стопку изображений двигаешь, или в процессе добавления каждой новой картинки в массив, Эта стопка автоматически перерисовывается на экране, начиная с первой. Так вот, при этом, вся стопка из 36 кадров пролетает менее чем за 0.3 сек, едва успеваешь увидеть, что картинка обернулась на полный оборот. Так что вывод сам по себе имеет значительный запас времени.
Можно посчитать: 36 кадров 150x150px - это 810K. За полторы секунды - это 540K в секунду. На гигагерцовой машине - более полутора тысяч тактов в запасе на копирование только одного пиксела. Я понимаю, что там не все так просто, но тысячекратный запас - это, IMHO, достаточно для нормальной работы.
Так что, тормозит сама Винда, но где именно и как с этим бороться, я не выяснил.


PM MAIL   Вверх
Black_Star
Дата 27.3.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(JusTalionis @  26.3.2007,  22:10 Найти цитируемый пост)
Ведь все ресурсы забирать нельзя 

А это и не получится.

Код

Private Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function GetPriorityClass Lib "kernel32" (ByVal hProcess As Long) As Long
Private Const REALTIME_PRIORITY_CLASS = &H100
Private Const NORMAL_PRIORITY_CLASS = &H20
Private Const IDLE_PRIORITY_CLASS = &H40
Private Const HIGH_PRIORITY_CLASS = &H80
Dim CurPriority As Long
  ...
  ...
  'Установка приоритета
  CurPriority = GetPriorityClass(GetCurrentProcess)
  SetPriorityClass GetCurrentProcess, REALTIME_PRIORITY_CLASS
  ...
  ...
  'Возврат...
  SetPriorityClass GetCurrentProcess, CurPriority

PM ICQ   Вверх
mihanik
Дата 27.3.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

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



Вот тут детский пример, который навряд ли тебе подойдёт...

http://www.i2r.ru/static/375/out_15456.shtml

А вот тут - интересная мысль.
Как ты думаешь, сможешь ли ты заменить свою коллекцию рисунков одним gif-файлом?
Нужна анимация, показываешь гифку.
Не нужна анимация, на месте гифки рисуешь стационарный рисунок...

Как тебе идея?

Вот тут идея реализации...

http://www.megalib.com/books/1395/272.htm

Добавлено через 1 минуту и 17 секунд
И ресурсов почти не жрёт...

Это сообщение отредактировал(а) mihanik - 27.3.2007, 13:35


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
JusTalionis
Дата 27.3.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



Black_Star: пасиб, это буду пробовать.


mihanik: Привет! smile)
Ну, первый пример - ничего нового, а 100 mS это, конех, мало для слитного движения, а только типа моргания индикаторной лампочки.

Про GIF - у меня была такая мысль, тем более что в списке связанных тем ссылочку на хороший контрол дали. Я попробовал тот пример - медленнее работает, но зато равномерно. Если так нормально не сделаю, буду крутить гиф. Там несколько громоздкий код выходит.

А от твоей ссылки - я полное офиге! smile чтоб сделать это через браузер!... ну, голь на выдумки хитра!.. smile
(Но в данном случае не хотелось бы тащить с собой отдельный файл-картинку.)
Кароч, пасиб!..  smile 

PM MAIL   Вверх
cardinal
Дата 27.3.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



Цитата(JusTalionis @  27.3.2007,  13:51 Найти цитируемый пост)
Но в данном случае не хотелось бы тащить с собой отдельный файл-картинку.

Засунь ее тогда в исходник (в буфер какой-нибудь)...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
JusTalionis
Дата 28.3.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



Black_Star:
Попробовал твой код. К моему изумлению, реалтайм не дал ни малейшего прироста в равномерности, даже характер рывков остался прежним. 
 smile Вот такого варианта я никак не ожидал!..


Akina:
Попробовал - код выдает ошибку Run time error 6 Overflow в строке
Цитата(Akina @  27.3.2007,  00:04 Найти цитируемый пост)
PictureToShow = ((CurrentTime.Second MOD 2) * 1000 + CurrentTime.Milliseconds) * 36 \ 2000

Я не стал тратить силы на вылавливание этой ошибки (вечер перешел в ночь уже), и попробовал изобразить собственный вариант с хорошо знакомой мне бейсиковой функцией Timer, благо ее период (55ms) близок к нужному мне.

Код

Private Sub Command1_Click()

For i = 0 To 360       'сделать 10 оборотов
  Call NextFrame      'смена кадра на следующий

'ожидание изменения значения Timer
  j = Timer
  Do
  Loop While j = Timer

Next i

End Sub


Здесь NextFrame - Это код смены кадра, приведенный мной в самом начале темы. Хотя лишний Call чуть замедляет выполнение, но облегчает отладку. Да!,- и там в конце добавлено DoEvents, потому что без него кадры не отрисовываются. При запуске таймером отрисовывались сами,  а в цикле - не отрисовываются без DoEvents.
Цикл For применен, чтобы обезопаситься от бесконечного цикла (с которыми в VB головная боль).

то, что я увидел, запустив, изумило меня еще больше! Рисунок мгновенно повертывался на пол-оборота с максимально возможной скоростью (порядка за десятую секунды) и застывал затем на 2 секунды. Потом опять пол-оборота и стоп. Клянусь, сам не поверил бы, если б не видел. (Приводимый здесь код прямо копирован из VB.) Вставка дополнительного DoEvents внутрь цикла Do картины не изменила.
Тогда я вместо цикла Do поставил для проверки паузу Sleep 40. Сразу же пошло нормальное вращение, но как и прежде, с небольшими рывками. (Кстати, Sleep адекватно работал даже на интервале 5, давая очень быстрое вращение, в отличие от стандартного таймера.)

Каким образом Do - Loop мог застревать на две секунды - для меня полная загадка! Всё, уже ночь, больше не могу, гашу машину и отрубаюсь.


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


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

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



Из темы: Скорость инициализации переменных

Цитата(JusTalionis @  2.8.2007,  14:46 Найти цитируемый пост)
 Да, под P. А как иначе в VB?


Можно в native. (Project > Properties > Comile > Compile to Native Code). 
Само собой прирост будет. У меня доходило до того, что прирост составлят чуть ли не в два раза по сравнению с пикодом. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
cardinal
Дата 2.8.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



JusTalionis, у тебя был код без посдветки - я поменял... smile 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
JusTalionis
Дата 3.8.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



W4FhLF
Ааа, ты про это! Посмотрел. Стоит опция Native. Но компилится все равно не в нормальный машинный код (как, например, досовский екзешник); я и думал, что это P-код.
А для сравнения переключил в P и посмотрел, что будет. Размер екзешника сделался чуть меньше, потому что в нем не стало списка всех употребленных имен. Но на скорости в данном случае почему-то не отразилось; и, что плохо - на равномерности не отразилось (скорости-то мне хватает, запас есть).
А еще поигрался с флажками отмены всяческих защит - тоже никакого видимого эффекта, как и при смене опций оптимизации (изначально стояло "оптимизировать скорость").

Практически никакие установки VB не влияют существенно - и я думаю, что дело в самой работе ОС. Но ведь кино нормально на этой самой машине смотрится, а там площадь кадра - ого-го, по сравнению с моей картиночкой - а оно без рывков крутится (да еще ресурс на декодирование звука ведь берется). Можно значит, если правильно делать?!..


PM MAIL   Вверх
W4FhLF
Дата 3.8.2007, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

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



Цитата(JusTalionis @  3.8.2007,  19:31 Найти цитируемый пост)
Но компилится все равно не в нормальный машинный код (как, например, досовский екзешник); я и думал, что это P-код.


P-CODE исполняется на виртуальной машине msvbvm, остальное всё машинный код. Не знаю, что ты подразумеваешь под словом "ненормальный". 


Цитата(JusTalionis @  3.8.2007,  19:31 Найти цитируемый пост)
Практически никакие установки VB не влияют существенно - и я думаю, что дело в самой работе ОС. Но ведь кино нормально на этой самой машине смотрится, а там площадь кадра - ого-го, по сравнению с моей картиночкой - а оно без рывков крутится (да еще ресурс на декодирование звука ведь берется). Можно значит, если правильно делать?!..


ОС я бы стал винить в последнем случае, А ТЕМ БОЛЕЕ, если ты пишешь на VB. Вот тебе для сравнения, простейшая программа на VB:

Код

Function fibo(n As Long) As Long
If n = 0 Or n = 1 Then fibo = 1 Else fibo = fibo(n - 1) + fibo(n - 2)
End Function


Компилятор превращает это всё в такое вот машинное чудо:

Код

@Project1_00401960:
        PUSH EBP
        MOV EBP,ESP
        SUB ESP,0Ch
        PUSH <JMP.&MSVBVM60.__vbaExceptHandler> ; Entry address
        MOV EAX,DWORD PTR FS:[0]
        PUSH EAX
        MOV DWORD PTR FS:[0],ESP
        SUB ESP,024h
        PUSH EBX
        PUSH ESI
        PUSH EDI
        MOV DWORD PTR SS:[EBP-0Ch],ESP
        MOV DWORD PTR SS:[EBP-8],Project1_00401088
        XOR EDI,EDI
        MOV DWORD PTR SS:[EBP-4],EDI
        MOV ESI,DWORD PTR SS:[EBP+8]
        PUSH ESI
        MOV EAX,DWORD PTR DS:[ESI]
        CALL DWORD PTR DS:[EAX+4]
        MOV EBX,DWORD PTR SS:[EBP+0Ch]
        XOR ECX,ECX
        MOV DWORD PTR SS:[EBP-018h],EDI
        MOV DWORD PTR SS:[EBP-01Ch],EDI
        MOV EAX,DWORD PTR DS:[EBX]
        MOV DWORD PTR SS:[EBP-020h],EDI
        CMP EAX,1
        MOV DWORD PTR SS:[EBP-024h],EDI
        SETNE CL
        XOR EDX,EDX
        CMP EAX,EDI
        SETNE DL
        TEST EDX,ECX
        MOV DWORD PTR SS:[EBP-028h],EDI
        JNZ @Project1_004019C7
        MOV DWORD PTR SS:[EBP-018h],1
        JMP @Project1_00401A38

@Project1_004019C7:
        SUB EAX,1
        LEA ECX,DWORD PTR SS:[EBP-020h]
        JO @Project1_00401A5F                ;<= Jump/Call Address Not Resolved
        LEA EDX,DWORD PTR SS:[EBP-01Ch]
        MOV DWORD PTR SS:[EBP-01Ch],EAX
        MOV EAX,DWORD PTR DS:[ESI]
        PUSH ECX
        PUSH EDX
        PUSH ESI
        CALL DWORD PTR DS:[EAX+06F8h]
        CMP EAX,EDI
        JGE @Project1_004019FA
        PUSH 06F8h
        PUSH Project1_00401560
        PUSH ESI
        PUSH EAX
        CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresultCheckObj>] ; MSVBVM60.__vbaHresultCheckObj

@Project1_004019FA:
        MOV EAX,DWORD PTR DS:[EBX]
        MOV ECX,DWORD PTR DS:[ESI]
        SUB EAX,2
        LEA EDX,DWORD PTR SS:[EBP-028h]
        JO @Project1_00401A5F                ;<= Jump/Call Address Not Resolved
        MOV DWORD PTR SS:[EBP-024h],EAX
        LEA EAX,DWORD PTR SS:[EBP-024h]
        PUSH EDX
        PUSH EAX
        PUSH ESI
        CALL DWORD PTR DS:[ECX+06F8h]
        CMP EAX,EDI
        JGE @Project1_00401A2B
        PUSH 06F8h
        PUSH Project1_00401560
        PUSH ESI
        PUSH EAX
        CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresultCheckObj>] ; MSVBVM60.__vbaHresultCheckObj

@Project1_00401A2B:
        MOV ECX,DWORD PTR SS:[EBP-028h]
        MOV EAX,DWORD PTR SS:[EBP-020h]
        ADD ECX,EAX
        JO @Project1_00401A5F                ;<= Jump/Call Address Not Resolved
        MOV DWORD PTR SS:[EBP-018h],ECX

@Project1_00401A38:
        MOV EAX,DWORD PTR SS:[EBP+8]
        PUSH EAX
        MOV EDX,DWORD PTR DS:[EAX]
        CALL DWORD PTR DS:[EDX+8]
        MOV EAX,DWORD PTR SS:[EBP+010h]
        MOV ECX,DWORD PTR SS:[EBP-018h]
        MOV DWORD PTR DS:[EAX],ECX
        MOV EAX,DWORD PTR SS:[EBP-4]
        MOV ECX,DWORD PTR SS:[EBP-014h]
        POP EDI
        POP ESI
        MOV DWORD PTR FS:[0],ECX
        POP EBX
        MOV ESP,EBP
        POP EBP
        RETN 0Ch


Без комментариев вообще, это просто ужоснахsmile

Теперь вариант на С/С++:

Код

long fibo(long n) {
    if (n==0 || n==1)
        return 1;
    else
        return (fibo(n - 1) + fibo(n - 2));
}


Скомпилированный GCC такой код превращается в следующий аналог машинного:

Код

@console_00401290:                           ;<= Procedure Start
        PUSH EBP
        MOV EAX,1
        MOV EBP,ESP
        SUB ESP,0Ch
        MOV DWORD PTR SS:[EBP-4],ESI
        MOV ESI,DWORD PTR SS:[EBP+8]
        MOV DWORD PTR SS:[EBP-8],EBX
        CMP ESI,1
        JA @console_004012B3
        MOV EBX,DWORD PTR SS:[EBP-8]
        MOV ESI,DWORD PTR SS:[EBP-4]
        MOV ESP,EBP
        POP EBP
        RETN

@console_004012B3:
        LEA EDX,DWORD PTR DS:[ESI-1]
        MOV DWORD PTR SS:[ESP],EDX
        CALL @console_00401290
        MOV EBX,EAX
        LEA EAX,DWORD PTR DS:[ESI-2]
        MOV DWORD PTR SS:[ESP],EAX
        CALL @console_00401290
        LEA EAX,DWORD PTR DS:[EBX+EAX]
        MOV ESI,DWORD PTR SS:[EBP-4]
        MOV EBX,DWORD PTR SS:[EBP-8]
        MOV ESP,EBP
        POP EBP
        RETN                                 ;<= Procedure End


Достаточно плохая оптимизация, а точнее такое впечатление, что её вообще нет. Хотя флаг /O стоял. 

Теперь гвоздь программы, MS VS C++ 7.1:

Код

fibo:                                        ;<= Procedure Start
        PUSH ESI
        MOV ESI,DWORD PTR SS:[ESP+8]
        TEST ESI,ESI
        JE @prog_00401029
        CMP ESI,1
        JE @prog_00401029
        LEA EAX,DWORD PTR DS:[ESI-2]
        PUSH EDI
        PUSH EAX
        CALL @prog.fibo
        DEC ESI
        PUSH ESI
        MOV EDI,EAX
        CALL @prog.fibo
        ADD ESP,8
        ADD EAX,EDI
        POP EDI
        POP ESI
        RETN

@prog_00401029:
        MOV EAX,1
        POP ESI
        RETN                                 ;<= Procedure End


Очень красивый код, хорошо оптимизирован, но не предел smile Ручками можно было бы выжать ещё. 

Делай выводы. Это элементарная рекурсия и арифметика. То, что творится с объектами и строками ещё хуже. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
JusTalionis
Дата 3.8.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



Я в курсе. Но, тем не мненее, впечатляет. Да еще если развернуть все задействованные рутины MSVBVM...
Я в ассемблере рублю чуть-чуть, но он же машинно-зависимый, так что если я чё написал и у меня работает - еще не факт, что заработает на другом компе. По этой причине предпочитаю все же Бейсик (хотя у VB с переносимостью - крупные траблы :( ) Ну в большинстве случаев VB все же позволяет строить внешне сносные программки, за исключением вот таких вот узкоспециальных случаев. Да собсно на форуме таковые и разбираются.
Вот и вопрос: существует ли путь в данном частном случае повысить равномерность? Главное - непонятно: что именно вносит лишнюю задержку, чтоб убрать или обойти это место.
Кстати, наблюдаю интересное проявление: когда программа запущена, и рисунок начинает крутиться, сначала он движется весьма неравномерно, скачками. Но пройдя три-четыре оборота, как будто "входит в режим", остаются один-два рывка в обороте. Не знаю почему такое. Причем повторяется только в среднем: когда может дергаться больше, когда - меньше.
А работа функции Timer меня вообще убила. Вы прочитали выше? А вот интересно, ведь в BIOS есть прерывание, на котором всё это и базируется... нельзя ли его сюда привлечь?



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


Инженер
****


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

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



Цитата(JusTalionis @  3.8.2007,  21:19 Найти цитируемый пост)
но он же машинно-зависимый

Он процессорнозависимый, то есть от набора команд, которые понимает конкретный процессор.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
W4FhLF
Дата 4.8.2007, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

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



Цитата(JusTalionis @  3.8.2007,  22:19 Найти цитируемый пост)
так что если я чё написал и у меня работает - еще не факт, что заработает на другом компе


Как уже сказано выше, всё зависит от того под какой камень ты пишешь. пишешь под ARM, заработает на всех арм'ах, пишешь под x86(x64) заработает на них.

Цитата(JusTalionis @  3.8.2007,  22:19 Найти цитируемый пост)
Вот и вопрос: существует ли путь в данном частном случае повысить равномерность? Главное - непонятно: что именно вносит лишнюю задержку, чтоб убрать или обойти это место.


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

Цитата(JusTalionis @  3.8.2007,  22:19 Найти цитируемый пост)
Кстати, наблюдаю интересное проявление:


Это кеширование. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
JusTalionis
Дата 4.8.2007, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



Цитата(cardinal @  3.8.2007,  22:22 Найти цитируемый пост)
Он процессорнозависимый, то есть от набора команд, которые понимает конкретный процессор. 

А архитектура компа? Особенности шины, BIOSа? Когда я занимался этим, это было как раз первое на что я и напоролся: на разных компах устройства работали чуточку не так. Где-то требовалась только определенная последовательность, а где-то допускались и другие (типа записи в незадействованные биты регистра), где-то между командами требовалась некоторая задержка, и тому подобное. Но результат был один: что работало на одном компе - висло на другом.
Так что, чтоб писать на ассемблере, надо наперечет знать ВСЕ эти нюансы, то есть быть профессионалом неслабым.
А работа с видеокарточкой, особенно в высоких разрешениях? На асме никто не пробовал для прикола? smile 

PM MAIL   Вверх
W4FhLF
Дата 4.8.2007, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

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



JusTalionis, то, что ты описываешь похоже на программирование времён начала-середины 90х или конца 80х. Сейчас в целом всё стандартизировано и существуют интерфейсы предоставляемые ОС даже на самых низких уровнях. Короче тех проблем, что ты описал сейчас практически не существует. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
JusTalionis
Дата 4.8.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

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



Да, эт давно было, я под дос писал. 
Цитата(W4FhLF @  4.8.2007,  07:22 Найти цитируемый пост)
Я, честно говоря, не смотрел твой пример.
 А может все-таки посмотреть? А то за оффтоп Акина щас громы и молнии метать начнет ;))


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


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

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



Прикрепи проект с картинками. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
cardinal
Дата 4.8.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



JusTalionis, то есть один и тот же ассмеблер-код на одном работал, на другом нет? Ну в принципе конечно возможно, но это уже говорит только о плохой схеме, т.к. ассемблер как таковой то воспринимался. Если одна плата при этом все успевает, а вторая нет, то это проблемы второй платы, а не твои как разработчика по. На самом деле это конечно автоматом становится твоей проблемой...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Akina
Дата 5.8.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(JusTalionis @  4.8.2007,  09:46 Найти цитируемый пост)
А то за оффтоп Акина щас громы и молнии метать начнет 

Может, перенести куда? в порядке превращения оффтопа в обсуждение по существу? Тема-то по сути интересная (воды, правда, многовато, но это нормально)...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




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


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

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