Что нового

[Автоматизация] Возможно ли ускорить работу AutoIt

zerobot

Новичок
Сообщения
78
Репутация
0
Добрый день!
Знаю что вопрос может звучать глупо... но...
Возможно ли как-то увеличить скорость работы autoit программы? Быть может есть какие-то приёмы или способы оптимизации?
Дело в том, что моя программа-бот для наведения в игре, скорость наведения приемлемая, но очень хотелось бы быстрее.
Понимаю что C++ для таких целей подходит больше, но я слишком слабо с ним знаком.

Возможно ли как-то увеличить скорость обработки массивов в autoit, увеличить скорость пустого цикла, возможно как-то направить ресурсы системы или отчистить как-то код? Создать псевдомногопоточность может быть?
Мб кто-то пробовал что-то такое делать или имеет какие-то идеи по этому поводу, подскажите пожалуйста.
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
Мб это была шутка :(
Мне всё равно не достаточно, может быть кто-нибудь знает какие-то способы ускорения работы AutoIt ???
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
оптимизация всегда помогает и увеличивает производительность :smile:
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
А что понимают под оптимизацией? Я вроде максимально всё упростил, более важные условия поставил выше чем менее...
 

erlik

Продвинутый
Сообщения
317
Репутация
84
AZJIO
Хорошая шутка :rofl: В первые три секунды я даже поверил, что оно есть ;D
--------------------------------------------------
...В качестве предположения по теме - некоторые гуру используют в скриптах опкод (представление функций в готовом машинном коде) - какое то улучшение производительности это наверняка дает. Или нет?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
А что можно посоветовать для скрипта, которого не видишь?
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
Скрипт очень большой и честно говоря приватный...
Эм, быть может на каком-то простом случайном примере покажете?
И вот постом выше о переводе функций в машинный код, может быть кто-то подскажет как это делается?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
zerobot [?]
Эм, быть может на каком-то простом случайном примере покажете?
Пример показать можно, но это ничего не даёт в конкретном случае. К примеру у меня скрипт пару лет спустя удалось оптимизировать в 100-1000 раз, в зависимости от входящих данных.
Цель оптимизации снизить холостые ходы, опрашивать события только когда требуется ситуация. Когда скрипт понимается каждый его шаг и совпадает с логикой замысла, а не с тем, с чем приходится мирится, от безвыходной ситуации.
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
скрипт целиком не надо, достаточно куска где происходит поиск чего-то и дальнейшая сортировка, если что то находится быстро значит и скрипт работает быстро, вот тут и надо его оптимизировать, все остальное не нужно ;)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Счётчик времени ставить на каждый участок скрипта с записью в лог. Чинить самый медлительный участок кода.
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
Код:
$i1 = _memoryread($engine_dll + $iPos, $process, "float")
				$i2 = _memoryread($engine_dll + $iPos + 4, $process, "float")
				$i3 = (_memoryread($engine_dll + $iPos + 4 + 4, $process, "float")) - 5							
For $i = 1 To 64 Step 1
$you1 = _memoryread($m_dwBoneMatrix + ((48 * ($AimBot)) + 12), $process, "float")
									$you2 = _memoryread($m_dwBoneMatrix + ((48 * ($AimBot)) + 28), $process, "float")
									$you3 = _memoryread($m_dwBoneMatrix + ((48 * ($AimBot)) + 44), $process, "float")
									If $you1 <> 0 And $you2 <> 0 And $you3 <> 0 Then
										$delta1 = ($i1 - $you1)
										$delta2 = ($i2 - $you2)
										$delta3 = ($i3 - $you3)
										$hyp = Sqrt($delta1 * $delta1 + $delta2 * $delta2)
										$Angel1[$i] = (ATan($delta3 / $hyp) * $MR)
										$Angel2[$i] = (ATan($delta2 / $delta1) * $MR)
					_MemoryWrite($engine_dll + $SetAng, $process, $Angel1[$i], "float")
					_MemoryWrite($engine_dll + $SetAng + 4, $process, $Angel2[$i], "float")
					_MemoryWrite($engine_dll + $SetAng + 4 + 4, $process, 0.0, "float")
Endif
Next


Очень сильно урезал, но это суть...
По сути почти каждая строчка софта использует Memoryread или memorywrite, а также математические вычисления.
P.S Общая длина скрипта ~311 строк.


Добавлено:
Сообщение автоматически объединено:

Извините, а как поставить временной счётчик?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
zerobot
Это можно вычислить за пределами цикла
Код:
48 * ($AimBot)


Код:
If $you1 <> 0 And $you2 <> 0 And $you3 <> 0 Then ; не оптимизировано
If $you1 And $you2 And $you3 Then ; оптимизировано


Счётчик времени
Код:
$timer = TimerInit() ; засекаем время
; здесь измеряемый код
MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer) / 1000, 2) & ' сек') ; выдача времени выполнения кода



Добавлено:
Сообщение автоматически объединено:

Вычислить за приделами цикла
Код:
$engine_dll + $SetAng


Счётчик времени в миллисекундах
Код:
$timer = TimerInit() ; засекаем время
; здесь измеряемый код
MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer), 2) & ' мсек') ; выдача времени выполнения кода


Вот запись данных в лог


Добавлено:
Сообщение автоматически объединено:

Из цикла видно, что если $you1 равен 0, то запрашивать $you2, $you3 бессмысленно. То есть создать пару вложенных условий. Причём наиболее вероятно-отрицательный вариант ставить первым чтобы снизить число бессмысленных запросов.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
zerobot
Можешь эту тему почитать:
http://autoit-script.ru/index.php/topic,2981.0.html
Некоторые вещи dll на PureBasic делают гораздо быстрее, + там вроде как есть многопоточноть

Хороший пример обхода ограничений Autoita с помощью dll на PureBasic здесь:
http://autoit-script.ru/index.php?topic=3049.0
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Код:
$i1 = _memoryread($engine_dll + $iPos, $process, "float")
$i2 = _memoryread($engine_dll + $iPos + 4, $process, "float")
$i3 = _memoryread($engine_dll + $iPos + 4 + 4, $process, "float") - 5
$tmp = 60 * $AimBot
$engine_dll_SetAng = $engine_dll + $SetAng
For $i = 1 To 64
	$you1 = _memoryread($m_dwBoneMatrix + ($tmp), $process, "float")
	If $you1 Then
		$you2 = _memoryread($m_dwBoneMatrix + $tmp + 16, $process, "float")
		If $you2 Then
			$you3 = _memoryread($m_dwBoneMatrix + $tmp + 32, $process, "float")
			If $you3 Then
				$delta1 = $i1 - $you1
				$delta2 = $i2 - $you2
				$delta3 = $i3 - $you3
				$hyp = Sqrt($delta1 * $delta1 + $delta2 * $delta2)
				$Angel1[$i] = ATan($delta3 / $hyp) * $MR
				$Angel2[$i] = ATan($delta2 / $delta1) * $MR
				_MemoryWrite($engine_dll_SetAng, $process, $Angel1[$i], "float")
				_MemoryWrite($engine_dll_SetAng + 4, $process, $Angel2[$i], "float")
				_MemoryWrite($engine_dll_SetAng + 8, $process, 0.0, "float")
			EndIf
		EndIf
	EndIf
Next
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
На сколько я понял, мне уже не хватает совсем чуть-чуть, я перебрал код, сделал всё слегка иначе и понял что мне не хватает скорости из-за работы функции _MemoryWrite()
Вот и она:
Код:
Func _MemoryWrite($iv_Address, $ah_Handle, $v_Data, $sv_Type = 'dword')
 
   If Not IsArray($ah_Handle) Then
      SetError(1)
        Return 0
   EndIf
 
   Local $v_Buffer = DllStructCreate($sv_Type)
 
   If @Error Then
      SetError(@Error + 1)
      Return 0
   Else
      DllStructSetData($v_Buffer, 1, $v_Data)
      If @Error Then
         SetError(6)
         Return 0
      EndIf
   EndIf
 
   DllCall($ah_Handle[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
 
   If Not @Error Then
      Return 1
   Else
      SetError(7)
        Return 0
   EndIf
 
EndFunc


Исполнение вот этого момента:
Код:
$timer = TimerInit()
_MemoryWrite($engine_dll_SetAng, $process, $Angel1[$i], "float")
_MemoryWrite($engine_dll_SetAng + 4, $process, $Angel2[$i], "float")
_MemoryWrite($engine_dll_SetAng + 8, $process, 0.0, "float")
MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer), 2) & ' мсек')

В среднем занимает 0.14 мс.

Результат хороший :IL_AutoIt_1:, но для моей игры не хватает... Может быть есть возможность увеличить скорость ещё? Может быть взять эту функцию из другого ЯП или перевести в машинный код, как тут говорили или может оптимизировать найдёте что?

Т.е весь мой код сводится к оптимизации вот этих трёх строк, и необходимо побить результат в 0.14 мс. :scratch:
 

asdf8

Скриптер
Сообщения
564
Репутация
152
zerobot [?]
Результат хороший
I_Love_AutoIt_BigGrin.gif
, но для моей игры не хватает... Может быть есть возможность увеличить скорость ещё?

Я бы, лично, для начала, выкинул бы из кода все лишнее, типа того :
Код:
$timer = TimerInit()
If IsArray($process) Then
	$v_Buffer = DllStructCreate("float")
	$iBuffSize = DllStructGetSize($v_Buffer)
	$iBuffPtr = DllStructGetPtr($v_Buffer)
	
	DllStructSetData($v_Buffer, 1, $Angel1[$i])
	DllCall($process[0], 'int', 'WriteProcessMemory', 'int', $process[1], 'int', $engine_dll_SetAng, 'ptr', $iBuffPtr, 'int', $iBuffSize, 'int', 0)
	DllStructSetData($v_Buffer, 1, $Angel2[$i])
	DllCall($process[0], 'int', 'WriteProcessMemory', 'int', $process[1], 'int', $engine_dll_SetAng + 4, 'ptr', $iBuffPtr, 'int', $iBuffSize, 'int', 0)
	DllStructSetData($v_Buffer, 1, 0)
	DllCall($process[0], 'int', 'WriteProcessMemory', 'int', $process[1], 'int', $engine_dll_SetAng + 8, 'ptr', $iBuffPtr, 'int', $iBuffSize, 'int', 0)
EndIf
MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer), 2) & ' мсек')


Если надо еще быстрее писать в память процесса - нужно инжектиться в этот процесс.
Хотя, по моему, дело здесь совсем в другом - ну нет ни у одного человека реакции 0.14 мс.
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
Я как раз пытаюсь достичь эффекта такого же как у инжект софта, а именно приблизиться к нему, у него выходит наведение такое как мне нужно каждый раз, а у меня через раз...
Хотя благодаря вашему коду стало лучше, примерно 5-6 из 10 стреляют как надо, раньше было 1-2...
Нужно как-то ускорить ещё, без инжекта. Может ещё и в машинный код перевести как тут говорили, только как это делается, как используется и сколько даёт)
Эксперты аутоита помогайте))
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
AZJIO,
статья ни о чем. Всю её ты пересказал одним предложением. ;D

zerobot,
как ты получаешь массив $process ?
 
Верх