Каждое приложение с таблицами для проверки зрения совершает одну и ту же фатальную ошибку: оно просто показывает вам буквы. Но острота зрения зависит не от размера букв, а от угла, под которым буква видна глазу. Строка 20/20 (или 1.0) в клинике является таковой только тогда, когда вы стоите на строго определенном расстоянии от нее; подойдите ближе, и те же печатные буквы будут проверять уже совсем другую остроту зрения. Весь смысл таблицы заключается в том, чтобы смотреть на нее с того единственного расстояния, для которого она была создана. Сфотографируйте эту таблицу на экран телефона, дайте ее человеку, который держит телефон как ему удобно, — и вы получите инструмент, который выдает абсолютно бессмысленные цифры.

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

Сторона первая: экран, параметры которого измеряются, а не угадываются

Первая сторона — это физический размер буквы (оптотипа) на экране. Активность считывает фактическую геометрию дисплея с устройства: шаг пикселя (пикселей на миллиметр) и физические размеры, а не использует угаданный «типичный экран телефона». Когда тест выводит оптотип, который должен соответствовать определенному углу зрения, он точно знает, сколько миллиметров стекла для этого требуется, а значит — сколько именно пикселей.

Сторона вторая: камера как рулетка — в непрерывном режиме

Вторая сторона — это ваше расстояние до экрана, и вот хитрость, которая превращает весь процесс в точное измерение: фронтальная камера следит за вашим лицом и отслеживает расстояние непрерывно в течение всего теста, используя угол обзора камеры и расстояние между глазами в качестве эталона.

Непрерывность имеет значение. Никто не держит телефон абсолютно неподвижно в течение многоминутного теста — вы отклоняетесь, наклоняетесь, устраиваетесь поудобнее. Тест, измеряющий расстояние лишь один раз в самом начале, незаметно накапливал бы это смещение в виде систематической погрешности. Вместо этого размер каждого оптотипа пересчитывается относительно текущего расстояния непосредственно в момент его показа. Сдвиньтесь на 5 cm ближе — и следующая буква отобразится мельче, сохраняя ровно тот угловой размер, который запланирован в тесте. Смещение не портит результат; оно записывается отдельно как стабильность прогона — разброс всех замеров расстояния, сделанных непосредственно во время ваших ответов. (Данные этапа настройки, до того как вы зафиксировали положение, намеренно исключаются — они бы увеличили разброс, цель которого состоит в описании исключительно самого прогона.)

Лестница, и почему уровень случайного угадывания определяет ее форму

Что вы делаете на самом деле: появляется оптотип — буква E в одной из четырех возможных ориентаций, — и вы отвечаете, куда она направлена: вверх, вправо, вниз или влево. Четыре варианта означают, что при слепом угадывании шанс на успех равен одному из четырех, и под этот 25% уровень случайного угадывания как раз и подбирается адаптивное правило — лестница «2 вниз / 1 вверх»: требуется два правильных ответа подряд, чтобы буквы уменьшились, и один неверный ответ, чтобы они увеличились. При вероятности угадывания 1 к 4 это правило сходится к стабильной, четко определенной точке на вашей психометрической кривой, вместо того чтобы смещаться вниз из-за случайных попаданий.

Адаптивный тест не знает своей продолжительности заранее — количество попыток зависит от ваших ответов. Поэтому прогресс измеряется в реверсах, то есть моментах, когда направление лестницы меняется на противоположное. В каждом прогоне задано их фиксированное число, и отношение достигнутых реверсов к целевому показателю — это единственный индикатор прогресса, который адаптивный тест может отобразить честно.

Когда тест вообще отказывается запускаться

Экран телефона имеет жесткие ограничения в обоих направлениях. Снизу это предел рендеринга: оптотипу требуется минимальное количество пикселей, чтобы сохранить форму, и ниже этого порога дисплей физически не может отобразить более мелкую букву. На вашем текущем расстоянии этот предел соответствует максимальной остроте зрения, которую вообще возможно проверить. Сверху существует физический потолок: самый крупный оптотип, который способен поместиться на экране.

Перед первой попыткой активность проверяет, существует ли вообще рабочий диапазон между этим пределом и потолком на измеренном расстоянии. Если нет, тест отказывается запускаться — экран объясняет проблему вместо того, чтобы показывать лестницу, которая не может сдвинуться с места. Но даже успешно завершенный прогон может упереться в любой из этих лимитов: правильное прочтение самой маленькой отображаемой буквы означает, что ваше зрение лучше, чем способен проверить этот экран, — и в отчете появится именно эта фраза, а не льстящая вам цифра.

Порядок проверок и есть главный аргумент. Когда прогон завершается, стабильность расстояния оценивается до вердикта самого алгоритма лестницы. Ведь лестница, которая отлично сошлась, пока вы хаотично двигались туда-сюда — это точное измерение ничего. Только после того, как запись расстояния пройдет проверку, алгоритм лестницы определяет, сошелся ли результат, уперся в нижний предел или достиг верхнего. Каждому исходу соответствует свой вердикт, и только один из них выражается числом. А прерванный прогон не сохраняет вообще ничего: наполовину пройденная лестница — это не показатель вашего зрения, а лишь показатель того, как далеко вы зашли, прежде чем отложить телефон.

Насколько надежна эта цифра?

Надежнее, чем вы могли бы подумать, — и исходный код говорит об этом прямо, в отличие от соседнего теста. Тест слуха всегда сопровождается сноской про ±10 dB, поскольку ни один телефон не может измерить абсолютное звуковое давление. Здесь же обе стороны угла измеряются непосредственно на устройстве: размер оптотипа берется из шага пикселей самого экрана, а расстояние — с камеры. Допускается ровно одна условная величина — среднее межзрачковое расстояние взрослого человека, используемое камерой в качестве ориентира для измерения дистанции. Она дает погрешность около ±0.02 logMAR, что меньше, чем погрешность при повторном прохождении клинической таблицы, которую этот тест имитирует. Успешно сошедшийся прогон выдает значение logMAR вместе с его эквивалентами по таблице Снеллена и в виде десятичной дроби, которые вполне сопоставимы для разных устройств и людей.

А теперь вторая половина честной правды, ведь слабые места здесь реальны, и активность прямо их называет. Вы можете прищуриться. Можете наклониться вперед между замерами расстояния. Четыре ориентации можно частично запомнить. Яркость экрана и освещение в комнате задают контрастность букв, которую реальная таблица стандартизирует, а телефон — нет. Допущение о межзрачковом расстоянии рассчитано на взрослых, поэтому у ребенка результат будет указывать на дальнозоркость. Это скрининговая оценка, а не осмотр врача и не рецепт — способ заметить, что ваш правый глаз видит на строчку хуже, чем в марте, и повод записаться на прием к врачу, а не откладывать его.

Один глаз за один прогон, для протокола

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

Тесты зрения и слуха используют одинаковые механизмы лестницы и правила отказа от запуска — разные органы чувств, но единая философия протокола. Чтобы получить полную картину того, что датчики телефона способны измерить помимо ваших собственных чувств, начните с обзора инструментов.