Что нового

[Процессы] AutoIt съедает очень много цп...

zerobot

Новичок
Сообщения
78
Репутация
0
Код:
Func Radar ()
$EntityBase = _memoryread($client_dll + $Entity, $process, "dword")
$LocalBase = _memoryread($client_dll + $Local, $process, "dword")
$MeFovx = _memoryread($engine_dll + $SetAng, $process, "float")
$MeFovy = _memoryread($engine_dll + $SetAng + 4, $process, "float")
$MyPOSX = _memoryread($engine_dll + $iPos, $process, "float")
$MyPOSY = _memoryread($engine_dll + $iPos+4, $process, "float")
$MyPOSZ = _memoryread($engine_dll + $iPos+8, $process, "float") - $pi
$MyTeam = _memoryread($LocalBase + $iTeam, $process, "dword")
Local $Angel1[65]
Local $Angel2[65]
Local $dis[65]
For $i = 0 to 64 step 1
$RadarBase = _memoryread($client_dll + $RadarBaseAD, $process, "dword")
$dw_BasePointer = _memoryread($client_dll + $Entity + (($i - 1) * 16), $process, "dword")
$HP = _memoryread($RadarBase + $RadarOffer-4 + (($i - 1) * 0x140), $process, "dword")
if $HP > 1 then
	$TEAM = _memoryread($RadarBase + $RadarOffer-8 + (($i - 1) * 0x140), $process, "dword")
	if $TEAM <> $MyTeam then
$PlayerPosXr = _memoryread($RadarBase + $RadarOffer + (($i - 1) * 0x140), $process, "float")
$PlayerPosYr = _memoryread($RadarBase + $RadarOffer+4 + (($i - 1) * 0x140), $process, "float")
if $PlayerPosYr <> 0 then
$delta0 = ($PlayerPosXr-$MyPOSX)/$maxdis
$delta1 = ($PlayerPosYr-$MyPOSY)/$maxdis
$ugol = $MeFovy+90
$x = $delta0
$y = $delta1
$posx = $x * Cos($ugol*$degToRad) + $y * Sin($ugol*$degToRad)
$posy = $y * Cos($ugol*$degToRad) - $x * Sin($ugol*$degToRad)
$posx = 93 - $posx
$posy = 90 + $posy
$posx += 6
$posy += 5
if $posx > 200 Then $posx = 195
if $posx < 1 then $posx = 1
if $posy > 200 then $posy = 195
if $posy < 0 then $posy = 0


GUICtrlSetPos($Dot[$i],$posx,$posy)
endif
Else
GUICtrlSetPos($Dot[$i],201,201)
Endif
Else
GUICtrlSetPos($Dot[$i],201,201)
EndIf
Next

EndFunc

AdlibRegister("Radar", 6)

While 1
Sleep(10000)
WEnd


Вот такой скрипт (вырезана часть кода), съедает по 40-50 ЦП, как можно этого избежать и при этом сохранить производительность? Так как работа идет через отрисовку гуи, то замедлять работу скрипта нежелательно, так как отображение будет лагающим... Может есть идеи у экспертов? :search:

p.s Еще вроде как ГУРУ аутоита переводят autoit в asm как-то и это вроде как очень сильно ускоряет скрипт и понижает нагрузку процесса, как это делается и так ли это?
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Часть кода переводят на комплеируемый яп это не составляет большого труда в большенстве случаев, но чтобы перевести это нада понимать что можно вынести а что нет такто переписать данную функцую на C# не составит много труда
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
zerobot
Не Quake-Игра ли это часом? (Включая Call of Duty).

Вот вам решение(на примере локального игрока):
Код:
$tagMYPOS = 'float Y; float X; float Z; byte[4]; float xAngle' ;
Global $_lPlayer[ 6 ]
	$_lPlayer[0] = DllStructCreate( $tagMYPOS )

Global $_vlStructInfo[ 2 ] = [ DllStructGetPtr( $_lPlayer[0] ), DllStructGetSize( $_lPlayer[ 0 ] ) ]

... Ваш цикл

_FMem_Read($_iAddress, $_hMemory, $_vlStructInfo[0], $_vlStructInfo[1])
$_lPlayer[1] = Round( DllStructGetData( $_lPlayer[0], 'X' ), 3 )
$_lPlayer[2] = Round( DllStructGetData( $_lPlayer[0], 'Y' ), 3 )


Итого: Данные записываются одновременно в одно место. А у вас: создание для каждой переменной отдельной структуры при каждом обновлении, это колоссальная нагрузка.

Код:
Func _FMem_Read($iv_Address, $ah_Handle, $pv_Struct, $iv_Size)
	Local $aRet = DllCall($ah_Handle[0],"bool","ReadProcessMemory","handle",$ah_Handle[1],"ptr",$iv_Address,"ptr",$pv_Struct,"ulong_ptr",$iv_Size,"ulong_ptr*",0)
	If Not @Error And $aRet[0] Then
		Return True
	ElseIf Not $aRet[0] Then
		Return SetError( 1, $aRet[5], False)
	EndIf

	Return SetError( 2, @Error, False )
EndFunc
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
zerobot, а ты уверен что тебе так уж необходимо вызывать твою функцию каждые 6 мс ?
http://autoit-script.ru/autoit3_docs/functions/AdlibRegister.htm
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
Firex,
Не Quake, это Source Engine :smile:
К сожалению не очень осилил ваш код :(
Вы можете привести пример перевода какой-то части моего кода в ваш способ? Я был бы премного благодарен :rolleyes:
 

darkwhite

Знающий
Сообщения
129
Репутация
5
Поставь минемальный sleep в функции в конце например sleep(10)
 
Автор
Z

zerobot

Новичок
Сообщения
78
Репутация
0
Если использовать sleep, то GUI будет лагать, точнее элементы на нем будут сильно отставать от игры... Не подходит
 

darkwhite

Знающий
Сообщения
129
Репутация
5
у вас загрузка процессора идет именно потому что вы sleep не используете совсем
вы не даете процессору времени переключится на другие задачи. такие как рисование GUI и игра ваша. а если игра онлаин то задержка в 10мс вам никак не помешает. у вас только сигнал идет около 100 мс
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
While 1
	Radar()
Sleep(6000)
WEnd


Код:
Func Radar ()
	
Local $Angel1[65]
Local $Angel2[65]
Local $dis[65]
	
	$EntityBase = _memoryread($client_dll + $Entity, $process, "dword")
	$LocalBase = _memoryread($client_dll + $Local, $process, "dword")
	$MeFovx = _memoryread($engine_dll + $SetAng, $process, "float")
	$MeFovy = _memoryread($engine_dll + $SetAng + 4, $process, "float")
	$MyPOSX = _memoryread($engine_dll + $iPos, $process, "float")
	$MyPOSY = _memoryread($engine_dll + $iPos+4, $process, "float")
	$MyPOSZ = _memoryread($engine_dll + $iPos+8, $process, "float") - $pi
	$MyTeam = _memoryread($LocalBase + $iTeam, $process, "dword")

	For $i = 0 to 64 step 1
		$RadarBase = _memoryread($client_dll + $RadarBaseAD, $process, "dword")
		$dw_BasePointer = _memoryread($client_dll + $Entity + (($i - 1) * 16), $process, "dword")
		$HP = _memoryread($RadarBase + $RadarOffer-4 + (($i - 1) * 0x140), $process, "dword")
		if $HP > 1 then
			$TEAM = _memoryread($RadarBase + $RadarOffer-8 + (($i - 1) * 0x140), $process, "dword")
			if $TEAM <> $MyTeam then
				$PlayerPosXr = _memoryread($RadarBase + $RadarOffer + (($i - 1) * 0x140), $process, "float")
				$PlayerPosYr = _memoryread($RadarBase + $RadarOffer+4 + (($i - 1) * 0x140), $process, "float")
				if $PlayerPosYr <> 0 then
					$delta0 = ($PlayerPosXr-$MyPOSX)/$maxdis
					$delta1 = ($PlayerPosYr-$MyPOSY)/$maxdis
					$ugol = $MeFovy+90
					$x = $delta0
					$y = $delta1
					$posx = $x * Cos($ugol*$degToRad) + $y * Sin($ugol*$degToRad)
					$posy = $y * Cos($ugol*$degToRad) - $x * Sin($ugol*$degToRad)
					$posx = 93 - $posx
					$posy = 90 + $posy
					$posx += 6
					$posy += 5
					if $posx > 200 Then $posx = 195
					if $posx < 1 then $posx = 1
					if $posy > 200 then $posy = 195
					if $posy < 0 then $posy = 0
					GUICtrlSetPos($Dot[$i],$posx,$posy)
				endif
			Else
				GUICtrlSetPos($Dot[$i],201,201)
			Endif
		Else
			GUICtrlSetPos($Dot[$i],201,201)
		EndIf
	Next
EndFunc

While 1
	Radar()
Sleep(6000)
WEnd
 
Верх