<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=14271</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=14271&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Быстродействие или альтернатива? Нужен совет ветеранов.».]]></description>
		<lastBuildDate>Tue, 23 Oct 2018 23:12:27 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129412#p129412</link>
			<description><![CDATA[<p><strong>stealzy</strong>, вы имеете в виду методом из 6 поста?</p>]]></description>
			<author><![CDATA[null@example.com (88man)]]></author>
			<pubDate>Tue, 23 Oct 2018 23:12:27 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129412#p129412</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129396#p129396</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>При чем тут SendInput и вызов функции?</p></blockquote></div><p>Поскольку любитель - ошибся в терминологии.<br />На счёт средней задержки, был не прав - по странному стечению обстоятельств такая задержка происходит именно с теми командами, которые я чаще всего использую. При более широком выборе команд для теста задержки разные.<br /></p><div class="quotebox"><blockquote><p>Вот вызов функции выполняется более 2 миллионов раз.<br />У меня занимает это 1 секунду</p></blockquote></div><p>Так же занимает чуть меньше секунды. Но ведь в коде никаких команд не задействовано, используется только логика (If), математика и присвоение (n++). Подобные манипуляции задержек и не вызывали.<br />В общем, всем спасибо, помогли уточнить проблему. Тему можно закрывать, мне нужно потестить всё более тщательно и обозначить проблему более конкретно.</p>]]></description>
			<author><![CDATA[null@example.com (88man)]]></author>
			<pubDate>Tue, 23 Oct 2018 15:25:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129396#p129396</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129395#p129395</link>
			<description><![CDATA[<p>При чем тут SendInput и вызов функции?<br />SendInput из другой оперы.<br />Рекомендую почитать внимательней справку.<br />Вот вызов функции выполняется более 2 миллионов раз.<br />У меня занимает это 1 секунду.<br /></p><div class="codebox"><pre><code>SetBatchLines, -1
n:= 0, k:= 6
a:=a_tickcount
loop % 1920*1080
{
   if test(k)
      n++   
}
msgbox % n &quot;`n&quot; a_tickcount - a

test(var)
{
   if var = 6
      return true
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 23 Oct 2018 14:46:53 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129395#p129395</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129393#p129393</link>
			<description><![CDATA[<p><strong>Malcev</strong>, ели честно я не разбирался в той теме. Ведь проблема не в <strong>PixelGetColor</strong>, задержка примерно в 15мс. происходит при вызове <strong>любой</strong> функции, например <strong>SendInput</strong> так же даёт эту задержку.</p>]]></description>
			<author><![CDATA[null@example.com (88man)]]></author>
			<pubDate>Tue, 23 Oct 2018 14:39:31 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129393#p129393</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129392#p129392</link>
			<description><![CDATA[<p>Почему вы так упорно хотите использовать PixelGetColor?<br />Чем вас не устраивает метод через LockBits?</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 23 Oct 2018 14:26:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129392#p129392</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129391#p129391</link>
			<description><![CDATA[<p>Установить Win7 и классическую тему - это решение?</p>]]></description>
			<author><![CDATA[null@example.com (88man)]]></author>
			<pubDate>Tue, 23 Oct 2018 14:22:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129391#p129391</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129382#p129382</link>
			<description><![CDATA[<p><strong>stealzy</strong>, я как раз таки сижу на классической.<br /><strong>88man</strong>, CoordMode тут не при чём.<br />Причина задержки, как уже выше мы вам писали, в PixelGetColor вкупе с включенным desktop composition.<br />Если вам надо проверить n-ое количество точек на соответствие какого-либо цвета, то быстрее всего это сделать методом по ссылке из 6 поста.<br />Вот тема про чтение из памяти:<br /><a href="http://forum.script-coding.com/viewtopic.php?id=13915">http://forum.script-coding.com/viewtopic.php?id=13915</a></p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 23 Oct 2018 12:32:45 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129382#p129382</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129379#p129379</link>
			<description><![CDATA[<p><strong>Malcev</strong>, 1000 за 433281ms. ... сказать что разница колоссальная - ничего не сказать. Ещё есть момент, я не указал <strong>CoordMode Pixel, Screen</strong>, так что ваш результат мог зависеть от активного окна, которое могло быть меньше просматриваемых координат, мой косяк - делал для себя, не подумал о людях, не могли бы вы повторить эксперимент с указанным <strong>CoordMode</strong> (я добавил строку в код на форуме)? И если результат подтвердится, в чём может быть причина такой невероятной задержки?<br /><strong>stealzy</strong>, Читать из памяти игры? Таким искусством не владею. Я так понимаю в двух словах не расскажешь? Можно полезную ссылку и/или пример кода?</p>]]></description>
			<author><![CDATA[null@example.com (88man)]]></author>
			<pubDate>Tue, 23 Oct 2018 11:05:36 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129379#p129379</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129372#p129372</link>
			<description><![CDATA[<p>Вообще для удобства чтения сначала пишется код, а потом уже функции или классы.<br />У меня 1000 итераций вашего кода без sleep выполняется за 650ms.<br /></p><div class="codebox"><pre><code>a := a_tickcount
loop 1000
{
	Health := SearchScale(HealthArray, HealthDirection, HealthColorType , HealthColorValue , HealthPosition, HealthPercentValue)
	Pet := SearchScale(PetArray, PetDirection, PetColorType , PetColorValue , PetPosition, PetPercentValue)
	Stamina := SearchScale(StaminaArray, StaminaDirection, StaminaColorType , StaminaColorValue , StaminaPosition, StaminaPercentValue)
	ToolTip Health = %Health% Pet = %Pet% Stamina = %Stamina%
}
msgbox % a_tickcount - a</code></pre></div><p>Возможно, на Win10 с включенным desktop composition будет медленнее.<br />Насчёт функций - они срабатывают действительно медленнее, но не настолько, насколько вы описали.<br /></p><div class="codebox"><pre><code>SetBatchLines, -1
n:= 0, k:= 6
a:=a_tickcount
loop % 1920*1080
{
   if k = 6
      n++   
}
msgbox % n &quot;`n&quot; a_tickcount - a

SetBatchLines, -1
n:= 0, k:= 6
a:=a_tickcount
loop % 1920*1080
{
   if test(k)
      n++   
}
msgbox % n &quot;`n&quot; a_tickcount - a

test(var)
{
   if var = 6
      return true
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 23 Oct 2018 07:50:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129372#p129372</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129369#p129369</link>
			<description><![CDATA[<p><strong>Malcev</strong>, <strong>SetBatchLines 0</strong> банальная ошибка при копипастах, спасибо, что обратили внимание, а то я думаю, от чего ещё медленнее стало...<br />Дело не в коде, я всё перепроверил. И по поводу <strong>A_TickCount</strong>:<br /></p><div class="codebox"><pre><code>	DllCall(&quot;QueryPerformanceFrequency&quot;, &quot;Int64*&quot;, TimerFrequency)
	DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64*&quot;, TimerBefore)
	; Вот тут то что хотим отследить.
	DllCall(&quot;QueryPerformanceCounter&quot;, &quot;Int64*&quot;, TimerAfter)
	Timer := (TimerAfter-TimerBefore)/TimerFrequency*1000
	ToolTip %Timer%</code></pre></div><p>Вот так даёт точный результат по времени, теперь понятно почему <strong>A_TickCount</strong> мне выдовал, то 0 то 15 мс. - он просто округлял значения, хотя в справке написано, что округляет до 10, не понятно от куда 15...<br />В общем, вот этим уточнённым методом, перепроверил - любая функция занимает от почти 0 до почти 20 мс. Почему такой большой разброс? Это нормально? Может дело в системе? А то этот Win10 я сразу невзлюбил...</p>]]></description>
			<author><![CDATA[null@example.com (88man)]]></author>
			<pubDate>Tue, 23 Oct 2018 00:17:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129369#p129369</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129367#p129367</link>
			<description><![CDATA[<p>Я в подробности вашего алгоритма не вдавался, но зачем вы в секцию автовыполнения понапихали кучу всего?<br />А тормозит ваш скрипт наверняка из-за SetBatchLines 0.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Mon, 22 Oct 2018 23:24:41 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129367#p129367</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129366#p129366</link>
			<description><![CDATA[<div class="codebox"><pre><code>#SingleInstance Force
#Persistent
#WinActivateForce
#InstallKeybdHook
#InstallMouseHook
#KeyHistory 0
#NoEnv
ListLines Off
SetBatchLines -1
SetDefaultMouseSpeed 0
SetKeyDelay 0, 0
SetMouseDelay 0
SetWinDelay 0
SetControlDelay 0
SetTitleMatchMode 3
SetTitleMatchMode Fast
CoordMode Pixel, Screen

; Используя термин &quot;шкала&quot; - я имею в виду горизонтальные или вертикальные полоски прогресса/регресса, раз уж речь об играх, то для примера - шкалы здоровья, маны, применения и т.п.
; Все они имеют одну отличительную особенность - резкий переход по цвету и/или яркости пикселя, вот эту точку перехода мы и будем искать в скрипте.


; Создаём функцию которая будет создавать массивы.
; Параметры:
; CreateScaleDirectionInput - вводится пользователем - направление поиска &quot;Horizontal&quot; или &quot;Vertical&quot;.
; CreateScaleColorTypeInput - вводится пользователем - искомый цвет &quot;Red&quot; или &quot;Green&quot; или &quot;Blue&quot; или &quot;Brightness&quot;.
; CreateScaleColorValueInput - вводится пользователем - искомая яркость (целое число)
; CreateScalePositionInput, CreateScaleBegin, CreateScaleEnd - вводятся пользователем - координаты шкалы  (Y,X1,X2 или X,Y1,Y2).
; CreateScaleArray - выводится функцией - имя создаваемого массива.
; CreateScaleDirectionOutput - выводится функцией - направление как переменная, для последующего поиска.
; CreateScaleColorTypeOutput - выводится функцией - искомый цвет как переменная, для последующего поиска.
; CreateScaleColorValueOutput - выводится функцией - искомая яркость как переменная, для последующего поиска.
; CreateScalePositionOutput - выводится функцией - начальная координата как переменная, для последующего поиска пикселя (Y или X).
; CreateScalePercentValue - выводится функцией - процентное значение одного пикселя, в искомой шкале.
CreateScale(CreateScaleDirectionInput, CreateScaleColorTypeInput, CreateScaleColorValueInput, CreateScalePositionInput, CreateScaleBegin, CreateScaleEnd, ByRef CreateScaleArray, ByRef CreateScaleDirectionOutput, ByRef CreateScaleColorTypeOutput, ByRef CreateScaleColorValueOutput, ByRef CreateScalePositionOutput, ByRef CreateScalePercentValue)
{
	CreateScaleDirectionOutput := CreateScaleDirectionInput
	CreateScaleColorTypeOutput := CreateScaleColorTypeInput
	CreateScaleColorValueOutput := CreateScaleColorValueInput
	CreateScalePositionOutput := CreateScalePositionInput
	CreateScaleArray := []
	CreateScaleArray.Push(CreateScaleBegin)
	CreateScaleArrayCount := Abs(CreateScaleEnd-CreateScaleBegin)+1
	CreateScalePercentValue := 100/CreateScaleArrayCount
	While CreateScaleArray.MaxIndex()&lt;CreateScaleArrayCount
	{
		If CreateScaleBegin&lt;CreateScaleEnd
		{
			CreateScaleBegin := CreateScaleBegin+1
		}
		Else
		{
			CreateScaleBegin := CreateScaleBegin-1
		}
		CreateScaleArray.Push(CreateScaleBegin)
	}
}


; Создаём функцию которая будет оценивать пиксели по яркости, внутри другой функции.
; Параметры:
; PixelX, PixelY - вводятся пользователем - но будут принимать переменные от других функций (координаты).
; PixelGetColorValueRed, PixelGetColorValueGreen, PixelGetColorValueBlue, PixelGetColorValueBrightness - выводятся функцией - яркость по цветам и общая.
PixelGetColorValue(PixelX, PixelY, ByRef PixelGetColorValueRed, ByRef PixelGetColorValueGreen, ByRef PixelGetColorValueBlue, ByRef PixelGetColorValueBrightness)
{
	PixelGetColor PixelGetColorHex, PixelX, PixelY, RGB
	PixelGetColorValueRed := (PixelGetColorHex &amp; 0xFF0000) &gt;&gt; 16
	PixelGetColorValueGreen := (PixelGetColorHex &amp; 0xFF00) &gt;&gt; 8
	PixelGetColorValueBlue := PixelGetColorHex &amp; 0xFF
	PixelGetColorValueBrightness := Max(PixelGetColorValueRed, PixelGetColorValueGreen, PixelGetColorValueBlue)
}


; Создаём функцию, которая будет выбирать пиксели на шкале для проверки яркости, внутри функции будет вызываться функция оценки яркости.
; За основу я взял бинарный поиск, но слегка видоизменил, ведь нужно найти не конкретное значение, а точку перехода от True к False, но основной принцип ведь тот же - левее True не может быть False а правее False не может быть True.
; Все параметры в функции - будут принимать переменные, выводимые из массива.
; Функция возвращает последний пиксель искомой яркости на шкале, в процентном выражении.
SearchScale(SearchScaleArray, SearchScaleDirection, SearchScaleColorType, SearchScaleColorValue, SearchScalePosition, SearchScalePercentValue)
{
	SearchScaleBegin := SearchScaleArray.MinIndex()
	SearchScaleEnd := SearchScaleArray.MaxIndex()
	SearchScalePercent := 0
	While SearchScaleBegin&lt;=SearchScaleEnd
	{
		SearchScaleMiddle := Floor((SearchScaleBegin+SearchScaleEnd)/2)
		If (SearchScaleDirection = &quot;Vertical&quot;)
		{
			PixelGetColorValue(SearchScalePosition, SearchScaleArray[SearchScaleMiddle], SearchScaleRed, SearchScaleGreen, SearchScaleBlue, SearchScaleBrightness)
		}
		Else If (SearchScaleDirection = &quot;Horizontal&quot;)
		{
			PixelGetColorValue(SearchScaleArray[SearchScaleMiddle], SearchScalePosition, SearchScaleRed, SearchScaleGreen, SearchScaleBlue, SearchScaleBrightness)
		}
		If (SearchScaleColorType = &quot;Red&quot;)
		{
			If SearchScaleRed&gt;%SearchScaleColorValue%
			{
				SearchScalePercent := SearchScaleMiddle
				SearchScaleBegin := SearchScaleMiddle+1
			}
			Else
			{
				SearchScaleEnd := SearchScaleMiddle-1
			}
		}
		Else If (SearchScaleColorType = &quot;Green&quot;)
		{
			If SearchScaleGreen&gt;%SearchScaleColorValue%
			{
				SearchScalePercent := SearchScaleMiddle
				SearchScaleBegin := SearchScaleMiddle+1
			}
			Else
			{
				SearchScaleEnd := SearchScaleMiddle-1
			}
		}
		Else If (SearchScaleColorType = &quot;Blue&quot;)
		{
			If SearchScaleBlue&gt;%SearchScaleColorValue%
			{
				SearchScalePercent := SearchScaleMiddle
				SearchScaleBegin := SearchScaleMiddle+1
			}
			Else
			{
				SearchScaleEnd := SearchScaleMiddle-1
			}
		}
		Else If (SearchScaleColorType = &quot;Brightness&quot;)
		{
			If SearchScaleBrightness&gt;%SearchScaleColorValue%
			{
				SearchScalePercent := SearchScaleMiddle
				SearchScaleBegin := SearchScaleMiddle+1
			}
			Else
			{
				SearchScaleEnd := SearchScaleMiddle-1
			}
		}
	}
	Return Round(SearchScalePercent*SearchScalePercentValue)
}


; Единожды создаём массивы, вводим параметры ручками.
; Имена переменных параметров указываем соответственно как в массиве (который выводит данные в эти переменные), так и в функции поиска (которая принимает данные из этих переменных).
CreateScale(&quot;Horizontal&quot;, &quot;Brightness&quot;, 165, 782, 802, 1090, HealthArray, HealthDirection, HealthColorType , HealthColorValue , HealthPosition, HealthPercentValue)
CreateScale(&quot;Horizontal&quot;, &quot;Brightness&quot;, 165, 786, 1181, 1393, PetArray, PetDirection, PetColorType , PetColorValue , PetPosition, PetPercentValue)
CreateScale(&quot;Horizontal&quot;, &quot;Brightness&quot;, 165, 826, 802, 1090, StaminaArray, StaminaDirection, StaminaColorType , StaminaColorValue , StaminaPosition, StaminaPercentValue)


SetTimer Spam, 50
Spam:
{
	Health := SearchScale(HealthArray, HealthDirection, HealthColorType , HealthColorValue , HealthPosition, HealthPercentValue)
	Pet := SearchScale(PetArray, PetDirection, PetColorType , PetColorValue , PetPosition, PetPercentValue)
	Stamina := SearchScale(StaminaArray, StaminaDirection, StaminaColorType , StaminaColorValue , StaminaPosition, StaminaPercentValue)
	ToolTip Health = %Health% Pet = %Pet% Stamina = %Stamina%
}
Return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (88man)]]></author>
			<pubDate>Mon, 22 Oct 2018 22:30:12 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129366#p129366</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129365#p129365</link>
			<description><![CDATA[<p><strong>Malcev</strong>, ситуация с 15мс. даже на чистом скрипте.<br />Код сейчас выложу, докомментирую...</p>]]></description>
			<author><![CDATA[null@example.com (88man)]]></author>
			<pubDate>Mon, 22 Oct 2018 21:31:47 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129365#p129365</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129364#p129364</link>
			<description><![CDATA[<p>Приведите код.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Mon, 22 Oct 2018 21:25:58 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129364#p129364</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Быстродействие или альтернатива? Нужен совет ветеранов.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=129363#p129363</link>
			<description><![CDATA[<p>В общем, вот мои изыскания с <strong>A_TickCount</strong>:<br />Вся математика, логика, присвоения - 0мс.<br />Вызов <strong>PixelGetColor</strong> выдаёт два варианта - 0мс. и 15мс.<br />Вызов <strong>PixelSearch</strong> на 300 пикселей выдаёт два варианта - 0мс. и 15мс.<br />Вызов пользовательской функции, в составе которой <strong>PixelGetColor</strong> выдаёт три варианта - 0мс. 15мс. и 30мс.<br />По всей видимости всё как я и предполагал, есть какое то принудительное ожидание на функцию и оно составляет 15мс. однако происходит не всегда.<br />Что это за задержка?</p>]]></description>
			<author><![CDATA[null@example.com (88man)]]></author>
			<pubDate>Mon, 22 Oct 2018 21:18:06 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=129363#p129363</guid>
		</item>
	</channel>
</rss>
