История изменений
Исправление firkax, (текущая версия) :
Очередное обновление информации, если кому интересно, выяснилось несколько фактов.
-
вышеприведённые дампы, где всё время занимает функция
viaduct_log_error
- скорее всего артефакты багов (гуи профайлера неправильно сопоставило адрес в памяти и название функции). Связано, скорее всего, с тем, что в дебиановской (и в моей той) сборках фф отключены отладочные символы, а само libxul.so, в котором находится весь проблемный код (кстати, походу там вообще весь движок фф расположен, а всё остальные несколько десятков so и исполняемый бинарник - только обвязка к нему и местами драйверы ssl и прочей сети) было stripped и таким образом имена функций в нём отсутствовали. После того, как я нашёл в сборочной директории libxul.so до strip-а и подсунул его вместо релизного - вывод профайлера сразу стал более похож на настоящий. -
То что я «собрал с sse и лаги никуда не делись» - неправильно собрал. Я подставил те ключи в CFLAGS и они действовали только на .c но большинство кода там .cpp - так что надо было ещё и в CXXFLAGS. А ещё есть код на расте, что подставить туда я ещё не выяснил. SSE для .cpp заметно улучшило ситуацию, однако подробнее в следующем пункте. При этом в about:buildconfig в флагах для c++ они почему-то не появились.
-
Оказалось что проблема таки не одна. Есть лаги в процессе вкладки (который обслуживает js) - там лагала функция рисования на canvas, и вот она кажется полностью исправилась после включения SSE в CXXFLAGS - и это как раз те лаги, которые были видны в самой игре и из-за которых я вообще полез разбираться. И есть ещё одни лаги в главном процессе в треде рендера (они видны в html-примере который я выкладывал, и в экране загрузки игры). Они собственно никуда не делись, и приходятся на софтварный эмулятор opengl, который фф включает для моей нвидии. Но эмулятор то есть и в официальной сборке и там он работает быстро - надо разбираться дальше. Возможно надо как-то присунуть sse в раст. В официальной сборке есть флаг –enable-rust-simd но у меня при попытке его использования сборка падает с ошибкой «unresolved import
simd_funcs
», «use of undeclared crate or modulesimd_funcs
».
Почти 100% процового времени рендер-тред проводит в функции void draw_quad_spans<unsigned int>(int, glsl::vec2_scalar*, unsigned int, glsl::vec3*, Texture&, Texture&, ClipRect const&) [gfx/wr/swgl/src/rasterize.h]
вокруг которой ещё всякой rust-код в большой количестве.
Профайлеры для лагов js-canvas:
кастомной сборки без SSE: https://share.firefox.dev/3ShU72s
мозилловской сборки: https://share.firefox.dev/48JPjse
кастомной сборки в SSE в CFLAGS+CXXFLAGS: https://share.firefox.dev/3tJCjEd
Бектрейс до функции где видны различия:
SkDraw::drawRect(SkRect const&, SkPaint const&, SkMatrix const*, SkRect const*) const [libxul.so]
SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkRect const*, SkPaint const&) const [libxul.so]
SkBitmapDevice::drawBitmap(SkBitmap const&, SkMatrix const&, SkRect const*, SkPaint const&) [libxul.so]
SkBitmapDevice::drawBitmapRect(SkBitmap const&, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) [libxul.so]
SkBaseDevice::drawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) [libxul.so]
SkCanvas::onDrawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) [libxul.so]
SkCanvas::drawImageRect(SkImage const*, SkRect const&, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) [libxul.so]
mozilla::gfx::DrawTargetSkia::DrawSurface(mozilla::gfx::SourceSurface*, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::DrawSurfaceOptions const&, mozilla::gfx::DrawOptions const&) [libxul.so]
mozilla::dom::AdjustedTarget::DrawSurface(mozilla::gfx::SourceSurface*, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::DrawSurfaceOptions const&, mozilla::gfx::DrawOptions const&) [libxul.so]
mozilla::dom::CanvasRenderingContext2D::DrawImage(mozilla::dom::HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrOffscreenCanvasOrImageBitmap const&, double, double, double, double, double, double, double, double, unsigned char, mozilla::ErrorResult&) [libxul.so]
mozilla::dom::CanvasRenderingContext2D::DrawImage(mozilla::dom::HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrOffscreenCanvasOrImageBitmap const&, double, double, double, double, mozilla::ErrorResult&) [libxul.so]
mozilla::dom::CanvasRenderingContext2D_Binding::drawImage(JSContext*, JS::Handle<JSObject*>, void*, JSJitMethodCallArgs const&) [libxul.so]
CanvasRenderingContext2D.drawImage
mozilla::dom::binding_detail::GenericMethod<mozilla::dom::binding_detail::NormalThisPolicy, mozilla::dom::binding_detail::ThrowExceptions>(JSContext*, unsigned int, JS::Value*) [libxul.so]
0x576307df
CanvasRenderingContext2D.prototype.drawImage [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:733:53]
Game.Launch/Game.Init/Game.DrawBackground [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:15170:30]
Game.Launch/Game.Draw [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:16654:19]
Game.Launch/Game.Loop [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:16769:19]
js::RunScript
setTimeout handler
nsTimerImpl::Fire
XRE_InitChildProcess
(root)
Дальше видны такие отличия:
-
В версиях с SSE оно вообще меньшую долю времени занимает и кроме него становятся заметны всякие ожидания событий
-
фф без SSE - почти время занимает
draw_rect_as_path
и в 30 раз меньше наSkScan::AntiFillRect
, а в мозилловской и в моей с SSE такой огромной разницы нет, в разных местах то одно то другое больше -
внутри этой функции в no-sse версии есть вызовы функций с префиксом portable::, в мозилловской - sse2::, в моей с sse (arch=amdfam10) - sse3:: - что наводит на мысли что мозилловская сборка тоже под весьма древние процы и её вполне можно ускорить ещё дальше, если правильно собрать.
-
В мозилловской версии функция drawDevPath заинлайнена в drawPath а в моих сборках нет - не знаю насколько это влияет
Исправление firkax, :
Очередное обновление информации, если кому интересно, выяснилось несколько фактов.
-
вышеприведённые дампы, где всё время занимает функция
viaduct_log_error
- скорее всего артефакты багов (гуи профайлера неправильно сопоставило адрес в памяти и название функции). Связано, скорее всего, с тем, что в дебиановской (и в моей той) сборках фф отключены отладочные символы, а само libxul.so, в котором находится весь проблемный код (кстати, походу там вообще весь движок фф расположен, а всё остальные несколько десятков so и исполняемый бинарник - только обвязка к нему и местами драйверы ssl и прочей сети) было stripped и таким образом имена функций в нём отсутствовали. После того, как я нашёл в сборочной директории libxul.so до strip-а и подсунул его вместо релизного - вывод профайлера сразу стал более похож на настоящий. -
То что я «собрал с sse и лаги никуда не делись» - неправильно собрал. Я подставил те ключи в CFLAGS и они действовали только на .c но большинство кода там .cpp - так что надо было ещё и в CXXFLAGS. А ещё есть код на расте, что подставить туда я ещё не выяснил. SSE для .cpp заметно улучшило ситуацию, однако подробнее в следующем пункте.
-
Оказалось что проблема таки не одна. Есть лаги в процессе вкладки (который обслуживает js) - там лагала функция рисования на canvas, и вот она кажется полностью исправилась после включения SSE в CXXFLAGS - и это как раз те лаги, которые были видны в самой игре и из-за которых я вообще полез разбираться. И есть ещё одни лаги в главном процессе в треде рендера (они видны в html-примере который я выкладывал, и в экране загрузки игры). Они собственно никуда не делись, и приходятся на софтварный эмулятор opengl, который фф включает для моей нвидии. Но эмулятор то есть и в официальной сборке и там он работает быстро - надо разбираться дальше. Возможно надо как-то присунуть sse в раст. В официальной сборке есть флаг –enable-rust-simd но у меня при попытке его использования сборка падает с ошибкой «unresolved import
simd_funcs
», «use of undeclared crate or modulesimd_funcs
».
Почти 100% процового времени рендер-тред проводит в функции void draw_quad_spans<unsigned int>(int, glsl::vec2_scalar*, unsigned int, glsl::vec3*, Texture&, Texture&, ClipRect const&) [gfx/wr/swgl/src/rasterize.h]
вокруг которой ещё всякой rust-код в большой количестве.
Профайлеры для лагов js-canvas:
кастомной сборки без SSE: https://share.firefox.dev/3ShU72s
мозилловской сборки: https://share.firefox.dev/48JPjse
кастомной сборки в SSE в CFLAGS+CXXFLAGS: https://share.firefox.dev/3tJCjEd
Бектрейс до функции где видны различия:
SkDraw::drawRect(SkRect const&, SkPaint const&, SkMatrix const*, SkRect const*) const [libxul.so]
SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkRect const*, SkPaint const&) const [libxul.so]
SkBitmapDevice::drawBitmap(SkBitmap const&, SkMatrix const&, SkRect const*, SkPaint const&) [libxul.so]
SkBitmapDevice::drawBitmapRect(SkBitmap const&, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) [libxul.so]
SkBaseDevice::drawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) [libxul.so]
SkCanvas::onDrawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) [libxul.so]
SkCanvas::drawImageRect(SkImage const*, SkRect const&, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) [libxul.so]
mozilla::gfx::DrawTargetSkia::DrawSurface(mozilla::gfx::SourceSurface*, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::DrawSurfaceOptions const&, mozilla::gfx::DrawOptions const&) [libxul.so]
mozilla::dom::AdjustedTarget::DrawSurface(mozilla::gfx::SourceSurface*, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::DrawSurfaceOptions const&, mozilla::gfx::DrawOptions const&) [libxul.so]
mozilla::dom::CanvasRenderingContext2D::DrawImage(mozilla::dom::HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrOffscreenCanvasOrImageBitmap const&, double, double, double, double, double, double, double, double, unsigned char, mozilla::ErrorResult&) [libxul.so]
mozilla::dom::CanvasRenderingContext2D::DrawImage(mozilla::dom::HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrOffscreenCanvasOrImageBitmap const&, double, double, double, double, mozilla::ErrorResult&) [libxul.so]
mozilla::dom::CanvasRenderingContext2D_Binding::drawImage(JSContext*, JS::Handle<JSObject*>, void*, JSJitMethodCallArgs const&) [libxul.so]
CanvasRenderingContext2D.drawImage
mozilla::dom::binding_detail::GenericMethod<mozilla::dom::binding_detail::NormalThisPolicy, mozilla::dom::binding_detail::ThrowExceptions>(JSContext*, unsigned int, JS::Value*) [libxul.so]
0x576307df
CanvasRenderingContext2D.prototype.drawImage [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:733:53]
Game.Launch/Game.Init/Game.DrawBackground [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:15170:30]
Game.Launch/Game.Draw [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:16654:19]
Game.Launch/Game.Loop [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:16769:19]
js::RunScript
setTimeout handler
nsTimerImpl::Fire
XRE_InitChildProcess
(root)
Дальше видны такие отличия:
-
В версиях с SSE оно вообще меньшую долю времени занимает и кроме него становятся заметны всякие ожидания событий
-
фф без SSE - почти время занимает
draw_rect_as_path
и в 30 раз меньше наSkScan::AntiFillRect
, а в мозилловской и в моей с SSE такой огромной разницы нет, в разных местах то одно то другое больше -
внутри этой функции в no-sse версии есть вызовы функций с префиксом portable::, в мозилловской - sse2::, в моей с sse (arch=amdfam10) - sse3:: - что наводит на мысли что мозилловская сборка тоже под весьма древние процы и её вполне можно ускорить ещё дальше, если правильно собрать.
-
В мозилловской версии функция drawDevPath заинлайнена в drawPath а в моих сборках нет - не знаю насколько это влияет
Исходная версия firkax, :
Очередное обновление информации, если кому интересно, выяснилось несколько фактов.
-
вышеприведённые дампы, где всё время занимает функция
viaduct_log_error
- скорее всего артефакты багов (гуи профайлера неправильно сопоставило адрес в памяти и название функции). Связано, скорее всего, с тем, что в дебиановской (и в моей той) сборках фф отключены отладочные символы, а само libxul.so, в котором находится весь проблемный код (кстати, походу там вообще весь движок фф расположен, а всё остальные несколько десятков so и исполняемый бинарник - только обвязка к нему и местами драйверы ssl и прочей сети) было stripped и таким образом имена функций в нём отсутствовали. После того, как я нашёл в сборочной директории libxul.so до strip-а и подсунул его вместо релизного - вывод профайлера сразу стал более похож на настоящий. -
То что я «собрал с sse и лаги никуда не делись» - неправильно собрал. Я подставил те ключи в CFLAGS и они действовали только на .c но большинство кода там .cpp - так что надо было ещё и в CXXFLAGS. А ещё есть код на расте, что подставить туда я ещё не выяснил. SSE для .cpp заметно улучшило ситуацию, однако подробнее в следующем пункте.
-
Оказалось что проблема таки не одна. Есть лаги в процессе вкладки (который обслуживает js) - там лагала функция рисования на canvas, и вот она кажется полностью исправилась после включения SSE в CXXFLAGS - и это как раз те лаги, которые были видны в самой игре и из-за которых я вообще полез разбираться. И есть ещё одни лаги в главном процессе в треде рендера (они видны в html-примере который я выкладывал, и в экране загрузки игры). Они собственно никуда не делись, и приходятся на софтварный эмулятор opengl, который фф включает для моей нвидии. Но эмулятор то есть и в официальной сборке и там он работает быстро - надо разбираться дальше. Возможно надо как-то присунуть sse в раст. В официальной сборке есть флаг –enable-rust-simd но у меня при попытке его использования сборка падает с ошибкой «unresolved import
simd_funcs
», «use of undeclared crate or modulesimd_funcs
».
Профайлеры для лагов js-canvas:
кастомной сборки без SSE: https://share.firefox.dev/3ShU72s
мозилловской сборки: https://share.firefox.dev/48JPjse
кастомной сборки в SSE в CFLAGS+CXXFLAGS: https://share.firefox.dev/3tJCjEd
Бектрейс до функции где видны различия:
SkDraw::drawRect(SkRect const&, SkPaint const&, SkMatrix const*, SkRect const*) const [libxul.so]
SkDraw::drawBitmap(SkBitmap const&, SkMatrix const&, SkRect const*, SkPaint const&) const [libxul.so]
SkBitmapDevice::drawBitmap(SkBitmap const&, SkMatrix const&, SkRect const*, SkPaint const&) [libxul.so]
SkBitmapDevice::drawBitmapRect(SkBitmap const&, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) [libxul.so]
SkBaseDevice::drawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const&, SkCanvas::SrcRectConstraint) [libxul.so]
SkCanvas::onDrawImageRect(SkImage const*, SkRect const*, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) [libxul.so]
SkCanvas::drawImageRect(SkImage const*, SkRect const&, SkRect const&, SkPaint const*, SkCanvas::SrcRectConstraint) [libxul.so]
mozilla::gfx::DrawTargetSkia::DrawSurface(mozilla::gfx::SourceSurface*, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::DrawSurfaceOptions const&, mozilla::gfx::DrawOptions const&) [libxul.so]
mozilla::dom::AdjustedTarget::DrawSurface(mozilla::gfx::SourceSurface*, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, float> const&, mozilla::gfx::DrawSurfaceOptions const&, mozilla::gfx::DrawOptions const&) [libxul.so]
mozilla::dom::CanvasRenderingContext2D::DrawImage(mozilla::dom::HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrOffscreenCanvasOrImageBitmap const&, double, double, double, double, double, double, double, double, unsigned char, mozilla::ErrorResult&) [libxul.so]
mozilla::dom::CanvasRenderingContext2D::DrawImage(mozilla::dom::HTMLImageElementOrSVGImageElementOrHTMLCanvasElementOrHTMLVideoElementOrOffscreenCanvasOrImageBitmap const&, double, double, double, double, mozilla::ErrorResult&) [libxul.so]
mozilla::dom::CanvasRenderingContext2D_Binding::drawImage(JSContext*, JS::Handle<JSObject*>, void*, JSJitMethodCallArgs const&) [libxul.so]
CanvasRenderingContext2D.drawImage
mozilla::dom::binding_detail::GenericMethod<mozilla::dom::binding_detail::NormalThisPolicy, mozilla::dom::binding_detail::ThrowExceptions>(JSContext*, unsigned int, JS::Value*) [libxul.so]
0x576307df
CanvasRenderingContext2D.prototype.drawImage [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:733:53]
Game.Launch/Game.Init/Game.DrawBackground [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:15170:30]
Game.Launch/Game.Draw [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:16654:19]
Game.Launch/Game.Loop [https://orteil.dashnet.org/cookieclicker/main.js?v=10b:16769:19]
js::RunScript
setTimeout handler
nsTimerImpl::Fire
XRE_InitChildProcess
(root)
Дальше видны такие отличия:
-
В версиях с SSE оно вообще меньшую долю времени занимает и кроме него становятся заметны всякие ожидания событий
-
фф без SSE - почти время занимает
draw_rect_as_path
и в 30 раз меньше наSkScan::AntiFillRect
, а в мозилловской и в моей с SSE такой огромной разницы нет, в разных местах то одно то другое больше -
внутри этой функции в no-sse версии есть вызовы функций с префиксом portable::, в мозилловской - sse2::, в моей с sse (arch=amdfam10) - sse3:: - что наводит на мысли что мозилловская сборка тоже под весьма древние процы и её вполне можно ускорить ещё дальше, если правильно собрать.
-
В мозилловской версии функция drawDevPath заинлайнена в drawPath а в моих сборках нет - не знаю насколько это влияет