Живі курсори в мобільному додатку: реалізація та оптимізація

Курсори в спільних додатках смикаються й відстають, коли позиції передаються без урахування слабкого зв'язку. Ми проєктуємо та впроваджуємо механіку живих курсорів під ключ: від схеми обміну до готового модуля у вашому додатку. Користувачі бачать рухи одне одного без ривків, а навантаження на додаток залишається передбачуваним.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Живі курсори в мобільному додатку: реалізація та оптимізація
Складний
~2-3 дні
Часті запитання

Live cursors у мобільному застосунку: де ламається синхронізація

Живі курсори в застосунку — найчутливіший до мережі елемент інтерфейсу.

Позиція вказівника в кожного учасника змінюється десятки разів на секунду, і будь-яка затримка оновлення позиції одразу впадає в око: чужий курсор смикається, відстає на пів секунди або залипає в одній точці, поки людина вже пише в іншому місці дошки.

На відміну від тексту документа, де розходження можна зліпити пізніше, рух вказівника безглуздо «наздоганяти» — важливий лише останній кадр.

Корінь проблеми — у транспорті. Якщо ганяти кожне зміщення пальця окремим повідомленням через надійний канал із підтвердженням доставки, за слабкої мережі черга зростає швидше, ніж устигає виходити, і курсори починають показувати минуле.

Тому потік координат виносять на окремий легкий канал без гарантії доставки: втрачене проміжне положення не потрібне, наступне перекриє його за кілька мілісекунд.

Окрема задача — синхронізація курсорів між платформами: телефон, планшет і веб шлють події з різною частотою і в різній системі координат, і без приведення до спільного простору дошки курсор «їде» при повороті екрана або зміні масштабу.

Друге джерело збоїв — спільне редагування на телефоні. Мобільна мережа рветься при перемиканні між вишкою та Wi-Fi, застосунок іде у фон і назад, а сервер продовжує чекати пакети від «мертвого» з'єднання.

Якщо це не відстежувати, курсори зниклих учасників залишаються на екрані, а ті, хто повернувся, дублюються.

Лікується явними сигналами присутності: короткий строк життя в мітки учасника, автоматичне перепідключення з відновленням списку і м'яке затухання курсора при втраті зв'язку замість різкого зникнення.

Нарешті, відрисовка. Навіть ідеально доставлені координати можна зіпсувати, якщо перерисовувати весь холст на кожен рух — на слабкому пристрої це дає ривки і просідання чутливості власного введення.

Курсори малюють окремим шаром поверх контенту, оновлюють лише змінені елементи і згладжують рух між точками, що надійшли, щоб при рідкісних пакетах вказівник ковзав, а не стрибав.

Розбираємо, як це закривається на рівні архітектури каналу, формату повідомлень і логіки присутності — і чому правильне рішення майже завжди дешевше, ніж здається.

Що дає відлагоджена механіка курсорів

Відлагоджена механіка курсорів — це насамперед передбачувана частота оновлення позиції.

Коли інженери задають її усвідомлено, а не «як вийде», курсор рухається рівно, без ривків і «залипань», а поведінка не залежить від того, наскільки завантажений канал у конкретного користувача.

Саме стабільність частоти, а не її максимум, визначає відчуття плавності: користувач помічає не високий темп, а провали в ньому.

Другий вимірюваний ефект — керована витрата трафіку. Передача координат — це потік дрібних повідомлень, і без відлагодженої механіки він або роздувається на кожному русі пальця, або, навпаки, економить так, що курсор смикається.

Відлагоджена механіка тримає баланс: обсяг даних на сесію залишається в розумних межах навіть при активному малюванні та перетягуванні об'єктів, а на слабкій мережі деградація відбувається плавно, а не обривом.

Третій ефект — передбачуване навантаження на акумулятор. Постійно активний канал оновлення позиції — один із найнепомітніших споживачів енергії: він не дає пристрою піти в сон і тримає радіо в робочому режимі.

Коли механіка відлагоджена, застосунок знижує активність, коли курсорів немає на екрані, і не витрачає заряд на обмін, якого користувач не бачить.

Нарешті, відлагоджена механіка означає, що поведінка курсорів відтворювана: інженери знають, скільки повідомлень надходить за секунду, як поводиться застосунок при втраті зв'язку і як швидко курсори повертаються в синхрон після перепідключення.

Це перетворює «магію» на інженерну величину, яку можна вимірювати, тестувати й покращувати, а не сподіватися, що «цього разу не гальмує».

Підходи до передачі позицій: порівняння варіантів

Передача координат курсора — це компроміс між частотою оновлень і навантаженням на канал. Кожен варіант по-своєму вирішує, як часто надсилати позицію та як реагувати на втрату зв'язку. Нижче — три схеми, між якими реально обирають на старті.

Варіант Коли підходить Обмеження
Постійний потік Спільне редагування в реальному часі, де важлива плавність руху Тримає з'єднання відкритим увесь час, чутливий до нестабільної мережі та зміни мережі на мобільному
Пакетне надсилання Коментарі, позначки, рідкісні дії, де затримка в частки секунди не критична Рух виглядає ривками, при втраті пакета позиція «стрибає»
Гібридна схема Більшість мобільних сценаріїв: активний рух плюс паузи Складніша в реалізації — потрібна логіка перемикання між режимами

Постійний потік

З'єднання тримається відкритим, координати йдуть безперервно. Дає найплавнішу картинку, але на мобільному каналі це найдорожчий варіант: при згортанні застосунку або переході між мережами потік рветься, і його потрібно відновлювати без втрати позиції.

Пакетне надсилання

Позиції накопичуються і йдуть групами — ощадливо щодо трафіку та стійко до коротких обривів. Плата за це — затримка: курсор колеги рухається дискретно, а не плавно.

Гібридна схема

Активний рух іде потоком, а в паузах передача перемикається на пакети. Так знімається основне навантаження, але зберігається плавність там, де її видно. Саме цю схему ми найчастіше закладаємо в основу — розбираємо, як її налаштувати під ваш сценарій.

Як ми впроваджуємо живі курсори в мобільний застосунок

Впровадження живих курсорів починається не з коду, а з розбору сценаріїв: де саме в застосунку кілька людей працюють одночасно і що має бути видно кожному.

На цьому етапі ми фіксуємо, скільки учасників у сесії, як часто рухається вказівник, чи потрібна історія переміщень і як механіка поводиться за слабкого зв'язку. Від відповідей залежить вибір транспорту та частота оновлень — універсального рецепта тут немає.

Далі йдемо за етапами, кожен завершується перевірюваним результатом.

  1. Розбір сценаріїв і обмежень. Узгоджуємо, які екрани отримують живі курсори, хто бачить чужі вказівники і як вони уживаються з наявним інтерфейсом. На виході — карта сценаріїв із пріоритетами.
  2. Проєктування моделі даних. Визначаємо формат події курсора, прив'язку до сесії та правила, за якими вказівник зникає при втраті зв'язку. Це знімає основну частину майбутніх конфліктів.
  3. Налаштування синхронізації. Обираємо транспорт під задачу — постійний канал для активних сесій, обмін станами при перепідключенні. Закладаємо згладжування руху, щоб вказівник не смикався за нестабільної мережі.
  4. Реалізація на клієнті. Вбудовуємо відрисовку курсорів у наявний шар інтерфейсу, не ламаючи поточну анімацію та жести. Перевіряємо, що механіка не заважає прокручуванню та введенню.
  5. Тестування на пристроях. Проганяємо сценарії на реальних апаратах різних класів: паралельні сесії, перемикання між мережами, згортання застосунку, тривале утримання з'єднання.
  6. Оптимізація навантаження. Дивимося, скільки трафіку та заряду з'їдає механіка за активної сесії, і знижуємо частоту оновлень там, де точність не критична.
  7. Передача рішення. Віддаємо налаштовану механіку, регламенти роботи з нею та інструкції для команди, яка розвиватиме функцію далі.

Такий порядок дозволяє запустити живі курсори без переробки готових екранів і з зрозумілою поведінкою при збоях зв'язку. Опишіть свій сценарій — повернемося з оцінкою та планом впровадження.

Артефакти: схеми, конфігурації та регламенти

Усе, що описує роботу live cursors, передаємо у вигляді робочої документації, а не усних домовленостей. Інженер замовника відкриває комплект і бачить, як влаштована передача позицій, де налаштовані обмеження і що робити при збої.

  • Схема потоків даних: шлях події від дотику на пристрої до відображення в інших учасників, точки буферизації та місця, де можлива втрата або затримка.
  • Конфігурація клієнта: параметри частоти надсилання координат, пороги згладжування, правила згасання курсора при переході застосунку у фон.
  • Політики доступу: хто з учасників бачить чужі курсори, як видаються та відкликаються права, що відбувається при розриві сесії.
  • Регламент поведінки при перевантаженні: пріоритети повідомлень, ліміти на кількість одночасних курсорів, порядок деградації інтерфейсу.
  • Інструкція з підключення нових типів подій: як додати жест або мітку, не ламаючи сумісність зі старими версіями застосунку.
  • Документація по курсорах: опис форматів повідомлень, кодів помилок і сценаріїв відновлення після обриву зв'язку.
  • Чек-лист приймання: набір перевірок, за якими замовник сам підтверджує, що спільна присутність працює на цільових пристроях і мережах.

Комплект розрахований на те, щоб підтримку можна було вести без нас: інженер за схемами розуміє топологію, за конфігурацією — де змінювати поведінку, за політиками — кому відкривати доступ. Це знімає головний ризик супроводу, коли знання живе в голові одного розробника.

Опишіть задачу — повернемося з оцінкою та планом, включно зі складом документації під ваш контур.

Кейс: як ми прибрали ривки курсорів у застосунку для спільних нотаток

Що було до

Клієнт — сервіс спільних нотаток: кілька людей одночасно редагують один документ, і позиції курсорів мають бути видні всім учасникам.

На старті курсори передавалися через спільний канал синхронізації тексту: кожен рух миші йшов окремим повідомленням, без групування й без урахування стану мережі.

На стабільному Wi-Fi це виглядало прийнятно, але варто було користувачу зайти в ліфт або переключитися на слабкий мобільний інтернет — починалися ривки курсорів: мітка завмирала, потім стрибала через пів екрана, а іноді залишалася висіти на місці, де людина вже давно не перебуває.

Проблема була не в самому факті затримки, а в тому, що втрачені позиції жодним чином не позначалися. Учасники бачили застарілий курсор і вважали його актуальним — це ламало довіру до спільного редагування сильніше, ніж чесна затримка. Ми розібрали, де саме втрачається стабільність з'єднання, і перебудували шар передачі позицій.

Що змінили

Розділили два потоки даних: правки тексту йдуть надійним каналом із підтвердженням доставки, а позиції курсорів — окремим полегшеним потоком, де втрата одного повідомлення не критична, бо наступне перекриває попереднє.

Рухи групуються в пакет за короткий інтервал, тому замість десятків дрібних повідомлень іде одне — канал перестає захлинатися на слабкій мережі.

Додали згладжування на боці отримувача: між точками, що надійшли, позиція інтерполюється, мітка рухається плавно, а не стрибає.

Якщо оновлення від учасника не надходять довше за поріг, курсор позначається як неактивний і приглушується — користувач одразу бачить, що дані застаріли, замість хибної впевненості.

Що стало

Метрика До Після
Частота оновлення позицій нестабільна, залежала від навантаження рівна, з групуванням пакетів
Частка втрачених позицій на слабкій мережі помітна, без позначки близька до нуля, застарілі позначаються
Чуйність інтерфейсу під час правки просідання при активному русі рівна, потоки розведені

Ривки курсорів зникли: на слабкому з'єднанні мітка або рухається плавно, або чесно показує, що учасник неактивний. Спільне редагування перестало залежати від якості каналу в кожного окремого користувача.

Чим відрізняється живий курсор від індикатора присутності?

Індикатор присутності відповідає на питання «хто зараз у кімнаті»: надходить подія про вхід або вихід учасника, застосунок показує аватар, ім'я та статус.

Дані оновлюються рідко — раз на кілька секунд або за фактом зміни складу, — тому навантаження на канал мінімальне, а розсинхрон майже непомітний.

Такий режим закриває списки учасників, лічильники онлайну, статуси «друкує» та спільне редагування, де важлива сама наявність людини, а не її дії в конкретній точці.

Живий курсор — це безперервна передача позиції: координати вказівника, виділення, іноді натискання, які транслюються іншим учасникам із частотою, близькою до реального часу.

Тут важлива не лише доставка, а й порядок: події позиції застарівають миттєво, і втрата одного пакета не критична, а ось затримка в сотні мілісекунд уже руйнує відчуття присутності.

Тому потік позицій іде окремим каналом із низькою затримкою, без підтверджень доставки та з відкиданням застарілих значень на боці отримувача.

Ключова різниця — у природі даних. Індикатор присутності описує стан, який змінюється рідко і має бути узгодженим: якщо учасник вийшов, усі клієнти зобов'язані це побачити.

Живий курсор описує потік, де узгодженість не потрібна — важливе лише останнє положення, а проміжні можна сміливо втрачати.

Звідси різні вимоги до транспорту: для статусів підходить надійний канал із підтвердженнями, для позицій — швидкий і «дірявий», заточений під мінімальну затримку.

Вибір механіки диктує й режими відображення. Якщо завдання — показати, що колега поруч, достатньо індикатора: він дешевший, стабільніший і не навантажує пристрій.

Якщо потрібне спільне малювання, розмітка макета або навігація документом у реальному часі, без живого курсора не обійтися — але тоді доведеться закладати тротлінг подій, згладжування руху між кадрами та коректну поведінку при втраті зв'язку, інакше вказівники будуть смикатися або зависати.

На практиці ці механіки часто комбінують: індикатор присутності тримає склад кімнати та права доступу, а живий курсор працює поверх нього як окремий потік. Таке розділення дозволяє незалежно масштабувати обидва канали та вимикати дорогу передачу позицій там, де вона не потрібна.

Часті технічні сумніви щодо курсорів

Курсори — найбільш «шумна» частина спільного редагування: кожен рух вказівника породжує подію, а подій на документ із десятком учасників набираються тисячі за хвилину. Нижче — розбір технічних сумнівів, які найчастіше виникають на етапі проєктування.

Як це впливає на навантаження сервера?

Потік координат не йде в постійне сховище — він живе в оперативній пам'яті та передається через канал реального часу. Ми групуємо події: позиція надсилається не на кожен рух, а з частотою, достатньою для плавності, зайві проміжні точки відкидаються.

При обриві зв'язку сервер не накопичує «хвіст» подій, а віддає клієнту лише актуальний стан — після перепідключення учасник бачить коректні позиції, а не лавину застарілих.

Що відбувається при обриві зв'язку?

Клієнт переходить у режим перепідключення з паузою, що наростає, між спробами, щоб не забивати канал.

Поки зв'язку немає, локальні правки продовжують застосовуватися й складаються в чергу; після відновлення вони синхронізуються, а курсори інших учасників перемальовуються зі свіжого стану.

Конфлікти розв'язуються за часом зміни, тому втрата мережі не призводить до «залиплих» чужих вказівників на екрані.

Чи сумісні курсори на різних платформах?

Логіка спільна для всіх платформ, різниться лише шар відмалювання: на одній системі вказівник малюється поверх нативного шару інтерфейсу, на іншій — усередині графічного полотна.

Ми закладаємо єдиний формат повідомлень і однакову поведінку при згортанні застосунку та зміні орієнтації екрана, тому учасник на телефоні й на планшеті бачить ту саму картину.

Чи не садить це батарею?

Основний розхід дає не сама передача координат, а частота перемальовування. Ми знижуємо її, коли застосунок іде у фон, зупиняємо потік при неактивному екрані й не тримаємо постійне з'єднання там, де воно не потрібне.

На практиці застосунок з активними курсорами витрачає енергію порівнянно зі звичайним режимом редагування — різниця помітна лише при тривалій безперервній роботі у фоні, і її ми закриваємо окремою політикою.

Якщо залишилися питання щодо вашої конфігурації — опишіть сценарій, повернемося з оцінкою та планом.

Обговоримо ваше завдання щодо курсорів

Щоб повернутися з оцінкою впровадження, а не із загальними словами, нам потрібно зрозуміти три речі: як влаштована спільна робота в застосунку зараз, скільки учасників в одній сесії та які платформи в пріоритеті.

Від цього залежить вибір транспорту для live cursors — постійне з'єднання, потокова передача поверх нього або періодичне опитування, — а також частота оновлення позицій і стратегія стиснення повідомлень.

План робіт збираємо після короткого розбору.

Зазвичай він виглядає так: звіряємо технічні вимоги, проєктуємо канал передачі позицій і модель присутності, вбудовуємо шар у наявну архітектуру, підключаємо обробку обривів і перепідключень, тестуємо під навантаженням і передаємо документацію з конфігурацією.

Надішліть, що є під рукою — цього достатньо для першої оцінки:

  • опис сценарію: де саме потрібні курсори — дошка, редактор, карта, спільний перегляд;
  • поточну архітектуру застосунку та список платформ, які підтримуєте;
  • очікувану кількість одночасних учасників в одній сесії та пікове навантаження;
  • вимоги до затримки відгуку та допустимої витрати трафіку на пристрої;
  • як зараз влаштовані авторизація та права доступу до спільних об'єктів;
  • обмеження за строками та те, які екрани чіпати не можна;
  • контакт інженера з вашого боку для уточнювальних питань.

Якщо готових даних немає, це не блокує старт: частину параметрів зафіксуємо на дзвінку, решту уточнимо по ходу розбору. Опишіть завдання у двох-трьох абзацах — повернемося з оцінкою, планом робіт і складом команди під ваш сценарій.

Наші компетенції:

Останні роботи

  • Розробка мобільного додатка для компанії FEEDME
    Розробка мобільного додатка для компанії FEEDME
    1010
  • Розробка мобільного додатку для компанії XOOMER
    Розробка мобільного додатку для компанії XOOMER
    903
  • Розробка мобільного додатку для компанії RHL
    Розробка мобільного додатку для компанії RHL
    1332
  • Розробка мобільного додатку для компанії ZIPPY
    Розробка мобільного додатку для компанії ZIPPY
    1180
  • Розробка мобільного додатку для компанії Affhome
    Розробка мобільного додатку для компанії Affhome
    1107
  • Розробка мобільного додатку для компанії FLAVORS
    Розробка мобільного додатку для компанії FLAVORS
    714