Феномен WinXP

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

Феномен WinXP

Сообщение Ariman » 01.10.2004 (Пт) 0:34

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

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

Код: Выделить всё
do
ctm = GetTickCount
If ctm - ltm > mult Then
ltm = ctm
Fps=Fps+1
DoEvents
end if
Loop


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

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

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

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

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

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

В общем, с этим феноменом связано и то, что моя игра(GoblinWars) под XP и 2k тормозит, вне зависимости от конфигурации компа!

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

Dagobert
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 141
Зарегистрирован: 21.12.2002 (Сб) 6:48
Откуда: Russia

Сообщение Dagobert » 01.10.2004 (Пт) 2:30

Если ты пользуешся именно этим кодом для замедления - как он работает? У тебя бесконечный цикл - без выхода (Exit Do). Перешли мне кусочек кода - посмотрю.
Кстати я в в своих играх замедлением не пользуюсь. Отучили слава богу. Я для игровых объектов задаю своё время. Скорость которого я сам регулирую.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 01.10.2004 (Пт) 2:54

Цикл, разумеется, бесконечный. Главный цикл игры.
Ты спрашиваешь, как работает код замедления? Получаем время, прошедшее со старта виндов - отличная начальная точка.
Смотрим, прошло ли mult миллисекунд со времени последнего выполнения. Если да, то выполняем цикл снова, а время выполнения заносим в ltm.

А кусочек кода я и так привел :lol:
Проблема - то кроется именно в этих семи строках!

Кстати я в в своих играх замедлением не пользуюсь. Отучили слава богу. Я для игровых объектов задаю своё время. Скорость которого я сам регулирую.

Ну, GoblinWars, это фактически моя первая настоящая игра... По этому здесь я поступил так, как умею....
А можно по-подробнее о твоем методе? Если не сложно, то лучше пиши на мыло. А этот пост оставим для обсуждения и решения этой странной проблемы......

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 01.10.2004 (Пт) 7:42

У тебя изначально неверно организовано. Нехорошо тормозить программу циклом. Даже с DoEvents.

Счас добрые люди научат тебя пользоваться таймером... Можно и мультимедийным...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 01.10.2004 (Пт) 11:24

Да кто вам сказал, что я циклом торможу :?: :?: :!: :!:
Поясняю:

Код: Выделить всё
do 'Начало главного цикла игры
ctm = GetTickCount       'Задержка, не выполняем
If ctm - ltm > mult Then 'операции, пока не прошло
ltm = ctm                      'mult миллисекунд
'Здесь находятся функции игры,
'Которые я по понятным причинам не стал приводить
Fps=Fps+1
DoEvents
end if
Loop

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 01.10.2004 (Пт) 11:27

Надеюсь, теперь понятно?
Do - главный цикл игры, а не замедлитель!!!

Замедлитель вот:
Код: Выделить всё
ctm = GetTickCount
If ctm - ltm > mult Then
ltm = ctm 
.........
end if

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.10.2004 (Пт) 14:54

То же самое, что и цикл.
Тебе совсем о другом подходе говорят.
Например, у тебя двигается фигура по прямой. Ты можешь ее движение сделать как X=X+DX, Y=Y+DY, с таким вот замедлителем. А можешь описать движение, как X=f(t), Y=f(t) и тогда тебе замедлитель вообще не понадобиться.
Lasciate ogni speranza, voi ch'entrate.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 01.10.2004 (Пт) 20:56

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

Ну а во-вторых:
Если пример не такой простой, как движение точки по прямой??
И параметр t мне откуда брать?

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 01.10.2004 (Пт) 21:00

Покажите мне на конкретном примере:

Есть функция DrawPlayer.
Она обрабатывает клавиши, относящиеся к игроку и выводит его на экран.

При нажатии кнопки "вниз" смотрится скорость на тайле, который лежит ниже, и к координате игрока прибавляется скорость на данном тайле.
И что ты предлагаешь мне здесь сделать?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.10.2004 (Пн) 12:31

Наверное прибавляется не скорость, а координата?
Вот не надо прибавлять координаты.
Делаешь функцию x=fx(t); y=fx(t) (t - время, которое прошло с момента нажатия на кнопку). Когда нажимается кнопка "Влево", в функции fx изменяются коэффициенты (функция имеет вид k*t+b, k - скорость, b - начальная координата). Тоже самое для кнопки "Вправо" (коэффициент с обратным знаком) и для "Вверх"/"Вниз" (координаты по вертикали). При нажатии на управляющие кнопки сбрасывается t на ноль и пересчитываются коэффициенты b (для X- и Y-координат, соответственно текущее положение тела по X- и Y-осям).
Изменять функцию DrawPlayer придется довольно серьезно, потому что подход будет совершенно другой. Зато не будет зависеть от быстродействия машины.
Lasciate ogni speranza, voi ch'entrate.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 04.10.2004 (Пн) 21:38

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

При нажатии на управляющие кнопки сбрасывается t на ноль и пересчитываются коэффициенты b (для X- и Y-координат, соответственно текущее положение тела по X- и Y-осям)

На какие управляющие? Может, t сбрасывается на ноль не при нажатии на управляющие, а при отпускании стрелок?

Да, и еще вопрос: ведь придется где-то хранить и обновлять время, прошедшее с момента нажатия на клавишу? Не снизит ли это скорость?

А вообще, спасибо большое, в общем и целом метод ясен.

Но все же, если вернуться к теме феномина ХР????

Почему в 98 втавка любого замедлителя замедляет прогу так, как надо, а в ХР втавка любого замедлителя замедляет прогу до ~64 ФПС?

PSV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 29.01.2002 (Вт) 12:30
Откуда: Россия

Сообщение PSV » 05.10.2004 (Вт) 11:47

Ariman писал(а):Но все же, если вернуться к теме феномина ХР????

Почему в 98 втавка любого замедлителя замедляет прогу так, как надо, а в ХР втавка любого замедлителя замедляет прогу до ~64 ФПС?


Цикл вида

do
...
DoEvents
loop условие

если в нем мало чего происходит, порождает загрузку любого CPU близко к 100%, плюс, если ты нечаяно при обработке первого такого цикла вдругом месте вызовешь такую конструкцию... может получитьс в итоге очень плохо.

Так же, незабывай что Win9x выдает максимум приритета твоей проге, а в XP где многозадачность реализована серьезнее то что у тебя происходит может обьясняться фоновыми процессами или железом.

Кроме того, то как ты используешь GetTickCount некорректно, так как ты не анализируешь ее значение на переполнение знакового диапазона (в VB только знаковые целые) и на сброс после достижения максимума, подробнее - см. http://www.smsoft.ru/ru/vbwait.htm.

В приведенной ссылке описана процедура которая позволит тебе ждать сколько нужно без излишней загрузки CPU и с обработкой событий. Единственное что мне не очень понравилось как в этом примере решаются проблемы сброса и переполнения GetTickCount, поэтому наверное стоит заменить ее на Timer.

В итоге у тебя должно получиться:

Код: Выделить всё
do 'Начало главного цикла игры

    MsgWaitObj mult  'Задержка mult миллисекунд

    'Здесь находятся функции игры,
    'Которые я по понятным причинам не стал приводить

    DoEvents

Loop

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 05.10.2004 (Вт) 12:01

Ссылку сейчас посмотрю, спасибо.
Наконец-то ответ по теме!
Но с причинами я несовсем согласен:

если в нем мало чего происходит, порождает загрузку любого CPU близко к 100%, плюс, если ты нечаяно при обработке первого такого цикла вдругом месте вызовешь такую конструкцию... может получитьс в итоге очень плохо.


В моей программе цикл не пустой. Пустым я его привел для примера.
Так что я не сказал бы, что в нем мало чего происходит....

Так же, незабывай что Win9x выдает максимум приритета твоей проге, а в XP где многозадачность реализована серьезнее то что у тебя происходит может обьясняться фоновыми процессами или железом.


А в начале проги стоят функции, устанавливающие ей максимальный приоритет....

Так что причины тормозов мне все же не ясны.....

PSV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 29.01.2002 (Вт) 12:30
Откуда: Россия

Сообщение PSV » 05.10.2004 (Вт) 13:46

Ariman писал(а):Ссылку сейчас посмотрю, спасибо.
Наконец-то ответ по теме!
Но с причинами я несовсем согласен:

В моей программе цикл не пустой. Пустым я его привел для примера.
Так что я не сказал бы, что в нем мало чего происходит....


А это не про причины - это про недочеты :)

Так же, незабывай что Win9x выдает максимум приритета твоей проге, а в XP где многозадачность реализована серьезнее то что у тебя происходит может обьясняться фоновыми процессами или железом.

А в начале проги стоят функции, устанавливающие ей максимальный приоритет....

Так что причины тормозов мне все же не ясны.....


Ну и что что приоритет - в худшем случае разве что систему подвесишь.

Приемер:
PII 400, WinNT4 wks. - время засекаемое Timer на выполнение простого цикла - 10мс
Athlon XP 3200+ W2k srv. - время засекаемое Timer на выполнение простого цикла -16мс...

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 05.10.2004 (Вт) 15:11

Ну, в общем, я по ссылке зашел, посмотрел.
Сейчас отослал на тестирование Tarik'у - у него ХР.
Надеюсь, что все будет о.к. Но в любом случае - большое спасибо!
Но мне, кстати, все же хотелось узнать причины такого странного замедления работы цикла....

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 07.10.2004 (Чт) 12:10

2 Ariman: Отец, я тут пример наваял простенький, может тебе поможет.

а) Систему не грузит ни на процент.
б) Константа 1000 определяет срабатывание ровно через секунду.

:scratch:
Код: Выделить всё
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Form_Activate()
Dim TM As Long
Dim N As Long
Do
If GetTickCount - TM > 1000 Then
N = N + 1
Me.Caption = N
TM = GetTickCount
End If
Sleep 2
DoEvents
Loop
End Sub
[/code]

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 07.10.2004 (Чт) 13:51

2 Ariman: Отец, я тут пример наваял простенький, может тебе поможет.

Спасибо, сын мой :D
Ну а под ХР этот код нормально работает, без глюков??

Да и вообще, от моего кода, приведенного в начале поста он отличается только строкой TM = GetTickCount, как мне кажется.......

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 08.10.2004 (Пт) 22:07

Так....... В общем, скажу следущее: ВСЕ ЗАМЕДЛИТЕЛИ, ПРЕДСТАВЛЕННЫЕ ЗДЕСЬ(В ТОМ ЧИСЛЕ И ПРИМЕРЧИК ОТ MICROSOFT'А) ГЛЮЧАТ В ХР!!!!!!!!!!!!!!!!!!
Ну кто-нибудь может сказать, почему в 98 все работает нормально, а в ХР дает стабильно 64 ФПС????

Это ж просто бред какой-то! Как только вставляешь хоть что-то призванное замедлить цикл(не на много!) скорость сбрасывается до 64 ФПС!!!
А в 98 все пашет как следует!!!!!!!!!!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.10.2004 (Пт) 22:26

В
XP
по-другому
реализована
многопоточность!

Вот.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.10.2004 (Пт) 23:24

:roll:
это "индуктивное заключение", или где-то об этом написано?

а то вдруг и правда так?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.10.2004 (Сб) 10:42

Об этом где-то написано :) Причём официально...
Нуно потестить ещё и на 2k - другая реализация многопоточности началась там.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 09.10.2004 (Сб) 12:12

Уже что-то......
Причины начинают прояснятся.......

Про 2К точно сказать не могу, но насколько я знаю: у моего друга вроде работало нормально, но когда я тестил на компе с 2к, то там тормозило.....
Проблема в том, что комп, на котором я тестировал сам по себе был слабый, а так как тестировал я не пустой цикл, то тормоза могли быть вызваны низким быстродействием компа.....

Ну ладно, причины вроде проясняются... Теперь главный вопрос: как с этим справится???
(Мне нужно справится именно с этой ситуацией, не предлагайте мне переписать прогу так, чтобы замедлитель не требовался. Это я уже понял и приму к сведению, но сейчас вопрос не о том)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.10.2004 (Сб) 13:05

Знаешь... 64 fps - это, на самом деле, неплохо...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 09.10.2004 (Сб) 22:37

Не, так не пойдет....
Неужели никто не может мне посоветовать, как справиться с этим неприятным эффектом????

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.10.2004 (Сб) 22:43

Ну для очистки совести попробуй использовать средства торможения самой винды. Например, waitable timers.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 09.10.2004 (Сб) 23:03

Нет, это все не работает. Я проверял!
На подобный метод есть ссылка в данном посте. А все, что здесь предлагалось я перепробовал......

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 10.02.2005 (Чт) 15:41

FleX_2004 писал(а):Блин... да не в таймере дело.... просто по умолчанию при смене режима экрана частота обновления кадров ставится в 60 что не есть хорошо....


:evil:
Ты играл в Goblin Wars :?: :evil:
Это оконная игра! Используется BitBlt!!!

Ariman

Вопрос:
Почему у всех вроде усё в порядке, а у тебя не так?
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 10.02.2005 (Чт) 15:49

Ariman

Вопрос:
Почему у всех вроде усё в порядке, а у тебя не так?


Это что, камень в мой огород? :evil:
Типа все умеют кодить, а я нет? :evil:
Ладно, а если серьезно, то ты что иеешь ввиду - что у всех GW идет нормально, а у меня нет, или что у всех циклы нормально работают а у меня - нет???

След.

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

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

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

    TopList  
cron