Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Феномен WinXP

5.6K
01 ноября 2004 года
_RA_
15 / / 02.05.2004
Доброго времени суток всем.....
Помогите разобраться с одной проблемкой, а то уже мозги кипят......
В общем, проблема такая:
После тестирования некоторых моих программ на ХР(писал я их под 98 )
выяснилось, что они работают крайне медленно......
Путем долгих исканий, я пришел к следующиему феномену:

имеется вот такой код:


do
ctm = GetTickCount
If ctm - ltm > mult Then
ltm = ctm

'.....любые действия....

Fps=Fps+1
DoEvents
end if
Loop


Как видно, цикл почти пустой - подсчет ФПС и замедлитель.

Проверяем, прошло ли mult миллисекунд, и если нет, то пропускаем код в теле цикла(т.е. те самые .....любые действия....)


Соответственно скорость он должен давать около 200 ФПС при переменной
mult=3. И несколько тысяч ФПС при mult=0.

В 98 все так и происходит. Но под ХР ОН ДАЕТ СКОРОСТЬ ~ 64 ФПС!!!!!!
Причем цикл без замедлителя дает нормальную скорость!
Логично было бы предположить, что дело в замедлителе, но ведь при mult равном нулю он не должен замедлять цикл вообще!!!!!
Правда, если поставить mult равным отрицательному числу, то цикл будет работать с правильной скоростью. Но тут другая проблема - скорость слишком велика, цикл необходимо замедлить! А замедлитель, как уже ясно из вышесказанного, при установке любого неотрицательного значения замедляет цикл не так как надо, а полностью снижает его скорость! До 60 фпс!!

Но все это еще пол беды. Я понял бы, если бы оказалось, что не работает только этот механизм замедления.
И я бы стал использовать Sleep. Правда, он не совсем подходит в ситуации, когда в цикле много инструкций - Sleep приостанавливает выполнение программы на указанный промежуток времени и не переходит к следующей строке, пока но не пройдет. В отличие от Sleep, код с GetTickCount просто не выполняет процедуры в IF'е, а переходит далее по программе, если время не прошло..........

Но я смирился бы и с этим, но проклятый цикл не хочет быстро работать ДАЖЕ ПРИ ЗАМЕНЕ МОЕГО ЗАМЕДЛИТЕЛЯ НА SLEEP!!!!!!!!!

И выдает тот же результат!

Я просто не знаю, что делать - эти семь строк кода портят мне жизнь!
Дело усугубляется тем, что у меня не ХР а 98, и тестировать мои попытки справится с этой проблемой довольно затруднительно. К счастю, друг помогает - у него ХР........

Кто знает, как разобраться с этой проблемой - помогите плз!!!!

P.S. Перепробовал кучу способов замедления, даже пример от микросововцев!
258
02 ноября 2004 года
SergeySV
1.5K / / 19.03.2003
Не совсем понятно (или уже сказывается конец рабочего дня), "Проверяем, прошло ли mult миллисекунд, и если нет, то пропускаем код в теле цикла", а если не прошло, то будем выполнять эти самые - '.....любые действия...., и я так понимаю в них должен стоять Exit Do, чтобы выйти из цикла?! Т.е. сам цикл является оберткой для этих самых - любых действий - чтобы просто они не выполнялись раньше времени, а потом код идет дальше? Или же этот цикл постоянно крутится повторяя эти "любые действия", токо иногда вставляя в них паузы.

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

Вообщем, весь код в студию. Кстати у меня стоит дома winXp и я бы мог потестить, если бы ты выложил бы сюда работающий модуль или саму программку...
5.6K
02 ноября 2004 года
_RA_
15 / / 02.05.2004
Верен второй вариант.
Этот код я привел для примера.
Проверь его под ХР, увидишь, что ФПС у тебя максимум 64.....................


Целиком прогу выложить не могу - это уже законченная и полностью рабочая игра, НО:
под ХР сказывается вот эта проблема.
Сначала я думал, что проблема может быть зарыта в каких-либо еще процедурах, вызываемых в цикле, но позже мне удалось сузить проблема до этих нескольких строк. Именно они в 98 выполняются как надо, а в ХР - нет.
5.6K
02 ноября 2004 года
_RA_
15 / / 02.05.2004
Саму игру(не в исходных кодах, разумеется) можно увидеть на http://goblin-wars.narod.ru

так что создай пустой проект, кинь на форму кнопку , лейбл и таймер, и посмотри как выполнится следущее:



Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim ctm As Long, ltm As Long, mult As Long, fps As Long
Dim i As Long

Private Sub Command1_Click()
Randomize
Do
DoEvents

ctm = GetTickCount
If ctm - ltm > mult Then
ltm = ctm

i = Rnd * 100 'эта функция тут для примера. На самом деле, здесь находятся функции игры - отрисовка карты, проверка нажатых клавиш...

End If
fps = fps + 1
Loop
End Sub

Private Sub Form_Load()
mult = 30000000
End Sub

Private Sub Timer1_Timer()
Label1.Caption = "FPS:" & fps
fps = 0
End Sub


В 98 этот код работает нормально - поышение mult снижает коичество выполнений цикла в секунду, ФПС....

В ХР любой mult, даже 0 снижает скорость до 64 фпс.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог