Я портировал проект игрового движка для моего университетского курса с C / C ++ на JavaScript, используя emscripten. Установлен флаг оптимизации asm.js, и я измерял производительность.
Но что удивительно, так это то, что производительность в Firefox плохая. Пока проект работает очень хорошо в Chrome и Opera. Это не имеет смысла для меня, учитывая, что FireFox является браузером, использующим оптимизацию asm.js.
Этот проект представляет собой гоночную игру на слаломе с использованием SDL и WebGL. Запустив Firefox на моем ноутбуке, профилировщик показывает, что демонстрационная версия полностью связана с процессором, а узкие места появляются вокруг _SDL_LockSurface () и _TTF_RenderText_Solid (). Они используются для визуализации динамического текста среди других вещей.
И все же в Chrome процессор большую часть времени простаивает в одной и той же системе. И производительность аналогична в Опере.
Значит ли это, что оптимизация asm.js не работает? Firefox сообщает, что код asm.js успешно скомпилирован. Так почему же эта оптимизация имеет обратный эффект и приводит к выполнению, которое в лучшем случае составляет половину частоты кадров?
Я тестировал с FF версии 28, а также текущей ночной сборкой. Демо можно найти здесь,
http://www.susurrus.mars-station.com/page7.php?lang=en
Я долго думал над этим вопросом, и у меня может быть ответ для вас. Просто избавься от canvas.getContext('2d')
, Я думаю, что asm.js не ваша проблема вообще.
Как сказал @BorisZbarsky, это графические вызовы, которые не имеют ничего общего с asm.js. Вы ответили, что это без проблем. Я протестировал это сам и многое из того, что может последовать после getContext, так как 2D — это тяжелая графическая операция, которую вы действительно не можете сделать в режиме реального времени fps.
Простой пример там: http://jsfiddle.net/windkiller/8r3gP/
Это очень простая анимация, но она съедает 60% моего процессора.