Что нового

правильная организация датчиков для окон

running-frag

why me?
Сообщения
441
Репутация
60
тут столкнулся с одной забавной проблемой

вообще в теории хотел как - при обращении\проверки чего либо в окне (ингейм) сначал ищем точку отсчёта этого окна, а потом уже относительно неё танцуем

написал пиксельсёрч, всё красиво но не быстро, проблема в самом поиске, проц подгружается аж под 10% что вааааще не есть хорошо (об этом позже)

после перекрутил в датчики основные окна, каждые 3ую секунду ищем окна - проц тупо здыхает (доходит до 25% нагрузки)

после переписал так что только первый поиск "грузит" после проверяет один пиксель (если он не совпал снова будет искать)

с точки зрения логики всё классно, но всё равно проц нагружается под 20% (клиент евы не всегда так же выжырает)

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

Ganibal95

GreenBytes
Сообщения
876
Репутация
239
Re: Логика датчиков.

running-frag [?]
вообще в теории хотел как - при обращении\проверки чего либо в окне (ингейм) сначал ищем точку отсчёта этого окна, а потом уже относительно неё танцуем
Это ты окно ещеш пиксельсельсеарчем? Если да, то используй:
Код:
WinGetPos()
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Re: Логика датчиков.

нет, речь идёт о ингейм окнах (внутреигровых)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
Re: Логика датчиков.

Не знаю сколько отжирали от проца мои боты, но они спокойно работали с 10-ю клиентами одновременно запущенными.
Пиксельсерчей было много, но они в принципе то не сильно вроде и проц грузят. Проверки положения окна шли исходя из важности этого окна. То есть если например если на овервью мы можем допустить ситуацию, когда бот изначально нашел окно и далее не обращается к его поиску до тех пор пока не произойдет ошибки, которая приведет к новому поиску положения окна. То на те же модули у меня привязка к положению окна (полоски меню на HUD) велась при каждом обращении.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Re: Логика датчиков.

в том то и дело что когда врубаю "всё" (все датчики) процу плохо становится и само собой подвисает клиент

ммм, буд отлавливать косяки =\
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Логика датчиков.

Нефиг использовать пиксельсёрч где ни попадя.
 

DJ_Tommy

Продвинутый
Сообщения
235
Репутация
57
Re: Логика датчиков.

Упрощай проверку датчиков, уменьшай зону поиска, уменьшай количество проверок.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Re: Логика датчиков.

SirMaksFromEho [?]
Нефиг использовать пиксельсёрч
Чувствую мне придётся закрыть этот раздел (я про раздел «Боты для игр» в целом).

Такое ощущение, что в этом разделе правила не признаются.
Оно и понятно, т.к в игры играет в основном молодёжь (ну или взрослые, которым нечем заняться - не в обиду сказано), вспыльчивый, и бунтарский молодёжь.

running-frag
Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Логика датчиков." - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Администратор форума.










SirMaksFromEho
Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, Администратор форума.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Re: Логика датчиков.

CreatoR а на что нужно сменить тему что б она подходила под содержание?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Re: Логика датчиков.

running-frag [?]
на что нужно сменить тему что б она подходила под содержание?
Ты сперва почитай то что написано в предупреждений (включая темы по ссылкам в нём, так, на будущее). После этого много вопросов отпадёт.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Re: правильная организация датчиков

изменил название

просто на самом деле меня не интересует "соло окно" я сразу стараюсь писать под 3-5 окон
отсюда варианты
1. делать каждый раз поиск окна (плохая сторона: тогда при каждой переключении идёт нагрузка на проц)
2. сохранять координаты для каждого окна в переменные и по ним проверять согласно окну (плохая сторона: в коде будет ОЧЕНЬ много хлама)
3. делать заведомо точную настройку каждого окна что б окна были 100% единтичны (плохая сторона: пока не увидел, так делал до патча, правда есть неудобности в предварительных настройках, прицеп сменили)
4. походу дела менять расположения окон (плохая сторона: пока не увидел)

вот такие вот варианты


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

Продвинутый карибас нельзя уменьшать зону поиска, в противном случае это не датчик а фуфло, а если у тебя окно убежит за зону поиска? :D

ps: можно вообще без поиска обойтись, чего там - сделать всё по координатам относительно "Reset To Default Window Position", но при первом малейшем (даже на пиксель) косяке скрипт должен будет всё перенастраивать наново что не есть гуд
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Re: правильная организация датчиков

ыыы, "родила царица в ночь, нито сына.... нито сына"


сырой вариант
Код:
$iWC[2][0] = False							; bool
$iWC[2][1] = 0								; x
$iWC[2][2] = 0								; y
$iWC[2][3] = "selected_item"				; name
$iWC[2][4] = ""								; pixel array as string
$iWC[2][5] = 834
$iWC[2][6] = 25

$iWC[3][0] = False							; bool
$iWC[3][1] = 0								; x
$iWC[3][2] = 0								; y
$iWC[3][3] = "overview"						; name
$iWC[3][4] = ""								; pixel array as string
$iWC[3][5] = 947							; default x
$iWC[3][6] = 152							; default y


Func detector_window ()
	Local $_coord
	Local $_array
	Local $_string
	
	For $i = 2 To 3
		ConsoleWrite ($iWC[$i][3]&@CR)
		If StringLen ($iWC[$i][4]) < 3 Then												; проверяем загрузили ли данные о массиве в глобалы
			ConsoleWrite ("need to load data"&@CR)
			$_array = script_image ("image_to_pixel_array", "header."&$iWC[$i][3])
			For $k = 1 To $_array[0]													; создаём строку для глобалов
				$_string &= $_array[$k]
				
				If $k <> $_array[0] Then
					$_string &= "|"
				EndIf
			Next
			$iWC[$i][4] = $_string
			
			;ConsoleWrite ("data loaded to global"&@CR)
		Else
			;ConsoleWrite ("data loaded in global"&@CR)
			$_array = StringSplit ($iWC[$i][4], "|", 1)									; если да то берём из глобалов
			$_string = $iWC[$i][4]
		EndIf
		
		ConsoleWrite ($_string&@CR)
		
		
		ConsoleWrite (Hex (PixelGetColor ($iWC[$i][5], $iWC[$i][6]), 6) & " == "& $_array[1]&@CR)
		If Hex (PixelGetColor ($iWC[$i][5], $iWC[$i][6]), 6) == $_array[1] Then
			;ConsoleWrite ("first pixel match of defined coord"&@CR)
			;ContinueLoop
		Else
				
			ConsoleWrite ("pixel doesn't matched"&@CR)
			$_coord = script_image ("find", "header."&$iWC[$i][3])
			detector_relocate ($_coord[1], $_coord[2], $iWC[$i][5], $iWC[$i][6], $iWC[$i][3])
				
				
			If $_coord[0] Then																; перезаписуем координаты
				$iWC[$i][0] = True
				;$iWC[$i][1] = $_coord[1]
				;$iWC[$i][2] = $_coord[2]
			Else
				$iWC[$i][0] = False
				;$iWC[$i][1] = 0
				;$iWC[$i][2] = 0
			EndIf
				
		EndIf
		
		
		$_array = ""
		$_coord = ""
		$_string = ""
	Next
	
EndFunc


Func detector_relocate ($_x1, $_y1, $_x2, $_y2, $_window)
	
	MouseClickDrag ("left", $_x1, $_y1, 300, 300, 5)											; перемещаем на независимую точку, во избежании разницы в один пиксель
	Sleep (500)
	MouseClickDrag ("left", 300, 300, $_x2, $_y2, 5)
	
EndFunc


есть тут лишнее, нужно почистить но логика идеальная (почти)
в данном случае проверяются координаты где должны быть окна (по одному пикселю, что в принцепи можно изменить), если мы не находим там нужный пиксель то начинаем искать окно, как находим тащим его на место где оно должно быть, в противном случае меняем флажок на false (а там уже проверки за сценой)

при таком подходе не важно какое окно активно, окна перетащит туда где они должны быть (опционально)

пока что нерешено изменение ширины\высоты проверямых окон (это важно, нужно ради перекрывания хидеров (заголовков))

ps: скрипт не запустится сам по себе, там есть функции которые останутся за сценой
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Для нескольких окон, ты просто запоминаешь (в ini-файле к примеру) координаты внутриигровых окон для каждого окна eve (они ж имеют разные заголовки). И всё.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
с шириной проблема решена (работает только если цвет НЕ чёрный) хватаем слево пиксель от края 5ый, по вертикали - та самая линия ниже хидера (заголовка) -1 (т.е. выше линии), сохраняем его, и бежим до правой стороны, попутно минуя цвета перегородок для табов (если это чаты или что либо другое где есть вложенные окна)

по высоте пока что ума не приложу нужен какой то общий принцеп, при чём не забывать про картинку на некоторых окнах (wolrd map control panel, my cargo), есть у кого мысли на этот счёт?

самая большая проблема это не уйти дальше края, ибо окна могут перекрываться и у нас получится высота "двух" окон

ini как вариант, но уже скрипт написан и он работает (у меня), плюс это шаблонный, поэтому проще, я раньше в xml всё хранил по такому принцепу делал на каждое окно свои настройки, или общие, не суть, суть в том что проблем чуть больше с файлом
 

arabidopsis

Новичок
Сообщения
11
Репутация
3
Я через PixelChecksum работаю с окошками. Функция намного шустрее пиксельсерча, но нужно прявлять фантазию ;)
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
arabidopsis [?]
Я через PixelChecksum работаю с окошками. Функция намного шустрее пиксельсерча, но нужно прявлять фантазию
у меня фантазия не очень, если можно в примере (не нужен код, просто опиши логику)
если же ты просто проверяешь чэксамом позицию окна, то всё равно если позиция смещена - придётся искать окно



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

или я что то пропустил и есть функция которая ищет по чэксаму координаты?
 

arabidopsis

Новичок
Сообщения
11
Репутация
3
Делаю чексум по всем строкам и всем столбцам (1xN пикселей в каждом случае). Вызываю хоткеем окно. Делаю чексум2.
Теперь проверяю какие строки/столбцы различны в этих двух случаях. Это и есть координаты окошка нашего :smile: Осталось учесть всякие мелкие нестыковки (типа там рамочки какие-нибудь могут появиться или пропасть при фокусе на другое окно, надо это внимательно отследить) и готово.

Точно так же можно делать в два этапа. Сначала чексумом по двумерной матрице по 100 пикселов например (экран весь разделяем на квадратики 10x10 и для них чексумму сравниваем с эталонной), а потом отбрасываем те, где сумма не поменялась. Так точнее будет, влияние случайных мелких артефактов отсечется.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
а если окно "поплыло"? т.е. чэксам несошёлся, твои действия? его (окно) ж нужно как то вернуть на исходную? (либо сменить координаты)

плюс "где сумма не поменялась", да тут почти везде поменяется, карго, локал, овервью, сэлэктэд итем и что остаётся? чёрный экран бэкграунда? дело личное, но по моему это не выход

ты лучше если знаешь, подскажи как по вертикали определять высоту окна
 

alexisnoy123

Новичок
Сообщения
9
Репутация
2
Есть такой проект. Reverence называется. (естественно на python-e) С помощью него можно прочитать почти все что клиент евы нам на жестком сохраняет. И самое главное позволяет прочитать файл "settings/core_user_11111111.dat" (где циферки для каждого юзера свои) в котором хранятся настройки окон, которые хоть раз изменяли в игре.(если окно не двигали или не изменяли его размер - то берутся дефолтные значения, которых в этом файле нет). При запуске игры клиент восстанавливает значения оттуда. Писать в этот файлик нельзя (заготовки в reverence есть - но они пустые). Клиент, при изменении окна на экране, где-то через 30 сек записывает изменения в этот файл. У меня начальные настройки при запуске игры берутся оттуда.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
это уже инджект идёт, отслеживается ли это неизвестно, но как все знают за инджект бан пермоментно :-X
нас интересует исключительно пиксельхантинг :-[
 
Верх