По моему опыту, даже до сегодняшнего дня я все еще вижу больше визуального отставания в перемещении / анимации сущностей в играх на основе JavaScript (Canvas), чем в играх на основе Flash.
Почему это так? Каково именно расхождение на самом базовом уровне между компилятором JIT и AOT в конкретном сценарии JavaScript против Flash.
Ответы:
Это не метод компиляции, который делает игру задержкой, это сборщик мусора, и сборщик мусора Flash отделен от браузеров.
Я думаю, что могу с полной уверенностью сказать, что вы запускаете Firefox, потому что сборщик мусора Firefox - худшая часть дерьма, которую вы можете получить с игровой точки зрения. Если вы открываете только одну вкладку и запускаете в нее легкую JavaScript-игру, это обычно терпимо, а то и незаметно. Но если вы откроете кучу вкладок, запустите что-то более требовательное или воспользуетесь Firebug, вы легко получите обычные скачки задержки, превышающие 100 мс.
Некоторое время я не проводил всестороннего тестирования, но Chrome всегда хорошо справлялся с этим, и IE9 и Safari, по-видимому, также выполняют приемлемую работу.
Я сделал инструмент для тестирования лага JavaScript, вы можете поиграть с ним, если хотите: http://ebusiness.hopto.org/lagtest/
источник
Трудно сказать, не глядя на реальный код, но несколько моментов:
Вспышка была вокруг дольше. Люди, которые создают инструменты и библиотеки для этого, имеют больший опыт работы с анимацией. Я не большой поклонник инструментов и запатентованной технологии, но я никогда не буду стучать с разработчиком ActionScript, который знает, что он / она делает.
JIT-браузеры также являются относительно новыми для разработчиков JS. Лучший выбор для действительно отточенных перфитационных инициатив - это то, что мы рассмотрим как сообщество. В большинстве случаев встроенная функция def была пограничной глупостью. Теперь это отличный способ повысить производительность во многих сценариях JIT.
Нормализация для множества браузеров не обязательна, но часто приводит к тому, что она не в полной мере использует все возможности данного браузера.
(отредактируйте: не совсем правильно, но здесь, возможно, есть смысл - Эрик). Плагин Flash поддерживает вектор, и широко понимается, как извлечь из этого максимум пользы. Будут ли схемы наследования приносить нам массу пользы с контекстными объектами Canvas, еще неизвестно, но я сомневаюсь, что это будет в той же степени, что и вы, выигрывая от вектора.
источник
Интересно, что еще никто не упомянул о разнице в типах JIT-компиляции, потому что Flash по-прежнему JIT-компилируется, и в большинстве современных браузеров, так же как и JavaScript, однако Flash - это язык со строгой типизацией, что означает есть целая область оптимизаций, которые он может выполнять (например, отправлять вызов метода напрямую (что JavaScript не может сделать)), чего не может сделать JavaScript, потому что он динамически типизирован. Вы можете заменить полное определение функции в JavaScript в любой момент, когда захотите, и это новое определение - то, что должно быть вызвано. (для JavaScript все еще возможно сделать косвенный вызов, который не будет намного более дорогим, хотя) Доступ к полю на поле на самом деле является лучшим примером, чем вызов метода, потому что JavaScript не может даже сделать это косвенно,
Другое отличие в производительности, как уже упоминалось, GC. Я подозреваю (я не проверял), что большинство браузеров используют GC для подсчета ссылок (поскольку вся память, выделенная GC для страницы, может быть освобождена при выходе из страницы, это фактически одно из лучших мест для использования GC для подсчета ссылок ) или консервативное сканирование ГК (например, Бёма). Последний может быть значительно медленнее первого, если он не реализован правильно. (Boehm - пример правильной реализации) С другой стороны, Flash использует точный GC (намного проще сделать в строго типизированной системе). Поскольку Flash использует точный GC, у него нет накладных расходов на подсчет ссылок во время выполнения. (который не огромен, но все еще существует) Хорошим примером точного GC является SGen Mono, который также сжимает кучу.
Затем следует тот факт, что JavaScript не был разработан с учетом анимации. (как уже упоминалось) Насколько мне известно, ни один браузер не будет генерировать инструкции в стиле SSE для циклов анимации, тогда как основные функции рендеринга во Flash, вероятно, были оптимизированы вручную для достижения максимальной производительности. (в некоторых местах пишется в сыром виде)
В общем, все сводится к тому, что динамический язык всегда будет медленнее, чем статически типизированный, если он должен быть скомпилирован своевременно, чтобы пользователь не жаловался на его медлительность.
источник
ИМХО, что различие происходит от того факта, что Flash был построен с нуля, чтобы сделать именно это, анимации. Flash реализует (хотя и не по общему мнению) методы для более плавной визуализации, выполняемой по умолчанию, когда в JS вам нужно будет сделать эти реализации вручную.
Есть примеры отличных реализаций JS / Canvas, которые работают даже лучше, чем большинство Flash-игр, которые я вижу вокруг. Все зависит от разработчика.
источник
Помимо GC, аспекта JIT этих технологий, существует разрыв между использованием аппаратного обеспечения.
В последней версии Flash Player Flash начал прибегать к аппаратному ускорению для рендеринга этих изображений, что делает процесс рендеринга более быстрым и качественным. в то время как игры на основе JS в некоторых браузерах (FF, CHROME) еще не начали этого. Однако было одно исключение: браузер IE9 начал перепроектировать со уровня аппаратной абстракции, браузеры из IE9 добились огромного прогресса в использовании аппаратного ускорения, поэтому рендеринг графики в этих браузерах определенно лучше и быстрее, чем в других браузерах.
источник