Servo: рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб 60fps рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдЬрдире░ 2020  ┬╖  71рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: servo/servo

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрдо рдПрдлрдкреАрдПрд╕ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдХреА рдЬрд╛рдВрдЪ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

B-meta I-perf-slow P-windows

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐: IPC рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, FPS рдЕрдм 55 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдордБрдбрд░рд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдХрднреА-рдХрднреА рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЛ рд╣рд┐рд▓рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ 45 рд╕реЗ рдиреАрдЪреЗ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, _except_ рд▓реЛрдб рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рджреМрд░рд╛рди (рдЬрд╣рд╛рдБ рдпрд╣ 30 рддрдХ рдиреАрдЪреЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рдЬрдм рдпрд╣ рдкрд╣рд▓реЗ рдПрдХ рд╣рд╛рде рджреЗрдЦрддрд╛ рд╣реИ (рдЬрдм рдпрд╣ рдиреАрдЪреЗ 20 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред

рд╕рднреА 71 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рдЙрдЬрд╛рдЧрд░ рд╣реБрдИ рд╣реИ:

рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреЗрдВрдЯ рдбреЗрдореЛ рдХрд╛ рдПрдХ рдирд┐рд╢рд╛рди рдЗрди рджрд┐рдиреЛрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рдЕрд╡рдзрд┐ рдХреЗ рджреМрд░рд╛рди рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

  • рд╡реЗрдмрдЬреАрдПрд▓ рдереНрд░реЗрдб рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЙрд╕ рд╕рдордп рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ gl::Finish рдХреЗ рддрд╣рдд рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рд░реНрдлрдореИрди рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ::bind_surface_to_context)
  • рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рджреВрд╕рд░рд╛ рд╕рдмрд╕реЗ рд╡реНрдпрд╕реНрдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдЪреНрдЪрддрдо рдЙрдкрдпреЛрдЧ eglCreatePbufferFromClientBuffer рдореЗрдВ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд▓рдЧрднрдЧ рдЙрддрдирд╛ рд╣реА рд╕рдордп TLS рд╕реЗ Egl рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдерд┐рдпрд╛рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

    • рдЗрд╕ рд╕реНрдЯреИрдХ рдореЗрдВ рд╡реЗрдмрд░реЗрдВрдбрд░ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рднреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ

    • winrt::servo::flush рдпрд╣рд╛рдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ GL рдмрдлрд╝рд░реНрд╕ рдХреЛ рд╕реНрд╡реИрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╣рдо рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб рдореЗрдВ рд╣реИрдВ

  • рддреАрд╕рд░рд╛ рдЙрдЪреНрдЪрддрдо CPU рдЙрдкрдпреЛрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдереНрд░реЗрдб рд╣реИ, рдЬреЛ JIT рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдмрд╣реБрдд рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░рддрд╛ рд╣реИ
  • рдЙрд╕ рдереНрд░реЗрдб рдХреЗ рдмрд╛рдж рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдо рддреМрд░ рдкрд░ рдмрд╣реБрдд рдХрдо рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯрд╛рдЗрд▓ рдХреНрд░реЗрдЯ рд╕реЗ рдХреБрдЫ рдкреНрд░рддреАрдХ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЖрдЙрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдЙрди рдбреЗрдЯрд╛ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдЬрд╝рдорд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ:

  • рдбрд┐рд╡рд╛рдЗрд╕ рдлреНрд░реЗрдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдЕрдЧрд▓рд╛ рдПрдХреНрд╕рдЖрд░ рдлреНрд░реЗрдо рд╢реБрд░реВ рдХрд░реЗрдВ
  • gl::Finish (webgl thread), eglCreateBufferFromClientBuffer рдФрд░ TLS (рдореБрдЦреНрдп рдереНрд░реЗрдб) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░реЗрдВ

https://github.com/servo/servo/pull/25343#issuecomment -567706735 рдореЗрдВ рдЗрдВрдЬрди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреА рдЕрдзрд┐рдХ рдЬрд╛рдВрдЪ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рд╕реНрдкрд╖реНрдЯ рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдорд╛рдк рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

Gl::Finish рдЙрдкрдпреЛрдЧ https://github.com/pcwalton/surfman/blob/6705a9aaa8f33ac1324fdb1913242800e68c7720/surfman/src/platform/windows/angle/context.rs#L259 -L266 рд╕реЗ рдЖрддрд╛ рд╣реИред

Gl::Finish to gl::Flush рдмрджрд▓рдирд╛ ~15->30 рд╕реЗ рдлреНрд░реИрдорд░реЗрдЯ рдХреЛ рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлреНрд░реЗрдо рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдПрдХ рдЕрддреНрдпрдВрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЕрдВрддрд░рд╛рд▓ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд┐рд░ рдХреА рдЧрддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд┐рд░ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред рдЗрд╕реА рдмреАрдЪред

рдХреБрдВрдЬреА рд╡рд╛рд▓реЗ рдореНрдпреВрдЯреЗрдХреНрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ANGLE рдореЗрдВ рдЙрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЕрдХреНрд╖рдо рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди mozangle рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ (https://github.com/servo/mozangle/blob/706a9baaf8026c1a3cb6c67ba63aa5f4734264d0/build_data.rs#L175), рдФрд░ рдпрд╣реА рд╕рд░реНрдлрдореИрди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ . рдореИрдВ ANGLE рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ gl::рдлрд┐рдирд┐рд╢ рдХреЙрд▓ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдХреА рдкреБрд╖реНрдЯрд┐! ANGLE рдореЗрдВ рдЬрдмрд░рди рдмрдВрдж рдореНрдпреВрдЯреЗрдХреНрд╕ рдореБрдЭреЗ рдкреЗрдВрдЯ рдбреЗрдореЛ рдореЗрдВ 25-30 FPS рджреЗрддрд╛ рд╣реИ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдЬреЛ gl::Finish рдХреЙрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ред

рдУрд╣, рдФрд░ рд▓рд╛рд░реНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА:

  • w/ dom.ion.enabled рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рд╣реИ, JIT рд╕рдордп рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд╛рд░ рдмрд╣реБрдд рдзреАрдореЗ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЪреАрдЬреЗрдВ рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╡реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реЛрддреЗ рд╣реИрдВред

    • рдпрд╣ рдЕрднреА рднреА рд╢рд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реИ - рдЙрд╕ babylon.js рдЙрджрд╛рд╣рд░рдг рдкрд░ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИ (рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА)

    • рд╣рдореЗрдВ android рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ FxR рдХреЗ рд▓рд┐рдП рд╣реЛ рд░рд╣реЗ arm64-рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕реНрдкрд╛рдЗрдбрд░рдореЛрдирдХреА рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдВ std::thread::local::LocalKey<surfman::egll::Egl> рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ - рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдЯреАрдПрд▓рдПрд╕ рдкрдврд╝рд╛ рдЧрдпрд╛ рд╕рдордп рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЯреАрдПрд▓рдПрд╕ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреИрд╕реЗ eglCreatePbufferFromClientBuffer рдФрд░ DXGIAcquireSync рдХрд┐ _рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ_ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ js.ion.enabled рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдкреЗрдВрдЯ рдбреЗрдореЛ рдХреЗ FPS рдХреЛ рдиреБрдХрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ 20-25 рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп: create_surface_texture_from_texture рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рджреЛ рдмрд╛рд░ (рдкреНрд░рддреНрдпреЗрдХ рдЖрдВрдЦ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ d3d рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░), рдЬрдм openxr webxr рдбрд┐рд╡рд╛рдЗрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рд╕реНрд╡реИрдкрдЪреЗрди рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рд╕рддрд╣ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб рдХреЗ рджреМрд░рд╛рди рд╕реАрдкреАрдпреВ рдХреЗ рджреВрд╕рд░реЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдореБрдЦреНрдп рдереНрд░реЗрдб рд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛ред

рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░: рдпрджрд┐ рд╣рдо bfcache рдХреЛ рдмрд╣реБрдд рдХрдо рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХрд┐рд╕реА рдПрдХ рдбреЗрдореЛ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдореВрд▓ HL рд╣реЛрдордкреЗрдЬ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмреЗрджрдЦрд▓ рд╣реЛ рдЬрд╛рдП?

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реЗрдмрдПрдХреНрд╕рдЖрд░ рдкреИрдЪ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдлрдкреАрдПрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЫрд╡рд┐ рд╕реНрдерд┐рд░рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд┐рд▓реНрдб рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЪреЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХ рдЯреВ рдмреИрдХ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВред

diff --git a/webxr/openxr/mod.rs b/webxr/openxr/mod.rs
index 91c78da..a6866de 100644
--- a/webxr/openxr/mod.rs
+++ b/webxr/openxr/mod.rs
@@ -416,11 +416,30 @@ impl DeviceAPI<Surface> for OpenXrDevice {
     }

     fn wait_for_animation_frame(&mut self) -> Option<Frame> {
-        if !self.handle_openxr_events() {
-            // Session is not running anymore.
-            return None;
+        loop {
+            if !self.handle_openxr_events() {
+                // Session is not running anymore.
+                return None;
+            }
+            self.frame_state = self.frame_waiter.wait().expect("error waiting for frame");
+
+            // XXXManishearth this code should perhaps be in wait_for_animation_frame,
+            // but we then get errors that wait_image was called without a release_image()
+            self.frame_stream
+                .begin()
+                .expect("failed to start frame stream");
+                
+            if self.frame_state.should_render {
+                break;
+            }
+            
+            self.frame_stream.end(
+                self.frame_state.predicted_display_time,
+                EnvironmentBlendMode::ADDITIVE,
+                &[],
+            ).unwrap();
         }
-        self.frame_state = self.frame_waiter.wait().expect("error waiting for frame");
+
         let time_ns = time::precise_time_ns();
         // XXXManishearth should we check frame_state.should_render?
         let (_view_flags, views) = self
@@ -506,12 +525,6 @@ impl DeviceAPI<Surface> for OpenXrDevice {
             0,
         );

-        // XXXManishearth this code should perhaps be in wait_for_animation_frame,
-        // but we then get errors that wait_image was called without a release_image()
-        self.frame_stream
-            .begin()
-            .expect("failed to start frame stream");
-
         self.left_image = self.left_swapchain.acquire_image().unwrap();
         self.left_swapchain
             .wait_image(openxr::Duration::INFINITE)

@manishearth рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдпрд╣ рдореЗрд░рд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ рдХрд┐ рдореИрдВ https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#Session рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдореЙрдбрд▓ рдХреЗ рдХрд░реАрдм

рд╣рд╛рдБ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм begin() рдХреЛ waf рдореЗрдВ рдКрдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдЕрдм рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ FPS рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкреАрдЫрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ред рдЕрдЧрд░ рдпрд╣ рд╕реНрдерд┐рд░рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ!

рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦреЛрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреБрд╢! рд╕рд░реНрдлрдореИрди рдХреЙрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреНрд░реЗрдо рдмрдЬрдЯ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓реЗрддреА рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВред

рд╣рд╛рдВ, рдкреБрди: рдЕрдХреНрд╖рдо рдХрд░рдирд╛ js.ion.enabled , рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдн рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрдм рд╣рдо рд░реИрдо рднреВрдЦреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЬреАрд╕реА'рдЗрдВрдЧ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреБрди: рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдирдП рдПрд╕рдПрдо рдХреЗ рд╕рд╛рде рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред IIRC, 66-рдпреБрдЧ рдХреЗ ARM64 рдмреИрдХрдПрдВрдб рдореЗрдВ рднреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЦрд░рд╛рдм рдмреЗрд╕рд▓рд╛рдЗрди JIT рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдерд╛; рд╣рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб рднрд░ рдореЗрдВ рд╕реНрдкреАрдбрдЕрдк рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реИрдо-рдЧрд╣рди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ред

рдХреБрдВрдЬреА рд╡рд╛рд▓реЗ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдирдпрд╛ рдПрдВрдЧрд▓ рдкреИрдХреЗрдЬ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдореИрдВ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдКрдВрдЧрд╛ред

рдореИрдВрдиреЗ рдПрдХреНрд╕рдЖрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╕рднреА рдУрдкрдирдПрдХреНрд╕рдЖрд░ рд╕реНрд╡реИрдкрдЪреИрди рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рддрд╣ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рд╕рддрд╣ рдкрд░ eglCreatePbufferFromClientBuffer рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рдореБрдЦреНрдп рдереНрд░реЗрдб рдкрд░ рдЕрднреА рднреА рд╕рдордп рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рд╡реЗрдмрдЧреНрд▓ рдереНрд░реЗрдб рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрди рд╕рддрд╣ рдмрдирд╛рд╡рдЯ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛ рддрд╛рдХрд┐ рдпрджрд┐ рд╣рдо рд╡рд╣реА рд╕рддрд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЙрдирдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...

рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдореБрдЦреНрдп рдереНрд░реЗрдб CPU рдЙрдкрдпреЛрдЧ render_animation_frame рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ OpenXR рд░рдирдЯрд╛рдЗрдо рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди BlitFramebuffer рдФрд░ FramebufferTexture2D рдХреЛ рдХреЙрд▓ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд╣реА рдмрдирд╛рд╡рдЯ рдореЗрдВ рджреЛрдиреЛрдВ рдЖрдВрдЦреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдлрд╣рд░рд╛рдиреЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ https://github.com/microsoft/OpenXR-SDK-VisualStudio/#render -with-texture-array-and-vprt рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдмрдирд╛рд╡рдЯ рд╕рд░рдгреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рд╣рдо рджреЛрдиреЛрдВ рдЖрдБрдЦреЗрдВ рдПрдХ рд╕рд╛рде рдлреВрдБрдХ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо
рддрдм рдЕрдкрдирд╛ рджреЛрд╖ рд╕реНрд╡рдпрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмрдирд╛рд╡рдЯ рд╕рд░рдгреА рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рд╣реИред рд▓реЗрдХрд┐рди
рдПрдХ рд╢реЙрдЯ рдХреЗ рд▓рд╛рдпрдХ, рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рд╡реНрдпреВ рдПрдкреАрдЖрдИ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдореБрдЦреНрдп рдереНрд░реЗрдб рдПрдВрдЧрд▓ рдЯреНрд░реИрдлрд┐рдХ рдХреЗ рд▓рд┐рдП, рдЖрд░рдПрдПрдл рд▓реВрдк рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ
рдХреИрдирд╡рд╛рд╕ рдХреЛ рдЧрдВрджрд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж? рдЕрдм рддрдХ рдЗрд╕рдиреЗ рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ
рд╢реЙрдЯ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рдореБрдЦреНрдп рдкрд░ рдХреБрдЫ рднреА рд▓реЗрдЖрдЙрдЯ/рдкреНрд░рддрд┐рдкрд╛рджрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдзрд╛рдЧрд╛ред

рд╕реЛрдо, 6 рдЬрдирд╡рд░реА, 2020, 11:49 рдЕрдкрд░рд╛рд╣реНрди рдХреЛ рдЬреЛрд╢ рдореИрдереНрдпреВрдЬ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдореБрдЦреНрдп рдереНрд░реЗрдб CPU рдЙрдкрдпреЛрдЧ render_animation_frame рд╕реЗ рдЖрддрд╛ рд╣реИ, рдХреЗ рд╕рд╛рде
рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рддрд╣рдд рд▓реЗрдХрд┐рди рдмреНрд▓рд┐рдЯрдлреНрд░реЗрдордмрдлрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░
FramebufferTexture2D рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред рдореИрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ
рдЕрдЧрд░ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛрдиреЛрдВ рдЖрдБрдЦреЛрдВ рдХреЛ рдлрдБрд╕рд╛рдирд╛ рдПрдХ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛
рдмрдирд╛рд╡рдЯ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдмрдирд╛рд╡рдЯ рд╕рд░рдгреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ
рдореЗрдВ
https://github.com/microsoft/OpenXR-SDK-VisualStudio/#render -with-texture-array-and-vprt
.

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/servo/servo/issues/25425?email_source=notifications&email_token=AAMK6SBRH72JGZMXTUKOXETQ4NY37A5CNFSM4KCRI6AKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJ0204P рдореБрджреНрджрд╛
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAMK6SECM6MDNZZ6Y7VL7SDQ4NY37ANCNFSM4KCRI6AA
.

рдХреИрдирд╡рд╛рд╕ рдХреЛ рдЧрдВрджрд╛ рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕рд╛рдл рд╣реЛрддреА рд╣реИ; рдпрд╣ рдПрдХ рд╕рд╛рд░реНрдердХ рдПрдлрдкреАрдПрд╕ рд╡реГрджреНрдзрд┐ рдХреА рдУрд░ рдирд╣реАрдВ рд▓реЗ рдЧрдпрд╛ред

рдореИрдВрдиреЗ рд╡реЗрдмрдЧреНрд▓ рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдУрдкрдирдПрдХреНрд╕рдЖрд░ рд╕реНрд╡реИрдкрдЪреЗрди рдмрдирд╛рд╡рдЯ рд╕реЗ рд╕рддрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рддрд╣ рдмрдирд╛рд╡рдЯ рдХрд╛ рдХреИрд╢ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдЬрдмрдХрд┐ eglCreatePbufferFromClientBuffer рд╕рдордп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛, рдореБрдЭреЗ рдХреЛрдИ рд╕рд╛рд░реНрдердХ рдПрдлрдкреАрдПрд╕ рдкрд░рд┐рд╡рд░реНрддрди рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдпрд╛ред

рдЗрдорд░реНрд╕рд┐рд╡ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдХреА рдЬрд╛рдирдХрд╛рд░реА (рдПрдордПрд╕ рдореЗрдВ рд╕рднреА рдорд╛рдк):

Name            min             max             avg
raf queued      0.070833        14.010261       0.576834
<1ms: 393
<2ms: 28
<4ms: 5
<8ms: 1
<16ms: 2
<32ms: 0
32+ms: 0

raf transmitted 0.404270        33.649583       7.403302
<1ms: 123
<2ms: 43
<4ms: 48
<8ms: 48
<16ms: 95
<32ms: 69
32+ms: 3

raf wait        1.203500        191.064100      17.513593
<1ms: 0
<2ms: 17
<4ms: 98
<8ms: 95
<16ms: 48
<32ms: 69
32+ms: 101

raf execute     3.375000        128.663200      6.994588
<1ms: 0
<2ms: 0
<4ms: 5
<8ms: 351
<16ms: 70
<32ms: 1
32+ms: 2

raf receive     0.111510        8.564010        0.783503
<1ms: 353
<2ms: 52
<4ms: 18
<8ms: 4
<16ms: 1
<32ms: 0
32+ms: 0

raf render      2.372200        75.944000       4.219310
<1ms: 0
<2ms: 0
<4ms: 253
<8ms: 167
<16ms: 8
<32ms: 0
32+ms: 1

receive : рдПрдХреНрд╕рдЖрд░ рдлреНрд░реЗрдо рд╕реЗ рдЖрдИрдкреАрд╕реА рд░рд╛рдЙрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЖрд░ рдереНрд░реЗрдб рд╕реЗ рднреЗрдЬреА рдЬрд╛ рд░рд╣реА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╕рдордп
queued : IPC рд░рд╛рдЙрдЯрд░ рд╕реЗ рдлреНрд░реЗрдо рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп XRSession::raf_callback рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рддрдХ
execute : XRSession рд╕реЗ рд╕рдордп :: raf_callback рд╡рд┐рдзрд┐ рд╕реЗ рд▓реМрдЯрдиреЗ рддрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛
transmitted : рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдереНрд░реЗрдб рд╕реЗ рдирдП rAF рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рд╕реЗ рд▓реЗрдХрд░ XR рдереНрд░реЗрдб рддрдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдХрд╛ рд╕рдордп
render : render_animation_frame рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рд╕рддрд╣ рдХреЛ рд░реАрд╕рд╛рдпрдХрд▓ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп
wait : wait_for_animation_frame рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп (рдЗрд╕ рдЕрдВрдХ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдкреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛ рдлреНрд░реЗрдо рдкрд░ рд▓реВрдк рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╕рддреНрд░ рдХреЗ рджреМрд░рд╛рди рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг рд╣реЛрддрд╛ рд╣реИред

рдЙрд╕ рд╕рдордп рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ - transmitted рд╢реНрд░реЗрдгреА рдЬрд┐рддрдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдЖрд░рдПрдПрдл рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рдПрдХреНрд╕рдЖрд░ рдереНрд░реЗрдб рдХреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рд╣реИ рдЬреЛ рдкреВрд░реНрдг рдлреНрд░реЗрдо рдХреЛ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдХреЗ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдмреНрд▓рд┐рдЯ рдХрд░рддрд╛ рд╣реИред рдХрд╛рдлреА рднрд┐рдиреНрдирддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдпрд╛ рддреЛ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИ, рдпрд╛ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЬрдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд▓ https://github.com/servo/webxr/issues/113 рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдЪрд╛рд░ рд╕рдордп рдХреЛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдореЗрдВ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдкрд░ рдкреНрд░рд╣рд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдЖ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдмрддрд╛рдпрд╛ рдЬрд╛рдП рдХрд┐ рдзрд╛рдЧрд╛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИ рдпрд╛ рд╕реЛ рд░рд╣рд╛ рд╣реИред

рдПрдХ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ:

swap buffer     1.105938        28.193698       2.154793
<1ms: 0
<2ms: 273
<4ms: 110
<8ms: 15
<16ms: 2
<32ms: 2
32+ms: 0

swap complete   0.053802        4.337812        0.295064
<1ms: 308
<2ms: 9
<4ms: 6
<8ms: 1
<16ms: 0
<32ms: 0
32+ms: 0

swap request    0.003333        24033027.355364 4662890.724805
<1ms: 268
<2ms: 49
<4ms: 5
<8ms: 0
<16ms: 0
<32ms: 1
32+ms: 79

рдпреЗ рд╕рдордп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ 1) рд╕реНрд╡реИрдк рдмрдлрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рджреЗрд░реА рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рд╡реЗрдмрдЧреНрд▓ рдереНрд░реЗрдб рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, 2) рдмрдлрд╝рд░реНрд╕ рдХреЛ рд╕реНрд╡реИрдк рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп, 3) рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рджреЗрд░реА рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рд╕реНрд╡реИрдкрд┐рдВрдЧ рддрдм рддрдХ рдкреВрд░реНрдг рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдзрд╛рдЧрд╛ред рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ ( swap request рд╢реНрд░реЗрдгреА рдореЗрдВ рдЙрди рдЕрдЬреАрдм рдЖрдЙрдЯрд▓реЗрд░реНрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд▓реЗрдХрд┐рди рд╡реЗ рд╕реЗрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди рдЗрдорд░реНрд╕рд┐рд╡ рд╕рддреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдлрд░ рд╕реНрд╡реИрдкрд┐рдВрдЧ рд▓рдЧрд╛рддрд╛рд░ 1-4ms рдХреЗ рдмреАрдЪ рд╣реЛрддреА рд╣реИред

рдХреБрдЫ openxr рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж #117 рджрд╛рдпрд░ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЛрдХреЗрдЯ_рд╡реНрдпреВ рдХреЙрд▓ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред

рд╕рдВрднрд╡рддрдГ https://github.com/servo/webxr/issues/117

рдЙрд╕ рд╕рдордп рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ - рдкреНрд░реЗрд╖рд┐рдд рд╢реНрд░реЗрдгреА рдЬрд┐рддрдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдЖрд░рдПрдПрдл рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рдПрдХреНрд╕рдЖрд░ рдереНрд░реЗрдб рдХреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рд╣реИ рдЬреЛ рдкреВрд░реНрдг рдлреНрд░реЗрдо рдХреЛ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдХреЗ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдмреНрд▓рд┐рдЯ рдХрд░рддрд╛ рд╣реИред рдХрд╛рдлреА рднрд┐рдиреНрдирддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реБрдП рдХрд┐ рдпрд╛ рддреЛ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИ, рдпрд╛ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЬрдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

transmitted рдорд╛рди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ, рдпрд╣ run_one_frame рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдореЗрдВ рдЬреБрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕рддреНрд░ рдореБрдЦреНрдп-рдереНрд░реЗрдб рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реЛ (рдЬреЛ рдпрд╣ рдЙрди рдорд╛рдкреЛрдВ рдореЗрдВ рд╣реИ, рд╣реИ рдирд╛?) , рджреЗрдЦреЗрдВ https://github.com/servo/webxr/blob/c6abf4c60d165ffc978ad2ebd6bcddc3c21698e1/webxr-api/session.rs#L275

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм RenderAnimationFrame рд╕рдВрджреЗрд╢ (рдХреЙрд▓рдмреИрдХ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рднреЗрдЬрд╛ рдЧрдпрд╛) рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдк "рдлрд╛рд╕реНрдЯ рдкрд╛рде" рд╣рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЯрд╛рдЗрдордЖрдЙрдЯ рдЫреВрдЯ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╕рд░реНрд╡реЛ рджреВрд╕рд░реЗ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ perform_updates рдХрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рдФрд░ "рдПрдХ рдФрд░ рдлреНрд░реЗрдо рдЪрд▓рд╛рдирд╛" рдЪрдХреНрд░ рдореЗрдВ рдХрд╛рдлреА рджреЗрд░ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, compositor.perform_updates рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрд┐рд╕реЗ servo.handle_events рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдлреА рджреЗрд░ рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХреНрд╕рдЖрд░ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдзрд╛рдЧреЗ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рд╕реЗ рдХрдо, рдпрд╣ рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдореВрд▓реНрдп рдФрд╕рдд рдореВрд▓реНрдп рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЦреНрдп-рдереНрд░реЗрдб рдкрд░ рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХ рд╕рд╛рдорд╛рди рдХреЛ рднреВрдЦрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред

рдореИрдВрдиреЗ https://github.com/servo/webxr/issues/113 рдореЗрдВ рдореБрдЦреНрдп рдереНрд░реЗрдб рд╕реЗ openxr рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдкреНрд░рдЧрддрд┐ рдХреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдЙрд╕ рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдФрд░ рдорд╛рдк рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЙрдкрдпреЛрдЧреА рдкреНрд░реЛрдлрд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рддрдХрдиреАрдХ:

  • рдПрдХ .servobuild рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ rustflags = "-C force-frame-pointers=yes"
  • рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рди рдХрд░реЗрдВ
  • MS рдЯреАрдореЛрдВ рд╕реЗ WinXR_Perf.wprp рдХрд╛ рдЙрдкрдпреЛрдЧ HL рдбрд┐рд╡рд╛рдЗрд╕ рдкреЛрд░реНрдЯрд▓ рдореЗрдВ "рдкреНрд░рджрд░реНрд╢рди рдЯреНрд░реЗрд╕рд┐рдВрдЧ" рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдХрд╕реНрдЯрдо рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ Files рдЯреИрдм рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВ
  • --features profilemozjs рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ

рдпреЗ рдирд┐рд╢рд╛рди (рдбрд┐рд╡рд╛рдЗрд╕ рдкреЛрд░реНрдЯрд▓ рдореЗрдВ "рд╕реНрдЯрд╛рд░реНрдЯ рдЯреНрд░реЗрд╕" рд╕реЗ рдкреНрд░рд╛рдкреНрдд) рд╡рд┐рдВрдбреЛрдЬ рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдПрдирд╛рд▓рд╛рдЗрдЬрд░ рдЯреВрд▓ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдВрдЧреЗред рдпрд╣ рдЙрдкрдХрд░рдг рдереНрд░реЗрдб рдирд╛рдо рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ CPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдб рд╕реНрдЯреИрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рд╣реЛрддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдлреНрд░реЗрдо рдХреЗ рд╕рдордп рд╡рд┐рддрд░рдг рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  • WPA рдореЗрдВ "рд╕рд┐рд╕реНрдЯрдо рдЧрддрд┐рд╡рд┐рдзрд┐ -> рд╕рд╛рдорд╛рдиреНрдп рдИрд╡реЗрдВрдЯ" рджреГрд╢реНрдп рдЬреЛрдбрд╝реЗрдВ
  • рдХреЗрд╡рд▓ Microsoft.Windows.WinXrContinuousProvider рд╢реНрд░реГрдВрдЦрд▓рд╛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ
  • рдПрдХ рдЫреЛрдЯреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╝реВрдо рдЗрди рдХрд░реЗрдВ, рдлрд┐рд░ рдЬрд╝реВрдо рдЗрди рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдПрдХ xrBegin рдИрд╡реЗрдВрдЯ рджреГрд╢реНрдп рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╣реЛ, рдФрд░ рдПрдХ xrEnd рдИрд╡реЗрдВрдЯ рджреГрд╢реНрдп рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╣реЛ

CPU рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдЪрд╛рд░:

  • CPU рдЙрдкрдпреЛрдЧ (рдирдореВрдирд╛) -> рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдереНрд░реЗрдб, рд╕реНрдЯреИрдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ (рдХреЗрд╡рд▓ рд╕рд░реНрд╡реЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ, рдлрд┐рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓рдо рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ)
  • рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рд▓реМ, рдвреЗрд░ (рдХреЗрд╡рд▓ рд╕рд░реНрд╡реЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ)

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдереНрд░реЗрдб рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛:

  • XRView::new рд╕рднреА рд╕рд░реНрд╡реЛ CPU рдХрд╛ 0.02% рдЦрдкрдд рдХрд░рддрд╛ рд╣реИ
  • рдЪреВрдВрдХрд┐ рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рддрдм рддрдХ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ FrameUpdateEvent::UpdateViews рдИрд╡реЗрдВрдЯ (рдЬреЛ рд╕рддреНрд░::update_clip_planes рд╕реЗ XRSession::UpdateRenderState рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрддрд╛ рд╣реИ) рди рд╣реЛ, рд╣рдо XRSession рдкрд░ XRView рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдХреИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рддрдХ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд░реЗрдВрдбрд░ рд╕реНрдЯреЗрдЯ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
  • рд╣рдо XRSession рдореЗрдВ рдХреИрд╢ рдХреА рдЧрдИ рджреГрд╢реНрдп рд╕реВрдЪреА рдХреЗ JS рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рднреА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреЛрдЬрд╝ рдХреЗ рджреГрд╢реНрдп рд╕рджрд╕реНрдп рдХреЛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, XRView рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ JS рд╡реИрд▓реНрдпреВ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред

рдЗрдорд░реНрд╕рд┐рд╡ рдлреНрд░реЗрдо рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╕рдордп рдХрдо рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛:

  • GL рдФрд░ d3d рдореЗрдВ рдЙрд▓реНрдЯреЗ Y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рдгрд╛рд▓рд┐рдпрд╛рдБ рд╣реИрдВ
  • рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ рдХреБрдЫ рдХрд╛рдо рдХрд░рдХреЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп ANGLE рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЫреБрдкрд╛рддрд╛ рд╣реИ
  • рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб рдХреЗ рд▓рд┐рдП, рд╣рдо GL рдЯреЗрдХреНрд╕рдЪрд░ рдбреЗрдЯрд╛ рдХреЛ d3d рдкрд░ рдмреНрд▓рд┐рдЯ рдХрд░рддреЗ рд╕рдордп y-рдЗрдирд╡рд░реНрдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП glBlitFramebuffer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
  • рдЕрдЧрд░ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ANGLE рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рддреЛ рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЧреИрд░-рдЗрдорд░реНрд╕рд┐рд╡ рд╡реЗрдм рдкреЗрдЬреЛрдВ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд y-invert рдмреНрд▓рд┐рдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╡реЗрдмрд░реЗрдиреНрдбрд░ рд╡рд┐рдХрд▓реНрдк surface_origin_is_top_left ) рдЬрдмрдХрд┐ рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдХреЗ рдмреНрд▓рд┐рдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

https://bugzilla.mozilla.org/show_bug.cgi?id=1591346 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдФрд░ jrmuizel рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  • рдЙрд╕ рд╡рд┐рдВрдбреЛ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ d3d рд╕реНрд╡реИрдкрдЪреИрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЧреИрд░-рдЗрдорд░реНрд╕рд┐рд╡ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдпрд╣ XAML рдРрдк рдореЗрдВ SwapChainPanel рд╣реЛрдЧрд╛)
  • рдЗрд╕реЗ рдПрдХ рдИрдЬреАрдПрд▓ рдЫрд╡рд┐ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ (https://searchfox.org/mozilla-central/rev/c52d5f8025b5c9b2b4487159419ac9012762c40c/gfx/webrender_bindings/RenderCompositorANGLE.cpp#554)
  • рдЬрдм рд╣рдо рдореБрдЦреНрдп рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрд╡реИрдкрдЪреИрди рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ
  • https://github.com/servo/servo/blob/master/support/hololens/ServoApp/ServoControl/OpenGLES.cpp#L205 -L208 рдореЗрдВ eglCreateWindowSurface рдФрд░ eglSwapBuffers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ

рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЫрд┐рдкрдХрд▓реА рдХреЛрдб: https://searchfox.org/mozilla-central/rev/c52d5f8025b5c9b2b4487159419ac9012762c40c/gfx/webrender_bindings/RenderCompositorANGLE.cpp#192
рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреЛрдг рдХреЛрдб: https://github.com/google/angle/blob/df0203a9ae7a285d885d7bc5c2d4754fe8a59c72/src/libANGLE/renderer/d3d/d3d11/winrt/SwapChainPanelNativeWindow.cpp#L244

рд╡рд░реНрддрдорд╛рди рд╡рд╛рдЗрдк рд╢рд╛рдЦрд╛рдПрдВ:

рдЗрд╕рдореЗрдВ рдПрдХ xr-profile рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рд╕рдордп рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ, рд╕рд╛рде рд╣реА рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб рдореЗрдВ y-рдЙрд▓рдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП ANGLE рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдиреЙрди-рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд░реЗрдВрдбрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб рдЙрд▓реНрдЯрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореБрдЭреЗ рдЬреАрдПрд▓ рдХреЛрдб рдХреЛ рд░реЗрдВрдбрд░_рдПрдиреАрдореЗрд╢рди_рдлреНрд░реЗрдо рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдЬреАрдПрд▓ рд╕рддрд╣ рд╕реЗ рд╢реЗрдпрд░ рд╣реИрдВрдбрд▓ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рд╕реАрдзреЗ рдХреЙрдкреАрд╕рдмрд░реНрд╕рд╕реЛрд░реНрд╕ рд░реАрдЬрди рдХреЙрд▓ рд╕реЗ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕рдХреА рдбреА 3 рдбреА рдмрдирд╛рд╡рдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреВрдВред

рдПрдВрдЧрд▓ рд╡рд╛рдИ-рдЗрдирд╡рд░реНрдЬрди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП https://github.com/servo/servo/issues/25582 рдлрд╛рдЗрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛; рдЙрд╕ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрджреНрдпрддрди рдЙрд╕ рдЕрдВрдХ рдореЗрдВ рд╣реЛрдВрдЧреЗред

рдЕрдЧрд▓рд╛ рдмрдбрд╝рд╛ рдЯрд┐рдХрдЯ рдЖрдЗрдЯрдо openxr webxr рдмреИрдХрдПрдВрдб рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ glBlitFramebuffer рдХреЙрд▓ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

  • рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдлреНрд░реЗрдордмрдлрд╝рд░реНрд╕ рдмрдирд╛рдирд╛ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╡реЗрдмрдЧреНрд▓ рдлреНрд░реЗрдордмрдлрд╝рд░реНрд╕ рд╕реЗ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реЛрдВ
  • рдПрдХ рд╡реЗрдмрдЧреНрд▓ рдореЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рд╡реЗрдмрдПрдХреНрд╕рдЖрд░ рдмреИрдХрдПрдВрдб рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рднреА рд╕реНрд╡реИрдкрдЪреЗрди рд╕рддрд╣ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/asajeffrey/surfman-chains/blob/27a7ab8fec73f19f0c4252ff7ab52e84609e1fa5/surfman-chains/lib.rs#L458 рдореЗрдВред рдФрд░ https://github.com/asajeffrey/surfman-chains/blob/27a7ab8fec73f19f0c4252ff7ab52e84609e1fa5/surfman-chains/lib.rs#L111-L118)

рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрдлрдореИрди рдХреЗрд╡рд▓ рдЙрд╕ рд╕рдВрджрд░реНрдн рддрдХ рд▓реЗрдЦрди рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рд╕рддрд╣ рдмрдирд╛рдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╕рддрд╣ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рддреЛ рдпрд╣ рд╡реЗрдмрдЬреАрдПрд▓ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред https://github.com/pcwalton/surfman/blob/a515fb2f5d6b9e9b36ba4e8b498cdb4bea92d330/surfman/src/device.rs#L95 -L96

рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ - рдЕрдЧрд░ рд╣рдордиреЗ рд╡реЗрдмрдЧреНрд▓ рдереНрд░реЗрдб рдореЗрдВ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдХреЗ рдЯреЗрдХреНрд╕рдЪрд░ рдХреЛ рд╕реАрдзреЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдереНрд░реЗрдбрд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЕрдм рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА (рдпрд╛рдиреАред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:

  • рдЕрднреА рднреА рдПрдХ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдереНрд░реЗрдб рд╣реИ рдЬреЛ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдПрдХ рдПрдиреАрдореЗрд╢рди рдлреНрд░реЗрдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдПрдХ рдирдпрд╛ рдлреНрд░реЗрдо рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ
  • рдлрд╝реНрд░реЗрдо рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдереНрд░реЗрдб рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдиреАрдореЗрд╢рди рдХреЙрд▓рдмреИрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ xr рдкрд░рдд рдХреЗ рдлрд╝реНрд░реЗрдордмрдлрд╝рд░ рдХреЛ рд╕реНрд╡реИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдЧреНрд▓ рдереНрд░реЗрдб рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ
  • рдЬрдм рдпрд╣ рд╕реНрд╡реИрдк рд╕рдВрджреЗрд╢ рд╡реЗрдмрдЧреНрд▓ рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдВрддрд┐рдо рдЕрдзрд┐рдЧреНрд░рд╣реАрдд рдУрдкрдирдПрдХреНрд╕рдЖрд░ рд╕реНрд╡реИрдкрдЪреИрди рдЫрд╡рд┐ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ, рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдереНрд░реЗрдб рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╕реНрд╡реИрдкрдЪреИрди рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ

https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#threading -behavior рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╣рдорд╛рд░реЗ рдЧреИрд░-рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХрд▓реНрдкрдирд╛ рд╕реЗ: "рдЬрдмрдХрд┐ xrBeginFrame рдФрд░ xrEndFrame рдХреЛ рдПрдХ рд╣реА рдереНрд░реЗрдб рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдб рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред"

рдлрд┐рд▓рд╣рд╛рд▓ рдПрдХреНрд╕рдЖрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдереНрд░реЗрдбреНрд╕ рдФрд░ рд╡реЗрдмрдЬреАрдПрд▓ рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╕реАрдзрд╛ рд╕рдВрдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рдпрд╛ рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рдЙрдирдХреА рд╕рд╛рдЭрд╛ рд╕реНрд╡реИрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рд╕реНрд╡реИрдк-рдЪреЗрди рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рд▓реБрддреНрдл рдЙрдард╛рдКрдВрдЧрд╛ рдЬреЛ рд╕рд░реНрдлрдореИрди рд╕реНрд╡реИрдк рдЪреЗрди рдпрд╛ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рд╕реНрд╡реИрдк рдЪреЗрди рдХреЗ рдКрдкрд░ рдмреИрдарддрд╛ рд╣реИ, рдФрд░ рд╡реЗрдмрдЧреНрд▓-рдЯреВ-рдУрдкрдирдПрдХреНрд╕рдЖрд░ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рдХреЗ рд╕рдордп рдХреЗ рдорд╛рдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рддрдЪреАрдд рдХреЗ рдиреЛрдЯреНрд╕:

* concerns about wait time - why?????
* figure out time spent in JS vs. DOM logic
* when does openxr give us should render=false frames - maybe related to previous frame taking too long
* are threads being scheduled on inappropriate cpus? - on magic leap, main thread (including weber) pinned to big core.
* when one of the measured numbers is large, is there correlation with other large numbers?
* probably should pin openxr thread, running deterministic code
* consider clearing after telling script that the swap is complete - measure if clear is taking significant time in swap operation
* consider a swap chain API operation - тАЬwait until a buffer swap occursтАЭ
  - block waiting on swapchain
  - block waiting on swapchain + timeout
  - async????????
- a gc would look like a spike in script execution time

рдЙрди рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #25735 рдлрд╝рд╛рдЗрд▓ рдХреА рдЧрдИ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рд╕реАрдзреЗ openxr рдмрдирд╛рд╡рдЯ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЕрдиреНрдп рдЗрдВрдЬрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╛рдЗрдбрд░рдореЛрдирдХреА рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреЗрдПрд╕ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдвреВрдВрдврдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд░реНрд╡реЛ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡реЛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдПрдЬ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдо рдЗрдорд░реНрд╕рд┐рд╡ рдореЛрдб рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рджреЛрдиреЛрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдмреЗрдмреАрд▓реЛрди рдбреЗрдореЛ рдкрд░ рдЬрд╛рдХрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдЖрдЧрд╛рдореА рд╕реНрдкрд╛рдЗрдбрд░рдордВрдХреА рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рднреА рджреЗрдЧрд╛ред

рдХреБрдЫ рдирдпрд╛ рдбреЗрдЯрд╛ред рдпрд╣ рдПрдВрдЧрд▓ рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рд╕рд╛рде рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдИрдкреАрд╕реА рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред

$ python timing.py raw
Name        min     max     mean
raf queued  0.056198    5.673125    0.694902
<1ms: 335
<2ms: 26
<4ms: 17
<8ms: 7
<16ms: 0
<32ms: 0
32+ms: 0

raf transmitted 0.822917    36.582083   7.658619
<1ms: 1
<2ms: 4
<4ms: 31
<8ms: 181
<16ms: 158
<32ms: 8
32+ms: 1

raf wait    1.196615    39.707709   10.256875
<1ms: 0
<2ms: 32
<4ms: 93
<8ms: 67
<16ms: 107
<32ms: 68
32+ms: 17

raf execute 3.078438    532.205677  7.752839
<1ms: 0
<2ms: 0
<4ms: 37
<8ms: 290
<16ms: 52
<32ms: 2
32+ms: 3

raf receive 0.084375    9.053125    1.024403
<1ms: 276
<2ms: 71
<4ms: 27
<8ms: 9
<16ms: 1
<32ms: 0
32+ms: 0

swap request    0.004115    73.939479   0.611254
<1ms: 369
<2ms: 10
<4ms: 5
<8ms: 0
<16ms: 0
<32ms: 0
32+ms: 2

raf render  5.706198    233.459636  9.241698
<1ms: 0
<2ms: 0
<4ms: 0
<8ms: 183
<16ms: 190
<32ms: 10
32+ms: 1

run_one_frame   7.663333    2631.052969 28.035143
<1ms: 0
<2ms: 0
<4ms: 0
<8ms: 3
<16ms: 157
<32ms: 185
32+ms: 41

swap buffer 0.611927    8.521302    1.580279
<1ms: 127
<2ms: 169
<4ms: 74
<8ms: 15
<16ms: 1
<32ms: 0
32+ms: 0

swap complete   0.046511    2.446302    0.215040
<1ms: 375
<2ms: 6
<4ms: 3
<8ms: 0
<16ms: 0
<32ms: 0
32+ms: 0

рд╕рдордп рдбреЗрдЯрд╛: https://gist.github.com/Manishearth/825799a98bf4dca0d9a7e55058574736

image

рдЗрд╕рдХрд╛ рдЕрдЪреНрдЫрд╛ рдбреЗрдЯрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдПрдХ рд╕реНрдЯреИрдХреНрдб рд▓рд╛рдЗрди рдЧреНрд░рд╛рдл рдЖрджрд░реНрд╢ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ run_one_frame рдкрд╣рд▓реЗ рд╕реЗ рдорд╛рдкреЗ рдЧрдП рдХрдИ рд╕рдордп рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред рдЧреНрд░рд╛рдлрд╝ рдСрд░реНрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдлреАрд▓ рдХрд░рдирд╛ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓рдо рд░рдЦрдирд╛ рдорджрджрдЧрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдкрдХреЛ рдХреБрдЫ рдмрд╣реБрдд рдмрдбрд╝реЗ рдЖрдЙрдЯрд▓реЗрд░реНрд╕ рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП Y рдЕрдХреНрд╖ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рддреЗрдВ:

  • рд╕рдордп рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЬреНрдпрд╛рджрд╛рддрд░ рд╕реНрдерд┐рд░ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдмрдбрд╝реЗ рд╕реНрдкрд╛рдЗрдХреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рд╕реНрдкрд╛рдЗрдХреНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдмрдбрд╝реЗ рд╕реНрдкрд╛рдЗрдХреНрд╕ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдзреАрдорд╛ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рд╕реЗ рдЖрддреЗ рд╣реИрдВ
  • рд╕рдВрдЪрд╛рд░рдг рд╕рдордп рд╕рдордЧреНрд░ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд╣рд╕рдВрдмрджреНрдз рд▓рдЧрддрд╛ рд╣реИ
  • рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдордп рднреА рдХрд╛рд░рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рд╕рдордЧреНрд░ рдЖрдХрд╛рд░ рдРрд╕рд╛ рд╣реИ, рдпрд╣ _very_ рд▓рд╣рд░рджрд╛рд░ . рд╣реИ

рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐: IPC рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, FPS рдЕрдм 55 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдордБрдбрд░рд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдХрднреА-рдХрднреА рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЛ рд╣рд┐рд▓рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ 45 рд╕реЗ рдиреАрдЪреЗ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, _except_ рд▓реЛрдб рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рдХреБрдЫ рд╕реЗрдХрдВрдб рдХреЗ рджреМрд░рд╛рди (рдЬрд╣рд╛рдБ рдпрд╣ 30 рддрдХ рдиреАрдЪреЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рдЬрдм рдпрд╣ рдкрд╣рд▓реЗ рдПрдХ рд╣рд╛рде рджреЗрдЦрддрд╛ рд╣реИ (рдЬрдм рдпрд╣ рдиреАрдЪреЗ 20 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдкреЗрдВрдЯ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо ( рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ ):

Name        min     max     mean
raf queued  0.113854    5.707917    0.441650
<1ms: 352
<2ms: 13
<4ms: 5
<8ms: 1
<16ms: 0
<32ms: 0
32+ms: 0

raf transmitted 0.546667    44.954792   6.886162
<1ms: 4
<2ms: 2
<4ms: 23
<8ms: 279
<16ms: 59
<32ms: 3
32+ms: 1

raf wait    1.611667    37.913177   9.441104
<1ms: 0
<2ms: 6
<4ms: 98
<8ms: 82
<16ms: 135
<32ms: 43
32+ms: 6

raf execute 3.336562    418.198541  7.592147
<1ms: 0
<2ms: 0
<4ms: 11
<8ms: 319
<16ms: 36
<32ms: 2
32+ms: 3

raf receive 0.119323    9.804167    0.806074
<1ms: 324
<2ms: 31
<4ms: 13
<8ms: 1
<16ms: 1
<32ms: 0
32+ms: 0

swap request    0.003646    79.236354   0.761324
<1ms: 357
<2ms: 9
<4ms: 2
<8ms: 0
<16ms: 0
<32ms: 0
32+ms: 3

raf render  5.844687    172.898906  8.131682
<1ms: 0
<2ms: 0
<4ms: 0
<8ms: 283
<16ms: 86
<32ms: 1
32+ms: 1

run_one_frame   8.826198    2577.357604 25.922205
<1ms: 0
<2ms: 0
<4ms: 0
<8ms: 0
<16ms: 176
<32ms: 174
32+ms: 22

swap buffer 0.708177    12.528906   1.415950
<1ms: 164
<2ms: 161
<4ms: 38
<8ms: 4
<16ms: 4
<32ms: 0
32+ms: 0

swap complete   0.042917    1.554740    0.127729
<1ms: 370
<2ms: 1
<4ms: 0
<8ms: 0
<16ms: 0
<32ms: 0
32+ms: 0

рд▓рдВрдмреА рджреМрдбрд╝ ( рдХрдЪреНрдЪрд╛ )ред рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдордВрджреА рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдирд╛рдо рдиреНрдпреВрдирддрдо рдЕрдзрд┐рдХрддрдо рдорд╛рдзреНрдп
raf рдХрддрд╛рд░рдмрджреНрдз 0.124896 6.356562 0.440674
<1ms: 629
<2ms: 13
<4ms: 5
<8ms: 1
<16ms: 0
<32ms: 0
32+рдПрдордПрд╕: 0

рдЖрд░рдПрдПрдл рдкреНрд░реЗрд╖рд┐рдд 0.640677 20.275104 6.944751
<1ms: 2
<2ms: 3
<4ms: 29
<8ms: 513
<16ms: 99
<32ms: 1
32+рдПрдордПрд╕: 0

рд░рд╛рдл рдкреНрд░рддреАрдХреНрд╖рд╛ 1.645886 40.955208 9.386255
<1ms: 0
<2ms: 10
<4ms: 207
<8ms: 114
<16ms: 236
<32ms: 65
32+ рдПрдордПрд╕: 15

рд░рд╛рдл рдирд┐рд╖реНрдкрд╛рджрди 3.090104 526.041198 6.226997
<1ms: 0
<2ms: 0
<4ms: 68
<8ms: 546
<16ms: 29
<32ms: 1
32+ рдПрдордПрд╕: 3

рдЖрд░рдПрдПрдл рдкреНрд░рд╛рдкреНрдд 0.203334 6.441198 0.747615
<1ms: 554
<2ms: 84
<4ms: 7
<8ms: 2
<16ms: 0
<32ms: 0
32+рдПрдордПрд╕: 0

рд╕реНрд╡реИрдк рдЕрдиреБрд░реЛрдз 0.003490 73.644322 0.428460
<1ms: 627
<2ms: 18
<4ms: 1
<8ms: 0
<16ms: 0
<32ms: 0
32+ рдПрдордПрд╕: 2

raf 5.450312 209.662969 8.055021
<1ms: 0
<2ms: 0
<4ms: 0
<8ms: 467
<16ms: 176
<32ms: 3
32+ рдПрдордПрд╕: 1

run_one_frame 8.417291 2579.454948 22.226204
<1ms: 0
<2ms: 0
<4ms: 0
<8ms: 0
<16ms: 326
<32ms: 290
32+ рдПрдордПрд╕: 33

рд╕реНрд╡реИрдк рдмрдлрд░ 0.658125 12.179167 1.378725
<1ms: 260
<2ms: 308
<4ms: 72
<8ms: 4
<16ms: 4
<32ms: 0
32+рдПрдордПрд╕: 0

рд╕реНрд╡реИрдк рдкреВрд░реНрдг 0.041562 5.161458 0.136875
<1ms: 642
<2ms: 3
<4ms: 1
<8ms: 1
<16ms: 0
<32ms: 0
32+рдПрдордПрд╕: 0

рд░реЗрдЦрд╛рдВрдХрди:

рд▓рдВрдмреА рджреМрдбрд╝:

image

рдЫреЛрдЯрд╛ рд░рди:
image

рдмрдбрд╝рд╛ рд╕реНрдкрд╛рдЗрдХ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдЕрдкрдирд╛ рд╣рд╛рде рд╕реЗрдВрд╕рд░ рд░реЗрдВрдЬ рдореЗрдВ рд░рдЦрддрд╛ рд╣реВрдВред

рдЗрд╕ рдмрд╛рд░ рдореИрдВрдиреЗ рдкреНрд░рддреАрдХреНрд╖рд╛/run_one_frame рдмрд╛рд░ рдХреЛ рдКрдкрд░ рд░рдЦрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рджрд╛рдВрддреЗрджрд╛рд░ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдУрдПрд╕ рд╣рдореЗрдВ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рддреЗрдВ:

  • рдкреЗрд╢ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдмрдбрд╝рд╛ рд╕реНрдкрд╛рдЗрдХ рдЬреЗрдПрд╕ рдХреЛрдб (рддреБрд▓рд╕реА рд╣рд░рд╛, "рд░рд╛рдл рд░реЗрдВрдбрд░") рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ
  • рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХрд╛ рд╕рдордп рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИ
  • рдЬрдм рдореИрдВ рдбреНрд░рд╛рдЗрдВрдЧ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдПрдХ рдФрд░ рдЬреЗрдПрд╕ рд╕реНрдкрд╛рдЗрдХ рд╣реЛрддрд╛ рд╣реИ
  • рд░реЗрдВрдбрд░ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХрд╛ рд╕рдордп рдЕрднреА рднреА рдмрдЬрдЯ рдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рднреА рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

    • рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХрд╛ рд╕рдордп рдЗрддрдирд╛ рд▓рдВрдмрд╛ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ https://github.com/servo/webxr/issues/113 рд╣реИ , @jdm рдЗрд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ

    • рд╕рд░реНрдлрдореИрди рдЕрдкрдбреЗрдЯ рд╕реЗ рд░реЗрдВрдбрд░ рд╕рдордп рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рд░реНрдлрдореИрдирдЕрдк рдкрд░ @asajeffrey рдХрд╛ рдорд╛рдкрди рдореЗрд░реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ

    • рд╕рддрд╣ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╕реЗ рд░реЗрдВрдбрд░ рд╕рдордп рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╕рд░реНрдлрдореИрдирдЕрдк рдкрд░ рдЕрд╡рд░реБрджреНрдз)

  • рдПрдХреНрд╕рдЖрд░-рдкреНрд░реЛрдлрд╛рдЗрд▓ рд╕реЗ рдорд╛рдкрддреЗ рд╕рдордп рдбрд┐рд╡рд╛рдЗрд╕ рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдПрдлрдкреАрдПрд╕ рд▓рдЧрднрдЧ рдЖрдзрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рднреА IO рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдмреЙрд▓рд╢реВрдЯрд░ рдХреЗ рд▓рд┐рдП рд╣рд╛рде рджреЗрдЦрдиреЗ рдФрд░ рдлрд┐рд░ рдбреНрд░реЙ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрдореА рдЖрддреА рд╣реИред рд╢рд╛рдпрдж рдкреЗрдВрдЯ рдбреЗрдореЛ рдмрд╣реБрдд рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрдм рд╡рд╣ рдкрд╣рд▓реА рдмрд╛рд░ рд╣рд╛рде рдХреА рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ?

(рдпрд╣ рд╡реЗрдмрдПрдХреНрд╕рдЖрд░ рдЗрдирдкреБрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреЗрдВрдЯ рдбреЗрдореЛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)

@ рдордиреАрд╖рд╛рд░реНрде рдХреНрдпрд╛ рдЖрдк рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рднреА рдУрд╡рд░рд▓реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдШрдЯрдирд╛рдУрдВ рд╕реЗ рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЬреЗрдПрд╕ рдХреЛрдб рдкрд╣рд▓реА рдмрд╛рд░ рд╕рдВрдХрд▓рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдПрдХ рдЯрди рдирдП рдХреЛрдб рдореЗрдВ рдЧрд▓рддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рднреМрддрд┐рдХ рд╕реНрдореГрддрд┐ рд╕реАрдорд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЬреАрд╕реА рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЦрд░реНрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕реНрдореГрддрд┐ рджрдмрд╛рд╡ рджрдмрд╛рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдЧреИрд░-рддреБрдЪреНрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ @nox рдХрд╛ SM рдЕрдкрдбреЗрдЯ рдорджрдж рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЖрд░реНрдЯрд┐рдлреИрдХреНрдЯ рдерд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ FxR Android рдкрд░ рдЗрд╕ SM рдмрд┐рд▓реНрдб рдореЗрдВ рджреЗрдЦрд╛ рдерд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрдореЛрд░реА рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХреНрд╕рдЖрд░-рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдореМрдЬреВрджрд╛ perf рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реИ рдпрд╛ рдирд╣реАрдВред

@ рдордиреАрд╖рд╛рд░реНрде рдХреНрдпрд╛ рдПрдХреНрд╕рдЖрд░-рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рд╕рд╛рдорд╛рди рдЬреЗрдПрд╕ рдЬреАрд╕реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ (рдпрд╛ рдпрд╣ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ)? рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдкреНрд░реЙрдХреНрд╕реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рддрд░рд╣, рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдкрд╛рдЗрдХреНрд╕ рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдкрд╣рд▓реЗ рд╕рдм рдХреБрдЫ _else_ 60fps рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрджрд┐ рдпрд╣ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдПрдХ рдпрд╛ рджреЛ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдЬрд╛рдирджрд╛рд░ рд╣реИ рддреЛ рдпрд╣ рдХрдо рджрдмрд╛рд╡ рд╡рд╛рд▓реА рдЪрд┐рдВрддрд╛ рд╣реИред

рд╣рд╛рдВ, рдпрд╣ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐, рдХреБрдЫ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

@Manishearth рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд! рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЖрдк "рдХрд┐рдВрдХ рдХреЛ рдЕрдирдХрдВрдХ" рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рдереЗ рдпрд╛ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбреНрд░рд╛рдЗрд╡ рдХрд░ рд░рд╣реЗ рдереЗред рдмрд╛рдж рдореЗрдВ рдЕрднреА рдФрд░ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╣рдордд рд╣реИрдВред

рдирд╣реАрдВ, рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдЙрди рд╕рднреА рд╡рд┐рд╢реНрд▓реЗрд╖рдгреЛрдВ рдХреЛ рдиреЛрдЯ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

рдЫреЛрдЯреЗ рд░рди рдХреЗ рдЧреНрд░рд╛рдл рдХреЗ рдЕрдВрдд рдХреЗ рдкрд╛рд╕ рд╡реЗ рд╕реНрдкрд╛рдЗрдХреНрд╕ рдЬрд╣рд╛рдВ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХрд╛ рд╕рдордп рднреА рдмрдврд╝рддрд╛ рд╣реИ: рдпрд╣реА рд╡рд╣ рд╕рдордп рдерд╛ рдЬрдм рдореИрдВ рдЕрдкрдирд╛ рд╕рд┐рд░ рдФрд░ рдбреНрд░рд╛рдЗрдВрдЧ рд▓реЗ рд░рд╣рд╛ рдерд╛, рдФрд░ рдПрд▓рди рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╕рдордп рдПрдлрдкреАрдПрд╕ рдореЗрдВ рдмреВрдВрджреЛрдВ рдХреЛ рднреА рджреЗрдЦ рд░рд╣рд╛ рдерд╛, рдФрд░ рдУрдПрд╕ рдХреЛ рдЕрдиреНрдп рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдпрд╛ . IPC рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдЯрд╛рдЗрдо рд╕реНрдкрд╛рдЗрдХреНрд╕ рдкрд░ рдореЗрд░реЗ рдХреВрдмрдбрд╝ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡реЗ OS рджреНрд╡рд╛рд░рд╛ рдЕрдиреНрдп рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реЛред рдПрдХ рдСрдл-рдореЗрди-рдереНрд░реЗрдб рджреБрдирд┐рдпрд╛ рдореЗрдВ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рдЕрдЧрд░ рдЗрд╕ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ, рдХреНрдпрд╛ рдЖрдкрдиреЗ run_one_frame рдХреЗ рдорд╛рдк рдХреЛ рдкреНрд░рддрд┐-рд╕рдВрджреЗрд╢-рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА thread::sleep() -ing рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рдордп рдХреЛ рднреА рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ?

рдпрд╣ рддреАрди рдорд╛рдк рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  1. рдПрдХ рд░реИрдкрд┐рдВрдЧ https://github.com/servo/webxr/blob/68b024221b8c72b5b33a63441d63803a13eadf03/webxr-api/session.rs#L364

  2. рдФрд░ рджреВрд╕рд░рд╛ рд░реИрдкрд┐рдВрдЧ https://github.com/servo/webxr/blob/2841497966d87bbd561f18ea66547dde9b13962f/webxr-api/lib.rs#L124 рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ,

  3. рдФрд░ рдХреЙрд▓ рдХреЛ рдХреЗрд╡рд▓ thread::sleep рд░реИрдк рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рднреАред


рдЬрд╣рд╛рдВ рддрдХ recv_timeout , рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдХреБрдЫ рдХрдард┐рди рд▓рдЧрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЖрдк рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рдлреНрд░реЗрдо рдХреА рдЧрдгрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, frame_count , рдпреВрдЬрд╝рдХреЗрд╕ "рд╢рд╛рдпрдж рдПрдХ рдпрд╛ рдХрдИ рд╕рдВрджреЗрд╢ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдлреНрд░реЗрдо рдХреЛ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдкрд╣рд▓реЗ, рдПрдХ рдлреНрд░реЗрдо рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реБрдП рдореБрдЦреНрдп-рдзрд╛рдЧреЗ рдХрд╛ рдкреВрд░рд╛ рдЗрд╡реЗрдВрдЯ-рд▓реВрдк"?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд delay рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрдгрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕рдВрджреЗрд╣ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ:

  1. рдпрд╣ delay = timeout / 1000 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, timeout рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдореЗрдВ 5 рдПрдордПрд╕ . рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
  2. рдпрд╣ рддрдм рддреЗрдЬреА рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ delay = delay * 2; рдкрд░ рджреЛрдЧреБрдирд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
  3. рдпрд╣ рд▓реВрдк рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ while delay < timeout рд╕рд╛рде рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рддреЛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдиреАрдВрдж рдХрд╛ рдХреНрд░рдо рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: 5micro -> 10 -> 20 -> 40 -> 80 -> 160 -> 320 -> 640 -> 1.28milli -> 2.56 рдорд┐рд▓реА -> 5.12 рдорд┐рд▓реА

рдЬрдм рдпрд╣ 5.12 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╣рд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ ( delay > timeout ), рдХреБрд▓ 5,115 рдорд┐рд▓реА рд╕реЗрдХрдВрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд╛рде рд╣реА рдкреНрд░рддреНрдпреЗрдХ sleep рдмрд╛рдж рдереНрд░реЗрдб рдХреЛ рдЬрдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП OS рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдЬреЛ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ 5ms рд╕реЗ рдЕрдзрд┐рдХ рд╕реЛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рдмрд╛рдж рд╕реЗ 1 ms рд╕реЗ рдЕрдзрд┐рдХ (рдФрд░ рджреВрд╕рд░реА рдмрд╛рд░ 2.5 ms рд╕реЗ рдЕрдзрд┐рдХ) рдХреЗ рд▓рд┐рдП рджреЛ рдмрд╛рд░ рд╕реЛрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЙрд╕ рджреМрд░рд╛рди рдЕрдВрджрд░ рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдирд╣реАрдВ рдЙрдареЗрдВрдЧреЗред

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░реЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд┐рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдореБрдЦреНрдп рдИрд╡реЗрдВрдЯ-рд▓реВрдк рдХреЗ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдпрджрд┐ рдХреБрдЫ рднреА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░реЗрдВ рдЖрд░рдИрд╡реА?)

рдЖрдк https://doc.rust-lang.org/std/thread/fn.yield_now.html рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдЖрд▓реЗрдЦ рдХреЛ рддрд╛рд▓реЗ рдкрд░ рджреЗрдЦрдХрд░, рдпрд╣ рд╣рд░ рдмрд╛рд░ yield рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рд▓рдЧрднрдЧ 40 рдмрд╛рд░ рдХрддрд╛рдИ рд▓рдЧрддрд╛ рд╣реИ , рдЗрд╖реНрдЯрддрдо рд╣реИ ("рд╕реНрдкрд┐рдирд┐рдВрдЧ" рдкреИрд░рд╛рдЧреНрд░рд╛рдл рджреЗрдЦреЗрдВ, рдЗрд╕рд╕реЗ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛)ред рдЙрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд░рд┐рд╕реАрд╡рд░ рдкрд░ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреЗрд╡рд▓ рдЗрд╡реЗрдВрдЯ-рд▓реВрдк рдХреЗ рд╡рд░реНрддрдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЪреВрдВрдХрд┐ рдпрд╣ рдореБрдЦреНрдп рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ-рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рд╕рдм-рд▓реВрдк рдХреА рддрд░рд╣ рдЪрд▓ рд░рд╣рд╛ рд╣реИ)ред

(рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдХреЗ рд╕рд╛рде рдорд╛рдкрдиреЗ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ipc рдкрд░ рдКрдкрд░ рдУрд░ рд╕реЗ рдХрд░ рджрд┐рдпрд╛, recv_timeout , рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдЕрднреА рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CALLL рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ recv_timeout рдкрд░ mpsc рдЪреВрдВрдХрд┐ рдереНрд░реЗрдбреЗрдб рдЪреИрдирд▓ рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рдХрддрд╛рдИ/рдЙрдкрдЬ рдХрд░реЗрдЧрд╛ рдЬреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдХрдИ рдЕрд╡рд╕рд░реЛрдВ рдкрд░ рдПрдХ рдЕрдЬреНрдЮрд╛рдд "рдЖрдИрдкреАрд╕реА рдлрд┐рдХреНрд╕" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЖрдИрдкреАрд╕реА рдХреЗ рд╕рд╛рде рдорд╛рдк рд░рд╣реЗ рд╣реИрдВ)ред

рдореБрдЭреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдирд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкреНрд░рддрд┐-рд╕рдВрджреЗрд╢-рд╕рдВрднрд╛рд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ run_one_frame рдХреЗ рдорд╛рдк рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ, рдФрд░ рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдб :: рд╕реНрд▓реАрдк () - рдЖрдИрдПрдирдЬреА рдХреЛ рднреА рд╕рдордп рджрд┐рдпрд╛ рд╣реИ?

рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдЯреВрдЯ рдЪреБрдХрд╛ рд╣реИ, рдкреНрд░рддреАрдХреНрд╖рд╛/рд░реЗрдВрдбрд░ рд╕рдордп рдареАрдХ рдпрд╣реА рд╣реИред Run_one_frame рдХреА рдПрдХ рдПрдХрд▓ рдЯрд┐рдХ рдПрдХ рд░реЗрдВрдбрд░, рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛, рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рджреБрд░реНрд▓рдн)ред

recv_timeout рдорд╛рдк рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ

рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ #25678 рдореЗрдВ рд╕реНрдкрд╛рдЗрдбрд░рдореЛрдирдХреА рдЕрдкрдЧреНрд░реЗрдб рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ - рд╕реАрдорд┐рдд рдореЗрдореЛрд░реА рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣рд░ рдбреЗрдореЛ рдХрд╛ рдФрд╕рдд рдПрдлрдкреАрдПрд╕ рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ; рд╣рд┐рд▓ рд╡реИрд▓реА рдбреЗрдореЛ рдереЛрдбрд╝рд╛ рдКрдкрд░ рдЪрд▓рд╛ рдЧрдпрд╛ред рдЖрд░рдВрднреАрдХрд░рдг рддрд░реНрдХреЛрдВ рдореЗрдВ -Z gc-profile рд╕рд╛рде рд╕рд░реНрд╡реЛ рдЪрд▓рд╛рдирд╛ рдорд╛рд╕реНрдЯрд░ рдФрд░ рд╕реНрдкрд╛рдЗрдбрд░рдореЛрдирдХреА рдЕрдкрдЧреНрд░реЗрдб рд╢рд╛рдЦрд╛ рдХреЗ рдмреАрдЪ рдЬреАрд╕реА рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ - рдЬреАрдПрд▓ рд╕рд╛рдордЧреНрд░реА рд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдИ рдЬреАрд╕реА рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред

рд╡рд┐рднрд┐рдиреНрди рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдк:

master:
- espilit: 14-16 fps
- paint: 39-45 fps
- ball shooter: 30-40 fps
- hill valley: 8 fps, 200mb free mem
- mansion: 10-14fps, 650mb free mem

master + single swapchain:
- espilit: 10-12 fps
- paint: 29-55 fps, 1.2gb free mem
- ball shooter: 25-35 fps, 1.3gb free mem
- hill valley: 6-7 fps, 200mb free mem
- mansion: 10-11 fps, 700mb free mem

texture sharing + ANGLE 2.1.19:
- espilit: 13-15 fps, 670mb free mem
- paint: 39-45 fps
- ball shooter: 30-37 fps, 1.3gb free mem
- hill valley: 9-10 fps, 188mb free mem
- mansion: 13-14 fps, 671mb free mem

smup:
- espilit: 11-13 fps, 730mb free mem
- paint: 25-42 fps, 1.1gb free mem
- ball shooter: 26-30 fps, 1.4gb free mem
- hill valley: 10-11 fps, 145mb
- mansion: 9-11fps, 680mb free mem

рд╕реНрдордк рдиреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдФрд░ рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛ ???

https://github.com/servo/servo/pull/25855#issuecomment -594203492 рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде, рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ рдЖрдпрди рдЬреЗрдЖрдИрдЯреА рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ 12 рдПрдлрдкреАрдПрд╕ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХрдИ рд╕реЗрдХрдВрдб рдмрд╛рдж рдпрд╣ рдЕрдЪрд╛рдирдХ 1 рдПрдлрдкреАрдПрд╕ рддрдХ рдЯреИрдВрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдБ рд░рд╣рддрд╛ рд╣реИред

рдЙрди рдкреИрдЪ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдорд╛рдк рдХрд┐рдпрд╛ред

рдкреЗрдВрдЯ рдкрд░, рдореБрдЭреЗ 60 рдПрдлрдкреАрдПрд╕ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдЬрдм рджреЗрдЦрдиреЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬрдм рдЦреАрдВрдЪреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдпрд╣ 50ish рдПрдлрдкреАрдПрд╕ рддрдХ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИ (рдкреАрд▓реЗ рд╕реНрдкрд╛рдЗрдХреНрд╕ рддрдм рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдореИрдВ рдЦреАрдВрдЪреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реВрдВ)ред рдпрд╣ рдмрддрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдУрдкрдирдПрдХреНрд╕рдЖрд░ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдордп рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЗрддрдиреА рдзреАрдореА рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХреЗрдВред рд╕реНрд╡реИрдк рдЕрдиреБрд░реЛрдз рдХрд╛ рд╕рдордп рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реИред рдЖрд░рдПрдПрдл рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдзреАрдорд╛ рд╣реИ (рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ "рдкрд╣рд▓реА рдмрд╛рд░ рдирд┐рдпрдВрддреНрд░рдХ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ" рдордВрджреА рд╣реИ) рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдХрд╛рдлреА рд╕реНрдерд┐рд░ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ openxr рд╕рд┐рд░реНрдл рд╣рдорд╛рд░рд╛ рдЧрд▓рд╛ рдШреЛрдВрдЯ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рдФрд░ рдХреЛрдИ рдордВрджреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реА рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧреАред

image

рдбреНрд░реИрдЧрд┐рдВрдЧ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣реА рд╣реИред рд╡рд╛рдИ-рд╕реНрдХреЗрд▓ рд╕рдорд╛рди рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рд╣рдореЗрдВ рдзреАрдорд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред

image

рдзреНрдпрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓реА рдПрдХ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ #25837 рдХреЗ рд╕рд╛рде рдорд╛рдк рд▓реЗ рд░рд╣рд╛ рдерд╛, рдФрд░ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдирд╣реАрдВ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЖрдкрдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓ рд░рд╣реЗ рдереЗ

рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрддреЗ рд╕рдордп рдЙрд╕ рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдЯреВрд▓ рдЧреНрд░рд╛рдлрд╝ рдЬрд╣рд╛рдВ рдпрд╣ 60FPS рд╕реЗ 45FPS рддрдХ рдЬрд╛рддрд╛ рд╣реИ:

image

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрд╖ рдкреВрд░реА рддрд░рд╣ рд╕реЗ xrWaitFrame рдкрд░ рд╣реИ, рдЕрдиреНрдп рд╕рднреА рд╕рдордп рдПрдХ рд╕рд╛рде рдХрд╛рдлреА рдХрд░реАрдм рд╣реИрдВред xrBeginFrame рдЕрднреА рднреА рд▓рдЧрднрдЧ xrWaitFrame рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╣реИ, xrEndFrame xrBeginFrame (рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ) рдХреЗ рдмрд╛рдж 4us рд╣реИред рдЕрдЧрд▓рд╛ xrWaitFrame xrEndFrame рдХреЗ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдмрд╛рдж рд╣реИред рдЕрдВрддрд░ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдмреЗрд╣рд┐рд╕рд╛рдм xrWaitFrame рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред

рдбреНрд░реИрдЧрд┐рдВрдЧ рдбреЗрдореЛ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдирд┐рдореНрди рдЯреНрд░реЗрд╕ рдорд┐рд▓рддрд╛ рд╣реИ:

image

рдпрд╣ рдЙрд╕реА рдкреИрдорд╛рдиреЗ рдХреЗ рд╕рд╛рде рдкреЗрдВрдЯ рдбреЗрдореЛ рд╣реИ:

image

рд╣рдо рдкреНрд░рд╛рд░рдВрдн/рд╕рдорд╛рдкреНрддрд┐ рдлрд╝реНрд░реЗрдо рдХреЗ рдмреАрдЪ рдзреАрдореЗ рд╣реИрдВ (рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдкрд░ 5ms рд╕реЗ 38ms рддрдХ!), рдФрд░ рдлрд┐рд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдлрд╝реНрд░реЗрдо рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ, рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ рджреЛрдиреЛрдВред

рдбреНрд░реИрдЧрд┐рдВрдЧ рдбреЗрдореЛ рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдЫрд╛рдпрд╛ рдбрд╛рд▓рддрд╛ рд╣реИред рдЫрд╛рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдЬреАрдПрд▓ рдкрдХреНрд╖ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЧрддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрджрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ GLSL рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ; рдпрджрд┐ рдпрд╣ рд╡реЗрдмрдЬреАрдПрд▓ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд░ рдлреНрд░реЗрдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рдБ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЬреАрдПрд▓рдПрд╕рдПрд▓ рдХреА рддрд░рдл рд╣реИрдВ; рдЬрдм рдпрд╣ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдПрдкреАрдЖрдИ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдХреЛрдИ рд╡реЗрдмрдЬреАрдПрд▓ рдХреЙрд▓ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рдереА, рдмрд╕ рдХреБрдЫ рдмрд┐рдЯреНрд╕ рдЬреЛ рд╢реЗрдбрд░реНрд╕ рдХреЛ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдЙрди рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдПрдБ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╛рд░реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Grishy picture Grishy  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gterzian picture gterzian  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ayelen912 picture ayelen912  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pshaughn picture pshaughn  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gterzian picture gterzian  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ