Феномен WinXP
Помогите разобраться с одной проблемкой, а то уже мозги кипят......
В общем, проблема такая:
После тестирования некоторых моих программ на ХР(писал я их под 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. Перепробовал кучу способов замедления, даже пример от микросововцев!
Просто пока, в приведенном коде я не вижу ни одного условия выхода из цикла... даже если верен второй вариант, как-то пользователь должен же прекращать работу твоей программы?
Вообщем, весь код в студию. Кстати у меня стоит дома winXp и я бы мог потестить, если бы ты выложил бы сюда работающий модуль или саму программку...
Этот код я привел для примера.
Проверь его под ХР, увидишь, что ФПС у тебя максимум 64.....................
Целиком прогу выложить не могу - это уже законченная и полностью рабочая игра, НО:
под ХР сказывается вот эта проблема.
Сначала я думал, что проблема может быть зарыта в каких-либо еще процедурах, вызываемых в цикле, но позже мне удалось сузить проблема до этих нескольких строк. Именно они в 98 выполняются как надо, а в ХР - нет.
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 фпс.
Саму игру(не в исходных кодах, разумеется) можно увидеть на
так что создай пустой проект, кинь на форму кнопку , лейбл и таймер, и посмотри как выполнится следущее:
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 фпс.