Как вычислить ФПС? Как ускорить работу с графикой?

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

Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение Don Leno » 06.03.2015 (Пт) 20:18

У меня два вопроса: как вычислить ФПС? Как ускорить работу с графикой?
Ниже приведен мой код программы:
Код: Выделить всё
Public stoper As Boolean
Public x As Long

Sub InitGraph()
stoper = False
frmMain.Show
Set lrbg = LoadPicture(App.Path + "\sbg.jpg")
End Sub

Sub Sync()

Set lrMain = LoadPicture(App.Path + "\main.jpg")
' Приходится каждый раз грузить изображение
' в память!!! Это сильно тормозит прогу

hMain = CreateCompatibleDC(frmMain.hdc)
hbg = CreateCompatibleDC(frmMain.hdc)

SelectObject hMain, lrMain.Handle
SelectObject hbg, lrbg.Handle
x = x + 20
If x = 200 Then x = 0
BitBlt hMain, x, 50, 200, 200, hbg, 0, 0, SRCCOPY

SelectObject hMain, lrMain

frmMain.Picture = lrMain


DeleteDC hbg
DeleteDC hMain


End Sub

Sub Main()
Call InitGraph
x = 0
Do Until stoper = True
tmr = GetTickCount
Sync
DoEvents
tmr = GetTickCount - tmr
frmMain.lblFPS.Caption = "FPS: " & Str(1/tmr)
' Здесь я применил Апи GetTickCount для вычисления времени кадра и
'потом секунду разделил на время кадра, но у меня показывает 1-2 ФПС?!
' 8) непонимаю что не так(((
Loop

'MsgBox "End!"
End
End Sub


Буду благодарен если кто поможет)))

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

Re: Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение Хакер » 07.03.2015 (Сб) 4:23

как вычислить ФПС?

Не надо считать количество времени, ушедшее на один кадр, а затем выводить величину 1 / frame_time. Надо считать кадры, а каждую секунду выводить значение счётчика и сбрасывать его в 0. Можно не каждую секунду, а каждые полсекунды, но выводить тогда скомпенсированное на соответствующий коэффициент значение (×2 в случае с половиной секунды).

Код омерзителен отсутствием отступов, при чтении крововые слёзы проступают.

Код: Выделить всё
Set lrMain = LoadPicture(App.Path + "\main.jpg")
' Приходится каждый раз грузить изображение
' в память!!! Это сильно тормозит прогу

Кто же заставляет поступать так тупо? «Приходится»... Да с чего бы это оно так приходится?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение Don Leno » 07.03.2015 (Сб) 15:48

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

Спасибо за подсказку с фпс)))

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

Re: Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение ger_kar » 07.03.2015 (Сб) 16:42

Don Leno писал(а):но пишу лишь для себя, а не для других
Так для себя в первую очередь необходимо писать хорошо структурированный код. Причем это должно войти в привычку. Ведь самому же приятно смотреть на свой эстетически красиво оформленный код, а то, что с ним в разы лучше разбираться про это я просто помолчу...
Бороться и искать, найти и перепрятать

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

Re: Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение Хакер » 07.03.2015 (Сб) 17:17

Don Leno писал(а):Согласен код омерзителен, но пишу лишь для себя, а не для других.

При этом ты в данный момент занимаешься тем, что показываешь этот код другим и просишь в нём копаться. Не находишь противоречие?

Don Leno писал(а):Если знаешь альтарнативу вместо загрузки изображения по новой - напиши.

Знаю. Пишу: загружать картинку единожды.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение Don Leno » 07.03.2015 (Сб) 17:39

У меня всег две картинки. 1 - фон, 2 - движущийся объект. То есть при наложении получается шлейф. Как этого избежать? Как загрузить фон единожды и потом по новой наложить объект на него?

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение bon818 » 08.03.2015 (Вс) 14:04

загрузить фон единожды....

Код: Выделить всё
Sub Main()
Set lrMain = LoadPicture(App.Path + "\main.jpg")
...........
Call Sync(lrMain)
...........


[Хакер] :: Вот неужели не хватает сообразительности не использовать [icode] вместо [code] для многострочных фрагментов кода? Уже не первый раз замечаю за bon818 это. Исправлено.
Последний раз редактировалось Хакер 08.03.2015 (Вс) 17:04, всего редактировалось 1 раз.
Причина: Неправильное использование BB-кодов.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение Don Leno » 13.03.2015 (Пт) 15:31

bon818 это не помогло, проверил. Изображение оставляет шлейф. Я хочу использовать как бы несколько слоев. Один рисунок - это фон, второй - движущийся объект, третий - еще что нить. При наложении всех слоев в один - должен получаться один кадр который я потом присваиваю к рисунку формы. После чего все происходит по новой.

VisualFreeBasic
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 14.02.2021 (Вс) 20:28

Re: Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение VisualFreeBasic » 14.02.2021 (Вс) 21:55

Точность API GetTickCount составляет около 15 миллисекунд, что относительно неточно. Рекомендуется использовать timeGetTime и сначала установить высокоточный timeBeginPeriod.

The accuracy of the GetTickCount API is about 15 milliseconds, which is relatively inaccurate. It is recommended to use timeGetTime and set the high-precision timeBeginPeriod first

Код: Выделить всё
Private Declare Function timeBeginPeriod Lib "winmm.dll" _
  (ByVal uPeriod As Long) As Long
Private Declare Function timeEndPeriod Lib "winmm.dll" _
  (ByVal uPeriod As Long) As Long

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
timeBeginPeriod  1
t=timeGetTime
msgbox "aa"
msgbox timeGetTime -t

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Как вычислить ФПС? Как ускорить работу с графикой?

Сообщение Don Leno » 18.04.2021 (Вс) 11:52

VisualFreeBasic, thanx, конечно))
Но правда поздновато!)) Не забывай смотреть на даты. А то получается некропостинг)))


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

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

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

    TopList