Показать сообщение отдельно
  #10  
Старый 03.10.2015, 19:30
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Изначально была идея для поиска пикселей использовать ScanLine так как я где то слышал, что это самый быстрый способ...
*Вздох* Ну как ScanLine, созданный для ускорения доступа к строке картинки через получение указателя на её в виде массива может ускорить доступ к одному случайно взятому пикселю?
Цитата:
Ведь раньше мы сохраняли всего один пиксель а сейчас целый экран.. Или это не так?
Да, это будет сильно медленней. Но не думаю, что разница будет заметна. Логичней всего просто брать отдельные пиксели прямо с DC, как я говорил. Единственный плюс BMP в данном случае - относительное удобство работы с пикселями.
Тем не менее, копировать 1 пиксель в BMP (т.е. брать его средствами винды из DC), чтобы потом сделать к нему scanline и взять из него пиксель - это по меньшей мере КРАЙНЕ странно.
Цитата:
Вы говорили выше про 1мс и про 24 кадра <...> и если я поставлю допустим 100мс или даже 40мс в таймере они не определятся..
Элементарная логика подсказывает, что если сделать частоту выборки в 2 раза выше частоты кадров, то попадать будет однозначно в каждый кадр даже с учетом погрешностей. Можно попробовать определить настоящую частоту перерисовки, надо только подумать, чем. На самом деле она может плавать. Но в простой игрушке (как я понимаю из скриншота с другой темы) рисовать чаще 25 раз в секунду нет никакого смысла. Отсюда возникает другой вопрос: а ты вообще уверен, что игра отрисовывает быстрый объект во всех промежуточных положениях?
Вот есть в игре объект. Он движется со скоростью 200 пикселей в секунду. Пусть мы перерисовываем 25 раз в секунду. Значит между двумя кадрами объект переместится на 200/25=8 пикселей. Если часть объекта нужного цвета занимает меньше 8 пикселей, то какой-то пиксель так и не засветится нужным цветом. Какая реальная скорость объекта? Если он пролетает монитор в 1920х1080 по горизонтали за секунду, то между кадрами объект телепортируется на 76 пикселей. Так делается анимация.
Цитата:
программа часто не срабатывала и сильно тормозила саму игру так как читала эти 4 пикселя с интервалом в 1мс в таймере.
В винде приложения "переключаются" примерно раз в 10-15 миллисекунд, насколько я помню. Если они не мудрили (а опять же по тому скрину видно, что вряд ли мудрили), то игра просто не может перемещать объекты чаще. Твой таймер скорее всего просто тормозит комп излишней циклической проверкой одного и того же.

Если уж делать всяких ботов для быстролетящих объектов, то на мой взгляд не логично завязываться на мигание одного конкретного пикселя. Тут надо уже анализировать хоть какую-то небольшую область, в которую объект обязательно должен попасть.

EDIT в виду добавления скриншота:
Так очевидно, надо мониторить изменение столбиков пикселей нижних областей. Как только хоть в одном пикселе из столбика произошло переключение цвета с черного на какой-то - нажимать. Если даже тут FPS=60 (что было бы странно), то нет смысла ставить таймер меньше, чем на 8-10мс.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием