Новая Яндекс.Музыка. Особенности разработки ios-клиента...

27

Upload: yandex

Post on 30-Nov-2014

281 views

Category:

Technology


2 download

DESCRIPTION

Осенью 2013 года мы приняли решение переписать iOS-приложение Яндекс.Музыки. Именно так получилась версия 3.0. В докладе небольшой рассказ о том, что «под капотом» нашего приложения, с какими нестандартными проблемами мы столкнулись при разработке и как с ними справлялись.

TRANSCRIPT

Page 1: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев
Page 2: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Новая Яндекс.Музыка. Особенности разработки iOS клиента.Зайцев СергейЯ.Субботник, Новосибирск, 18.10.2014

Page 3: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Кэширование изображений

Каким должен быть хороший кэш картинок?

Page 4: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Кэширование нужно для ускорения отрисовки картинки

4Измерения проводились при обработке JPEG 700x700 на IPhone 5S, загрузка по 3G.

2000 ms

13 ms

27 ms 400 ms

Загрузка Декодирование Обработка растра

Page 5: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Типовое решение: двухуровневый кэш

〉Минимальная нагрузка на поток пользователя кэша.

〉Ограничение на использование памяти и диска.

〉URL - первичный ключ картинки.

〉Хэш от URL - уникальная часть в имени файла.

5

Page 6: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Хорошее решение

〉Кэширование нескольких вариантов картинки (разные размеры, наложение фильтров).

6

Page 7: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Хорошее решение

〉Кэширование нескольких вариантов картинки (разные размеры, наложение фильтров).

〉Управление количеством одновременно загружаемых и обрабатываемых картинок.

!

!

7

Page 8: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Хорошее решение

〉Кэширование нескольких вариантов картинки (разные размеры, наложение фильтров).

〉Управление количеством одновременно загружаемых и обрабатываемых картинок.

〉По-настоящему уникалные имена файлов.

!

8

Page 9: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Хорошее решение

〉Кэширование нескольких вариантов картинки (разные размеры, наложение фильтров).

〉Управление количеством одновременно загружаемых и обрабатываемых картинок.

〉Не использовать хэш в качестве имени файла.

〉Обновление картинок.

9

Page 10: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

〉На клиенте генерируется несколько вариантов картинки.

Кэшируем обработанные картинки, если

10

Page 11: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Кэшируем обработанные картинки, если

〉На клиенте генерируется несколько вариантов картинки.

〉Устройство не успевает обработать картинку ”на лету”.

11

Page 12: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Кэшируем обработанные картинки, если

〉На клиенте генерируется несколько вариантов картинки.

〉Устройство не успевает обработать картинку ”на лету”.

〉Обработанная картинка будет многократно использована.

12

Page 13: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Варианты реализации обновления

〉Сервер генерирует уникальные URL для новых картинок.

13

Page 14: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Варианты реализации обновления

〉Сервер генерирует уникальные URL для новых картинок.

〉 Клиент проверяет установленные сервером HTTP заголовки (cache-control, last-modified, ETag).

14

Page 15: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Варианты реализации обновления

〉Сервер генерирует уникальные URL для новых картинок.

〉Клиент проверяет установленные сервером HTTP заголовки (cache-control, last-modified, ETag).

〉По инициативе клиента (каждый раз, по таймеру, при выходе приложения из бэкграунда…).

15

Page 16: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Варианты реализации обновления

〉Сервер генерирует уникальные URL для новых картинок.

〉Клиент проверяет установленные сервером HTTP заголовки (cache-control, last-modified, ETag).

〉По инициативе клиента (каждый раз, по таймеру, при выходе приложения из бэкграунда…).

Обновление зависимых картинок

16

Page 17: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Чтобы получить хороший кэш

〉Кэшируйте обработанные картинки.

〉Ограничивайте нагрузку на CPU и память.

〉Используйте уникальные имена файлов.

〉Позаботьтесь об обноволении картинок.

!

17

Page 18: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Стриминг и кэширование музыки

Page 19: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Особенности

〉Для кэширования и стриминга используется общий загрузчик.

19

Page 20: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Особенности

〉Для кэширования и стриминга используется общий загрузчик.

〉Специализированный загрузчик.

20

Page 21: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Особенности

〉Для кэширования и стриминга используется общий загрузчик.

〉Собственный загрузчик.

〉Собственный UI плейера.

21

Page 22: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Схема стриминга

22

Кэш

Загрузчик

Управление стримингом Audio Queue

UI

Данные

16Кб

Управление

Page 23: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Тюнинг

〉Воспроизведение кусками по 16 КБ.

23

Page 24: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Тюнинг

〉Воспроизведение кусками по 16 КБ.

〉Ограничение частоты обновления прогресса скачивания.

24

Page 25: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Тюнинг

〉Воспроизведение кусками по 16 КБ.

〉Ограничение частоты уведомлений о прогрессе скачивания.

〉Ручное управление транзакциями СУБД.

25

Page 26: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

Выводы

〉Кэширование и стриминг должны использовать общий загрузчик.

〉Стриминг должен хорошо работать на медленных соединениях.

〉Нагрузка на вычислительные ресурсы должна быть управляемой.

26

Page 27: Новая Яндекс.Музыка. Особенности разработки iOS-клиента — Сергей Зайцев

27

Сергей Зайцев

Старший разработчик

Контакты

@libra_rf

sergey.zaytsev.5264

+7 (913) 919 59 95

[email protected]