Перейти к содержанию

Sleep для ассемблер СЕ.


Рекомендуемые сообщения

Мастера снова я к Вам.

Допустим имеется инструкция 

inc eax

Я хочу перед каждым выполнением этой инструкции, делать паузу с помощью Sleep.

Делаю так:

pushad
push #3000  // 3 секунды.
call Sleep
popad
inc eax

но это приводит к замиранию всей игры на 3 сек.

Как сделать паузу только для одной инструкции?

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Попробовал ещё несколько способов, но всё приводит либо к окончательному зависанию, либо к вылету из игры.

Один из способов делает примерно тоже, что и в первом сообщении - создание цикла с ничего неделающим операндом, идея родилась при чтении этого:

http://www.kolasc.net.ru/cdo/programmes/assembler/loop.html

 

push ecx
mov ecx,#1000000000 // около 1 сек
jecxz @f
cycl:
nop
loop cycl
@@:
pop ecx
inc eax

Этот способ приводит также к зависанию игры на 1 сек.  

Ссылка на комментарий
Поделиться на другие сайты

  В 12.02.2016 в 19:05, Garik66 сказал:

Этот способ приводит также к зависанию игры на 1 сек.  

Показать  

LOL тебе нужен асинхронный таймер:

call GetTickCount64
cmp [TimeCheck],0
jnz @f
mov [TimeCheck],eax
@@:
sub eax,[TimeCheck]
cmp eax,2000
jb @f
mov [TimeCheck],0
@@:

 

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

  В 12.02.2016 в 21:21, gmz сказал:

LOL тебе нужен асинхронный таймер:

Показать  

А что тут смешного то?:P

 

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

Попробовал у себя вставил весь твой код, но тоже произошло зависание всей игры, а потом ещё и вылет.:wacko: Так что не сработало.

 

Короче, работают первый и второй способ, но нужно отделить инструкцию inc eax, от всего остального, чтобы пауза работала только с инструкцией inc eax.

Попробовал добавить флаги-переключатели (несколько вариантов), но пока безрезультатно. 

Попробую ещё со вставкой на LUA, может поможет.

 

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

  В 13.02.2016 в 07:48, Garik66 сказал:

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

Показать  

в каком месте ты видишь в моем коде цикл? :D

имей в виду что eax ecx edx GetTickCount64 перетирает. попробуй вставить чисто мой код и смотри как каждые ~2сек в TimeCheck ставится 0

1 и 2 способы - бред.

Ссылка на комментарий
Поделиться на другие сайты

 

  В 13.02.2016 в 09:12, gmz сказал:

имей в виду что eax ecx edx GetTickCount64 перетирает.

Показать  

gmz, а об этом нужно было сразу предупредить - я же не телепат:P, ( я уже тебе писал - спускайся с небес твоего уровня знаний на наш, давай информацию более подробно, если уже решил её дать).

Поставил паши и попы, где нужно - вылетов из игры нет. :)

Но, если вставить твой код вместо inc eax, то это просто приводит к замораживанию значения eax (т.е. проще занопить инструкцию).

Если же вставить твой код перед inc eax. то eax продолжает увеличиваться как не в чём не бывало, как будто твоего кода и нет.

Так что приведу лучше весь скрипт, думаю в твоём коде где-то ошибочка :P, проверь его пожалуйста.

  Показать контент

 

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

@f -> вперед прыг

перед тем как юзать апи винды посмотрел бы как они реализ. xD

вероятно так будет ОК:

newmem_TimerMission:
push eax
push ecx
push edx
call GetTickCount64
cmp [TimeCheck],0
jnz @f
mov [TimeCheck],eax
@@:
sub eax,[TimeCheck]
cmp eax,1000
jb @f
mov [TimeCheck],0
@@:
pop edx
pop ecx
pop eax

cmp [TimeCheck],0
jnz @f
inc eax
@@:
mov [ecx+08],eax
pop esi
jmp returnhere_TimerMission

 

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

  В 13.02.2016 в 10:45, gmz сказал:

@f -> вперед прыг

Показать  

Да перепутал (b в jb меня запутало, я почему-то это увидел как jb @b), но моя ошибка не меняет дела - в коде у тебя всё равно цикл.

 

Твой вариант сейчас попробую

Ссылка на комментарий
Поделиться на другие сайты

  В 13.02.2016 в 11:05, Garik66 сказал:

в коде у тебя всё равно цикл

Показать  

он не прыгает назад, все время вперед = не цикл lol иначе бы завис поток как в тех 1 и 2 вариантах..

 

  В 13.02.2016 в 11:10, Garik66 сказал:

Скольки секундам будет соответствовать, например cmp eax,1000?

Показать  

~1сек (если поток тормознет где то - будет больше)

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

  В 13.02.2016 в 11:12, gmz сказал:

он не прыгает назад, все время вперед = не цикл lol иначе бы завис поток как в тех 1 и 2 вариантах..

Показать  

Я это уже увидел, цикл в том что Inc eax не сработает пока eax не станет равным 1000 - а это всё равно цикл. ;)

  В 13.02.2016 в 11:12, gmz сказал:

~1сек (если поток тормознет где то - будет больше)

Показать  

По-видимому притормаживает, так как визуально в игре пауза около 3-х секунд.

 

 

не смотря на все твои: 

  В 12.02.2016 в 21:21, gmz сказал:

LOL

Показать  

и своеобразную  подачу инфы - СПАСИБО тебе большое!!! - часто мне помогаешь. :)

 

Результат выложил здесь:

 

 

Изменено пользователем Garik66
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

  В 13.02.2016 в 09:12, gmz сказал:

1 и 2 способы - бред.

Показать  

не бред :P, просто на СЕ Асссемблер не знаю как сделать это отдельным потоком.:wacko: Вот в этом и просил помочь.

Вот сейчас реализовал с помощью Sleep, но вставкой LUA, в ней автоматически идёт отдельным потоком и поэтому всё работает, как и задумывалось. Скрипт посмотри, если интересно, в теме:

 

Работает на много точнее (ну и самого кода поменьше), предложенного тобой метода, т.е. Sleep "3000" точно соответствует ровно 3 сек задержки таймера.  

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.