33000 и анимированный GIF
![]() |
По всей видимости, «Опера» немного неправильно обрабатывает анимированные «гифы».
Анимированный GIF устроен очень просто — поверх первого кадра через заданное время лепится следующий. Задержка задаётся в сотых долях секунды и, согласно спецификации, поля для её хранения имеет размер беззнаковое слово (2 байт), то есть максимальное значение — 655,35 секунд или почти 11 минут.
Распространённая ошибка в Си и похожих языках — использовать вместо беззнакового число со знаком. Тогда максимальное значение по модулю сокращается в два раза.
Вот я и проверил — не содержат ли кодеки популярных браузеров эту ошибку. На картике — число «1», если оно через пять-шесть минут сменится на «2», значит ошибки нет. Я выставил задержку между кадрами в 33000 (330 секунд или 5,5 минут). Кодек с ошибкой будет трактовать это число как -233 (отрицательное), поэтому кадр не сменится.
У меня на ноуте на FF 5, Safari 5.0.5, Chrome 12.0.742.122 цифра меняется, а на «Опере» 11.50 — нет. Сейчас попробую найти ноут с Windows 7 и попробую там. Попробуйте тоже на своих браузерах.
Добавлено: меняются ещё цифры на Андроиде 2.3.4, на FF 4.0.1 (Windows), а так же под Internet Explorer 9.0 и 10PP2 (Windows 7).
Добавлено ещё позднее: всё в порядке у «Оперы», разъяснил один из читателей — «Опера» начинает анимацию заново, если GIF не было видно. Дожидаясь, я переключал табы, поэтому анимация стартовала всегда сначала и «2» не появлялась. Так что ложная тревога, но любопытный факт.
У меня в опере (11.50) всё в порядке. Просто Опера хитрая и начинает анимацию сначала, если изображение целиком было скрыто (при скролинге или переходе в другую владку/окно).
FF3.6 — полет нормальный, IE7 — тоже.
Комментарий для mkal.livejournal.com:
Сейчас попробую оттестить не перекрывая анимацию.
Комментарий для mkal.livejournal.com:
Вы правы, анимация стартует заново, бага нет.
Линуксовая RSS-читалка Akregator (отображение постов, насколько я понимаю, сделано на движке браузера Konqueror): циферка меняется.
Комментарий для shmidt.net:
Похоже, всё-таки проблемы нет.
Linux + Chrome 12.0.742.112, цифра не меняется
Комментарий для silent:
Хм. А долго ждали? Вкладки не переключали?
Черт, не дочитал. Думал что 5 секунд задержка, а оказывается 5, извините :)
Цифра переключается.
А вот совсем злобный вопрос — получается, что остальные , кроме оперы, крутят картинку и когда ее не видно? Отрисовывают окно, тратят процессор и т. п.?
Комментарий для kalvado.livejournal.com:
Это второй мой шаг — попытаться это выяснить.
Комментарий для kalvado.livejournal.com:
Хром на линуксе, похоже не крутит. Ставить сложный эксперимент мне лень, но когда я вижу картинки с длинной анимацией, то при скрытии картинки за границы окна использование процессора падает (сложно блин заметить разницу в процент на фоне общего шума системы), а когда внезапно через какое-то время вытаскиваешь картинку обратно, можно заметить как она за доли секунды накатывает все пропущенные кадры. Вплоне разумное решение.
Получается, кстати, что в опере не будут работать базяваскриптовые часы (-:
А они все не системными библиотеками пользуются для отображения графики?
Комментарий для kalvado.livejournal.com:
Вряд ли. Карта времени (или как оно зовётся) переключений кадров известна, время начала показа тоже, высчитать какой кадр надо показать несложно.