Servo: ๋ชฐ์ž… ๋ชจ๋“œ๊ฐ€ 60fps์— ๋„๋‹ฌํ•˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2020๋…„ 01์›” 03์ผ  ยท  71์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: servo/servo

์žฅ์น˜์—์„œ ๋ชฐ์ž…ํ˜• ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‚ฎ์€ FPS ๊ฐ’์˜ ์›์ธ์— ๋Œ€ํ•œ ์กฐ์‚ฌ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

B-meta I-perf-slow P-windows

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ˜„์žฌ ์ƒํƒœ: IPC ์ˆ˜์ •์œผ๋กœ FPS๋Š” ์ด์ œ 55 ์ฃผ๋ณ€์„ ๋งด๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๋ฌด๋ฆฌํ•˜๊ฒŒ ํ”๋“ค๋ฆฌ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ๋“œ ํ›„ ์ฒ˜์Œ ๋ช‡ ์ดˆ ๋™์•ˆ(30๊นŒ์ง€ ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ) ๋ฐ ๋จผ์ € ์†์„ ๋ด…๋‹ˆ๋‹ค(20์œผ๋กœ ๋‚ด๋ ค๊ฐˆ ๋•Œ).

๋ชจ๋“  71 ๋Œ“๊ธ€

๋ฐํ˜€์ง„ ๋ช‡ ๊ฐ€์ง€ ์ •๋ณด:

OpenXR API์šฉ ๋งˆ์ปค๊ฐ€ ์žˆ๋Š” ํŽ˜์ธํŠธ ๋ฐ๋ชจ ์˜ ํ”์ ์€ ์š”์ฆ˜ ์žฌํ˜„๋˜๋ฉฐ ๊ทธ ๊ธฐ๊ฐ„ ๋™์•ˆ์—๋„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  • webgl ์Šค๋ ˆ๋“œ๋Š” ๊ฐ€์žฅ ๋งŽ์€ CPU๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(๊ทธ ์‹œ๊ฐ„์˜ ๋Œ€๋ถ€๋ถ„์€ gl::Finish์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ์ด๋Š” surfman์˜ Device::bind_surface_to_context์—์„œ ํ˜ธ์ถœ๋จ)
  • ์ฃผ ์Šค๋ ˆ๋“œ๋Š” ๋‘ ๋ฒˆ์งธ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ eglCreatePbufferFromClientBuffer์—์„œ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ€์žฅ ๋งŽ๊ณ  TLS์—์„œ Egl ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ๊ฑฐ์˜ ๊ฐ™์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

    • webrender์˜ ๋ Œ๋”๋ง๋„ ์ด ์Šคํƒ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

    • winrt::servo::flush๊ฐ€ ์—ฌ๊ธฐ์—๋„ ๋‚˜ํƒ€๋‚˜๋ฉฐ ๋ชฐ์ž… ๋ชจ๋“œ์— ์žˆ๋Š” ๋™์•ˆ ์ฃผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ GL ๋ฒ„ํผ๋ฅผ ์‹ค์ œ๋กœ ๊ต์ฒดํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์„ธ ๋ฒˆ์งธ๋กœ ๋†’์€ CPU ์‚ฌ์šฉ๋Ÿ‰์€ JIT ์ฝ”๋“œ ๋‚ด์—์„œ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋Š” ์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ ์Šค๋ ˆ๋“œ ํ›„ CPU ์‚ฌ์šฉ๋Ÿ‰์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฝค ๋‚ฎ์ง€๋งŒ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์Šคํƒ€์ผ ์ƒ์ž์˜ ์ผ๋ถ€ ๊ธฐํ˜ธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์žฅ์น˜ ํ”„๋ ˆ์ž„์„ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ ๋‹ค์Œ XR ํ”„๋ ˆ์ž„์„ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.
  • gl::Finish(webgl ์Šค๋ ˆ๋“œ), 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๋ฅผ gl::Flush๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ํ”„๋ ˆ์ž„ ์†๋„๊ฐ€ ~15->30์œผ๋กœ ํ–ฅ์ƒ๋˜์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž์˜ ๋จธ๋ฆฌ ์›€์ง์ž„์„ ๋ฐ˜์˜ํ•˜๋Š” ํ”„๋ ˆ์ž„ ๋‚ด์šฉ์— ๋งค์šฐ ๋ˆˆ์— ๋„๋Š” ์ง€์—ฐ์ด ์žˆ์–ด ํ˜„์žฌ ํ”„๋ ˆ์ž„์ด ์‚ฌ์šฉ์ž์˜ ๋จธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ.

ํ‚ค๊ฐ€ ์žˆ๋Š” ๋ฎคํ…์Šค๋Š” ANGLE์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€๋งŒ, mozangle์€ ๋ช…์‹œ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค(https://github.com/servo/mozangle/blob/706a9baaf8026c1a3cb6c67ba63aa5f4734264d0/build_data.rs#L175๋กœ ํ…Œ์ŠคํŠธ). . ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ANGLE ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๊ณ  ๊ทธ๊ฒƒ์ด gl::Finish ํ˜ธ์ถœ์„ ํ”ผํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ์ง€ ํ™•์ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค! ANGLE์—์„œ ํ‚ค ์ง€์ • ๋ฎคํ…์Šค๋ฅผ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๋ฉด gl::Finish ํ˜ธ์ถœ์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ ๋ฌธ์ œ ์—†์ด ํŽ˜์ธํŠธ ๋ฐ๋ชจ์—์„œ 25-30FPS๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„, ๊ทธ๋ฆฌ๊ณ  ๋ผ์Šค์˜ ์กฐ์‚ฌ์— ๋”ฐ๋ฅธ ๋˜ ๋‹ค๋ฅธ ์ •๋ณด:

  • w/ dom.ion.enabled๊ฐ€ false๋กœ ์„ค์ •๋˜๋ฉด JIT ์‹œ๊ฐ„์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋กœ๋“œ๋Š” ํ›จ์”ฌ ๋Š๋ฆฌ์ง€๋งŒ ์ผ๋‹จ ์‹คํ–‰๋˜๋ฉด ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค.

    • ์—ฌ์ „ํžˆ ํ™˜์ƒ์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น babylon.js ์˜ˆ์ œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ƒ๋‹นํžˆ ๋†’์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ).

    • ์•ˆ๋“œ๋กœ์ด๋“œ ๊ธฐ๊ธฐ์—์„œ FxR์— ๋Œ€ํ•ด ๋ฐœ์ƒํ–ˆ๋˜ arm64 ๊ด€๋ จ ์ตœ์ ํ™”๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋˜ ๋‹ค๋ฅธ ์ŠคํŒŒ์ด๋”๋ชฝํ‚ค ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœํ•„์— std::thread::local::LocalKey<surfman::egll::Egl> ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ž˜๋ชป ์ดํ•ดํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. TLS ์ฝ๊ธฐ๋Š” ์ด์— ๋ถ€๊ณผ๋œ ์‹œ๊ฐ„์˜ ์•„์ฃผ ์ž‘์€ ๋ถ€๋ถ„์ผ ๋ฟ์ด๋ฉฐ eglCreatePbufferFromClientBuffer์™€ ๊ฐ™์€ TLS ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. DXGIAcquireSync๋Š” _์‹ค์ œ๋กœ_ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์Šฌํ”„๊ฒŒ๋„ js.ion.enabled๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ํŽ˜์ธํŠธ ๋ฐ๋ชจ์˜ FPS๊ฐ€ ์†์ƒ๋˜์–ด 20-25๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค Device::create_surface_texture_from_texture๋ฅผ ๋‘ ๋ฒˆ(๊ฐ ๋ˆˆ์˜ ๊ฐ d3d ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์”ฉ) ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  openxr webxr ์žฅ์น˜๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋ชจ๋“  ์Šค์™‘์ฒด์ธ ํ…์Šค์ฒ˜์— ๋Œ€ํ•œ ํ‘œ๋ฉด ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋ฉด ๋ชฐ์ž… ๋ชจ๋“œ ๋™์•ˆ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋‘ ๋ฒˆ์งธ๋กœ ํฐ CPU ์‚ฌ์šฉ์ž๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด: bfcache๋ฅผ ๋งค์šฐ ๋‚ฎ์€ ์ˆซ์ž๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฐ๋ชจ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™ํ•  ๋•Œ ์›๋ž˜ HL ํ™ˆํŽ˜์ด์ง€ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ œ๊ฑฐ๋˜๋Š” ๊ฒฝ์šฐ ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ webxr ํŒจ์น˜๋Š” FPS๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค์ง€๋Š” ์•Š์ง€๋งŒ ์ด๋ฏธ์ง€ ์•ˆ์ •์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ์†์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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์—๋„ ๋ˆˆ์— ๋„๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„ ์ถ”๊ตฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋„ˆ๋ฌด ๋งŽ์ด. ์•ˆ์ •์„ฑ๋งŒ ๋†’์ธ๋‹ค๋ฉด ๊ตฟ!

ํ•ต์‹ฌ ๋ฐœ๊ฒฌ์— ๋Œ€ํ•ด ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค! Surfman ํ˜ธ์ถœ์€ ์‹ค์ œ๋กœ ๋งŽ์€ ํ”„๋ ˆ์ž„ ์˜ˆ์‚ฐ์„ ์ฐจ์ง€ํ•˜์ง€๋งŒ ๋ฌด์—‡์ด ํ•„์š”ํ•˜๊ณ  ๋ฌด์—‡์ด ํ•„์š”ํ•˜์ง€ ์•Š์€์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋‹ค์‹œ: js.ion.enabled ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด RAM์ด ๋ถ€์กฑํ•˜๊ณ  ์Šค๋ž˜์‹ฑ์ด ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ GC'ํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ๋ณด๋‚ผ ๋•Œ๋งŒ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ƒˆ๋กœ์šด SM์œผ๋กœ ๊ฐœ์„ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IIRC, 66-์‹œ๋Œ€ ARM64 ๋ฐฑ์—”๋“œ ๋˜ํ•œ ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ๊ธฐ์ค€ JIT ๋ฐ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์„ฑ๋Šฅ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•ด ์ „๋ฐ˜์ ์œผ๋กœ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋˜์ง€๋งŒ ํŠนํžˆ RAM ์ง‘์•ฝ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‚ค ์ง€์ • ๋ฎคํ…์Šค๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒˆ ANGLE ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ ์œ„ํ•ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

XR ์žฅ์น˜ ์ดˆ๊ธฐํ™” ์ค‘์— ๋ชจ๋“  openxr ์Šค์™‘์ฒด์ธ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ํ‘œ๋ฉด ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฐ ํ”„๋ ˆ์ž„๋งˆ๋‹ค webgl ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜์‹ ํ•˜๋Š” ํ‘œ๋ฉด์—์„œ eglCreatePbufferFromClientBuffer๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ํ‘œ๋ฉด์„ ๋ฐ›์œผ๋ฉด ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ํ‘œ๋ฉด ํ…์Šค์ฒ˜๋ฅผ ์บ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ CPU ์‚ฌ์šฉ๋Ÿ‰์€ render_animation_frame์—์„œ ๋ฐœ์ƒํ•˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์€ OpenXR ๋Ÿฐํƒ€์ž„์—์„œ ๋ฐœ์ƒํ•˜์ง€๋งŒ BlitFramebuffer ๋ฐ FramebufferTexture2D์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ํ”„๋กœํ•„์—๋„ ๋ถ„๋ช…ํžˆ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋‘ ๋ˆˆ์„ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ…์Šค์ฒ˜๋กœ ๋ธ”๋ ›ํ•˜๋Š” ๊ฒƒ์ด ๊ฐœ์„ ์ด ๋ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. https://github.com/microsoft/OpenXR-SDK-VisualStudio/#render -with-texture-array-and-vprt์—์„œ ๋…ผ์˜๋œ ํ…์Šค์ฒ˜ ๋ฐฐ์—ด๊ณผ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ•œ ๋ฒˆ์— ๋‘ ๋ˆˆ์„ ๋ธ”๋ฆฌ๋”ฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด ์ดํ•ด๋Š” ๋Ÿฐํƒ€์ž„์ด
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž์ฒด blit์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜ ๋ฐฐ์—ด์ด ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ
๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ์…˜ ๋ทฐ API๋Š” ์ด ์ž‘์—…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์ธ ์Šค๋ ˆ๋“œ ANGLE ํŠธ๋ž˜ํ”ฝ์€ RAF ๋ฃจํ”„๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
์บ”๋ฒ„์Šค ๋„์›€๋ง์„ ๋”๋Ÿฝํžˆ๋‚˜์š”? ์ง€๊ธˆ๊นŒ์ง€ ์ด๊ฒƒ์€ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒท, ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ฉ”์ธ์—์„œ ๋ ˆ์ด์•„์›ƒ/๋ Œ๋”๋ง์„ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
์‹ค.

2020๋…„ 1์›” 6์ผ ์›”์š”์ผ ์˜คํ›„ 11:49 Josh Matthews [email protected]
์ผ๋‹ค:

๊ฐ€์žฅ ํฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ CPU ์‚ฌ์šฉ๋Ÿ‰์€ render_animation_frame์—์„œ ์˜ต๋‹ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์€ OpenXR ๋Ÿฐํƒ€์ž„์— ์žˆ์ง€๋งŒ BlitFramebuffer ๋ฐ
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=AAMK6SBRH72JGZMXTUKOXETQ4NY37A5CNFSM4KCRI6AKYY20EGOZODNVHJODNVHJJ3TUL52HSLODFVEXG43VMVBW63LN
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AAMK6SECM6MDNZZ6Y7VL7SDQ4NY37ANCNFSM4KCRI6AA
.

๋”๋Ÿฌ์›Œ์ง„ ์บ”๋ฒ„์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํ”„๋กœํ•„๋งŒ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์˜๋ฏธ์žˆ๋Š” FPS ์ฆ๊ฐ€๋กœ ์ด์–ด์ง€์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

webgl ์Šค๋ ˆ๋“œ์™€ openxr swapchain ํ…์Šค์ฒ˜์—์„œ ํ‘œ๋ฉด์— ๋Œ€ํ•œ ํ‘œ๋ฉด ํ…์Šค์ฒ˜ ์บ์‹œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์œผ๋ฉฐ eglCreatePbufferFromClientBuffer ์‹œ๊ฐ„์ด ์™„์ „ํžˆ ์‚ฌ๋ผ์ง€๋Š” ๋™์•ˆ ์˜๋ฏธ ์žˆ๋Š” FPS ๋ณ€๊ฒฝ์„ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชฐ์ž…ํ˜• ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํƒ€์ด๋ฐ ์ •๋ณด(๋ชจ๋“  ์ธก์ •์€ ms ๋‹จ์œ„):

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 : XR ์Šค๋ ˆ๋“œ์—์„œ ์ „์†ก๋œ XR ํ”„๋ ˆ์ž„ ์ •๋ณด๋ถ€ํ„ฐ IPC ๋ผ์šฐํ„ฐ๊ฐ€ ์ˆ˜์‹ ํ•˜๊ธฐ๊นŒ์ง€์˜ ์‹œ๊ฐ„
queued : ํ”„๋ ˆ์ž„ ์ •๋ณด๋ฅผ ์ˆ˜์‹ ํ•œ IPC ๋ผ์šฐํ„ฐ๋กœ๋ถ€ํ„ฐ XRSession::raf_callback์ด ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„
execute : XRSession::raf_callback์ด ํ˜ธ์ถœ๋œ ํ›„ ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„
transmitted : ์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ์—์„œ ์ƒˆ rAF์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ XR ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜์‹ ํ•  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„
render : render_animation_frame ์„ ํ˜ธ์ถœํ•˜๊ณ  ํ‘œ๋ฉด์„ ์žฌํ™œ์šฉํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„
wait : wait_for_animation_frame ์†Œ์š” ์‹œ๊ฐ„(์ด ๋ฌธ์ œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ๋ Œ๋”๋งํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ํ”„๋ ˆ์ž„์„ ๋ฐ˜๋ณตํ•˜๋Š” ํŒจ์น˜ ์‚ฌ์šฉ)

๊ฐ ํ•ญ๋ชฉ ์•„๋ž˜์—๋Š” ์„ธ์…˜์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๊ฐ’์˜ ๋ถ„ํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ํƒ€์ด๋ฐ ์ •๋ณด์˜ ํฅ๋ฏธ๋กœ์šด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ - transmitted ๋ฒ”์ฃผ๋Š” ์˜ˆ์ƒ๋ณด๋‹ค ํ›จ์”ฌ ๋†’์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” rAF ์ฝœ๋ฐฑ ์‹คํ–‰๊ณผ XR ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ”„๋ ˆ์ž„์„ Openxr์˜ ํ…์Šค์ฒ˜๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์‚ฌ์ด์˜ ์ง€์—ฐ์ž…๋‹ˆ๋‹ค. ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊นจ์–ด๋‚˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•”์‹œํ•˜๋Š” ์•ฝ๊ฐ„์˜ ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๋‚ด์ผ 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) webgl ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ์Šค์™‘ ๋ฒ„ํผ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ง€์—ฐ, 2) ๋ฒ„ํผ๋ฅผ ์Šค์™‘ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„, 3) ์Šค์™€ํ•‘์ด ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ๊นŒ์ง€ ๋ฐ›์€ ์ง€์—ฐ๊ณผ ๊ด€๋ จ๋œ ํƒ€์ด๋ฐ์ž…๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ. ์—ฌ๊ธฐ์„œ ๋†€๋ผ์šด ๊ฒƒ์€ ์—†์ง€๋งŒ( swap request ๋ฒ”์ฃผ์˜ ์ด์ƒํ•œ ์ด์ƒ๊ฐ’์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์„ค์ •์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๋ชฐ์ž…ํ˜• ์„ธ์…˜์˜ ๋งจ ์ฒ˜์Œ์— ๋ฐœ์ƒํ•จ) ์‹ค์ œ ๋ฒ„ํผ ์Šค์™€ํ•‘์€ ์ผ๊ด€๋˜๊ฒŒ 1-4ms๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ผ๋ถ€ openxr ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  Locate_views ํ˜ธ์ถœ์ด ํ”„๋กœํ•„์— ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•œ ํ›„ ์ถœ์› #117.

ํ•ด๋‹น ํƒ€์ด๋ฐ ์ •๋ณด์˜ ํฅ๋ฏธ๋กœ์šด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ - ์ „์†ก๋œ ๋ฒ”์ฃผ๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ํ›จ์”ฌ ๋†’์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” rAF ์ฝœ๋ฐฑ ์‹คํ–‰๊ณผ XR ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ”„๋ ˆ์ž„์„ Openxr์˜ ํ…์Šค์ฒ˜๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ์‚ฌ์ด์˜ ์ง€์—ฐ์ž…๋‹ˆ๋‹ค. ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊นจ์–ด๋‚˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•”์‹œํ•˜๋Š” ์•ฝ๊ฐ„์˜ ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

transmitted ๊ฐ’์˜ ๋ณ€ํ˜•์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉด ์„ธ์…˜์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋  ๋•Œ run_one_frame ์ผ๋ถ€๋กœ ์‚ฌ์šฉ๋˜๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ์— ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ์ธก์ •๊ฐ’์— ํ•ด๋‹นํ•ฉ๋‹ˆ๊นŒ?) , https://github.com/servo/webxr/blob/c6abf4c60d165ffc978ad2ebd6bcddc3c21698e1/webxr-api/session.rs#L275 ์ฐธ์กฐ

RenderAnimationFrame msg(์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•œ ํ›„ ์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€)๊ฐ€ ํƒ€์ž„์•„์›ƒ ์ „์— ์ˆ˜์‹ ๋˜๋ฉด "๋น ๋ฅธ ๊ฒฝ๋กœ"๋ฅผ ์น˜๊ณ  ํƒ€์ž„์•„์›ƒ์„ ๋†“์น˜๋ฉด ์„œ๋ณด๊ฐ€ ๋‹ค๋ฅธ perform_updates ๋ฐ˜๋ณต ๋ฐ "๋‹ค๋ฅธ ํ”„๋ ˆ์ž„ ์‹คํ–‰"์€ compositor.perform_updates ์ผ๋ถ€๋กœ ์ฃผ๊ธฐ์—์„œ ์ƒ๋‹นํžˆ ๋Šฆ๊ฒŒ ๋ฐœ์ƒํ•˜๋ฉฐ ์ž์ฒด์ ์œผ๋กœ servo.handle_events ์ผ๋ถ€๋กœ ์ƒ๋‹นํžˆ ๋Šฆ๊ฒŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

XR์„ ์ž์ฒด ์Šค๋ ˆ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ํ‰๊ท  ๊ฐ’์ด ํ–ฅ์ƒ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://github.com/servo/webxr/issues/113 ์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ openxr์„ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ์ฃผ์— ํ•ด๋‹น ์ž‘์—…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ๋งŽ์€ ์ธก์ •์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žฅ์น˜์—์„œ ์œ ์šฉํ•œ ํ”„๋กœํ•„์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ์ˆ :

  • rustflags = "-C force-frame-pointers=yes" ๊ฐ€ ํฌํ•จ๋œ .servobuild ์‚ฌ์šฉ
  • ์ด ์ค„์˜ ์ฃผ์„์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค
  • MS ํŒ€ char Files ํƒญ์˜ WinXR_Perf.wprp๋ฅผ HL ์žฅ์น˜ ํฌํ„ธ์˜ "์„ฑ๋Šฅ ์ถ”์ "์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์ถ”์  ํ”„๋กœํ•„๋กœ ์‚ฌ์šฉ
  • --features profilemozjs ๋นŒ๋“œ

์ด๋Ÿฌํ•œ ์ถ”์ (์žฅ์น˜ ํฌํ„ธ์˜ "์ถ”์  ์‹œ์ž‘"์—์„œ ๊ฐ€์ ธ์˜ด)์€ Windows ์„ฑ๋Šฅ ๋ถ„์„๊ธฐ ๋„๊ตฌ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ์Šค๋ ˆ๋“œ ์ด๋ฆ„์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ€์žฅ ๋งŽ์€ CPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šค๋ ˆ๋“œ๋Š” ์Šคํƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ • openxr ํ”„๋ ˆ์ž„์˜ ์‹œ๊ฐ„ ๋ถ„ํฌ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜๋ ค๋ฉด:

  • WPA์—์„œ "์‹œ์Šคํ…œ ํ™œ๋™ -> ์ผ๋ฐ˜ ์ด๋ฒคํŠธ" ๋ณด๊ธฐ ์ถ”๊ฐ€
  • Microsoft.Windows.WinXrContinuousProvider ์‹œ๋ฆฌ์ฆˆ๋งŒ ํ‘œ์‹œํ•˜๋„๋ก ๋ณด๊ธฐ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์งง์€ ๊ธฐ๊ฐ„์œผ๋กœ ํ™•๋Œ€ํ•œ ๋‹ค์Œ xrBegin ์ด๋ฒคํŠธ๊ฐ€ ๋ณด๊ธฐ์˜ ์™ผ์ชฝ์— ์žˆ๊ณ  xrEnd ์ด๋ฒคํŠธ๊ฐ€ ๋ณด๊ธฐ์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋„๋ก ํ™•๋Œ€๋œ ์˜์—ญ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

CPU ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์œ ์šฉํ•œ ๋ณด๊ธฐ:

  • CPU ์‚ฌ์šฉ๋Ÿ‰(์ƒ˜ํ”Œ) -> ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ, ์Šคํƒ๋ณ„ ํ™œ์šฉ(์„œ๋ณด๋งŒ ํ‘œ์‹œํ•˜๋„๋ก ๋ณด๊ธฐ๋ฅผ ํ•„ํ„ฐ๋งํ•œ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค ์—ด ๋น„ํ™œ์„ฑํ™”)
  • ํ”„๋กœ์„ธ์Šค๋ณ„ ํ™”์—ผ, ์Šคํƒ(์„œ๋ณด๋งŒ ํ‘œ์‹œํ•˜๋„๋ก ๋ณด๊ธฐ ํ•„ํ„ฐ๋ง)

์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ์—์„œ ์•ฝ๊ฐ„ ๋” ์ ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ:

  • XRView::new๋Š” ๋ชจ๋“  ์„œ๋ณด CPU์˜ 0.02%๋ฅผ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • FrameUpdateEvent::UpdateViews ์ด๋ฒคํŠธ(XRSession::UpdateRenderState๋ฅผ ํ†ตํ•ด Session::update_clip_planes์—์„œ ๋ฐœ์ƒ)๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ทฐ ๊ฐœ์ฒด์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ XRSession์— XRView ๊ฐœ์ฒด๋ฅผ ์บ์‹œํ•˜๊ณ  ๋‹ค์Œ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋จ
  • XRSession์— ์บ์‹œ๋œ ๋ณด๊ธฐ ๋ชฉ๋ก์˜ JS ํ‘œํ˜„์„ ์œ ์ง€ํ•˜๊ณ  ํฌ์ฆˆ์˜ ๋ณด๊ธฐ ๋ฉค๋ฒ„๋ฅผ ์„ค์ •ํ•˜์—ฌ XRView ๊ฐœ์ฒด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๊ณ  ๋ฒกํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๊ณ  JS ๊ฐ’ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ํ”ผํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชฐ์ž…ํ˜• ํ”„๋ ˆ์ž„์„ ๋ Œ๋”๋งํ•  ๋•Œ ๋” ์ ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ:

  • GL ๋ฐ d3d์—๋Š” ๋ฐ˜์ „๋œ Y ์ขŒํ‘œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ANGLE์€ ๋ฐฐํ›„์—์„œ ์ผ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋•Œ ์ด๋ฅผ ์•”์‹œ์ ์œผ๋กœ ์ˆจ๊น๋‹ˆ๋‹ค.
  • ๋ชฐ์ž… ๋ชจ๋“œ์˜ ๊ฒฝ์šฐ GL ํ…์Šค์ฒ˜ ๋ฐ์ดํ„ฐ๋ฅผ d3d๋กœ blittingํ•  ๋•Œ y-inversion์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด glBlitFramebuffer๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ANGLE์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด ๋ชจ๋ธ์„ ๋ฐ˜์ „ํ•˜๊ณ  ๋น„๋ชฐ์ž… ์›น ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ์ถ”๊ฐ€ y-invert blit์ด ํ•„์š”ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(webrender ์˜ต์…˜ surface_origin_is_top_left ). ๋ชฐ์ž…ํ˜• ๋ชจ๋“œ๋Š” ๋ณ€ํ˜• ์—†์ด ํŒŒ๊ดด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://bugzilla.mozilla.org/show_bug.cgi?id=1591346 ๋ฐ jrmuizel๊ณผ์˜ ๋Œ€ํ™”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋น„๋ชฐ์ž…ํ˜• ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋ ค๋Š” ์ฐฝ ์š”์†Œ์— ๋Œ€ํ•œ d3d ์Šค์™‘์ฒด์ธ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค(XAML ์•ฑ์˜ SwapChainPanel์ด ๋จ).
  • EGL ์ด๋ฏธ์ง€๋กœ ๋ž˜ํ•‘ํ•˜์‹ญ์‹œ์˜ค(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/SwapChainPanel#NativeWindow.cpp

ํ˜„์žฌ wip ๋ถ„๊ธฐ:

์—ฌ๊ธฐ์—๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํƒ€์ด๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” xr-profile ๊ธฐ๋Šฅ๊ณผ ๋ชฐ์ž… ๋ชจ๋“œ์—์„œ y-์—ญ ๋ณ€ํ™˜์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ANGLE ๋ณ€๊ฒฝ์˜ ์ดˆ๊ธฐ ๊ตฌํ˜„์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋น„๋ชฐ์ž… ๋ชจ๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜์ง€๋งŒ ๋ชฐ์ž… ๋ชจ๋“œ๋Š” ๊ฑฐ๊พธ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. d3d ํ…์Šค์ฒ˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก GL ํ‘œ๋ฉด์—์„œ ๊ณต์œ  ํ•ธ๋“ค์„ ์ถ”์ถœํ•˜์—ฌ render_animation_frame์—์„œ GL ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ง์ ‘ CopySubresourceRegion ํ˜ธ์ถœ๋กœ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ANGLE y-inversion ์ž‘์—…์„ ์œ„ํ•ด https://github.com/servo/servo/issues/25582 ์— ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ž‘์—…์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์—…๋ฐ์ดํŠธ๋Š” ํ•ด๋‹น ๋ฌธ์ œ์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๋‹ค์Œ ํฐ ํ‹ฐ์ผ“ ํ•ญ๋ชฉ์€ openxr webxr ๋ฐฑ์—”๋“œ์—์„œ glBlitFramebuffer ํ˜ธ์ถœ์„ ์™„์ „ํžˆ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์กฐ์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ํ•„์š”ํ•œ ๋ถˆํˆฌ๋ช… webgl ํ”„๋ ˆ์ž„ ๋ฒ„ํผ์™€ ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š” openxr ํ”„๋ ˆ์ž„ ๋ฒ„ํผ ์ƒ์„ฑ
  • webxr ๋ฐฑ์—”๋“œ๊ฐ€ ๋ชจ๋“  swapchain ํ‘œ๋ฉด์„ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ์ œ๊ณตํ•˜๋Š” webgl ๋ชจ๋“œ ์ง€์›(์˜ˆ: https://github.com/asajeffrey/surfman-chains/blob/27a7ab8fec73f19f0c4252ff7ab52e84609e1fa5/surfman-chains458rs ๋ฐ https://github.com/asajeffrey/surfman-chains/blob/27a7ab8fec73f19f0c4252ff7ab52e84609e1fa5/surfman-chains/lib.rs#L111-L118)

๊ทธ๊ฒƒ์€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. surfman์€ ํ‘œ๋ฉด์„ ์ƒ์„ฑํ•œ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ๋งŒ ์ œ๊ณตํ•˜๋ฏ€๋กœ ํ‘œ๋ฉด์ด openxr ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ WebGL ์Šค๋ ˆ๋“œ์—์„œ ์“ธ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/pcwalton/surfman/blob/a515fb2f5d6b9e9b36ba4e8b498cdb4bea92d330/surfman/src/device.rs#L95 -L96

์ €์—๊ฒŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. webgl ์Šค๋ ˆ๋“œ์—์„œ openxr ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด openxr์˜ ํ…์Šค์ฒ˜์— ์ง์ ‘ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋”ฉ ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: ์—ฌ๋Ÿฌ d3d ์žฅ์น˜ ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•˜๋Š” eglCreatePbufferFromClientBuffer ๊ด€๋ จ ์ œํ•œ ์‚ฌํ•ญ). ๊ณ ๋ คํ•˜๋‹ค:

  • ์—ฌ์ „ํžˆ openxr ์ด๋ฒคํŠธ ํด๋ง, ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ”„๋ ˆ์ž„ ๋Œ€๊ธฐ, ์ƒˆ ํ”„๋ ˆ์ž„ ์‹œ์ž‘ ๋ฐ ํ˜„์žฌ ํ”„๋ ˆ์ž„ ์ƒํƒœ ๊ฒ€์ƒ‰์„ ๋‹ด๋‹นํ•˜๋Š” openxr ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋ ˆ์ž„ ์ƒํƒœ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฝœ๋ฐฑ์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ xr ๋ ˆ์ด์–ด์˜ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋ฅผ ๊ต์ฒดํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ webgl ์Šค๋ ˆ๋“œ์— ๋ณด๋‚ด๋Š” ์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • ์ด ์Šค์™‘ ๋ฉ”์‹œ์ง€๊ฐ€ webgl ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜์‹ ๋˜๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ ํš๋“ํ•œ openxr ์Šค์™‘์ฒด์ธ ์ด๋ฏธ์ง€๋ฅผ ํ•ด์ œํ•˜๊ณ  ํ˜„์žฌ ํ”„๋ ˆ์ž„์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด openxr ์Šค๋ ˆ๋“œ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ๋‹ค์Œ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ์ƒˆ ์Šค์™‘์ฒด์ธ ์ด๋ฏธ์ง€๋ฅผ ํš๋“ํ•ฉ๋‹ˆ๋‹ค.

https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#threading -behavior์— ๋Œ€ํ•œ ๋‚˜์˜ ๋…์„œ๋Š” ์ด ๋””์ž์ธ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ฒฐ์€ Openxr์ด ์•„๋‹Œ ๋ฐฑ์—”๋“œ์™€ openxr์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

์‚ฌ์–‘์—์„œ: "xrBeginFrame ๋ฐ xrEndFrame์€ ๋™์ผํ•œ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."

ํ˜„์žฌ XR ์žฅ์น˜ ์Šค๋ ˆ๋“œ์™€ webgl ์‚ฌ์ด์—๋Š” ์ง์ ‘์ ์ธ ํ†ต์‹ ์ด ์—†์œผ๋ฉฐ ๋ชจ๋‘ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๊ณต์œ  ์Šค์™‘ ์ฒด์ธ์„ ํ†ตํ•ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” surfman ์Šค์™‘ ์ฒด์ธ์ด๋‚˜ openxr ์Šค์™‘ ์ฒด์ธ ์œ„์— ์žˆ๋Š” ์Šค์™‘ ์ฒด์ธ API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๊ทธ๊ฒƒ์„ webgl-to-openxr ํ†ต์‹ ์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ „ ์‹œ๊ฐ„ ์ธก์ •์— ๋Œ€ํ•œ ๋Œ€ํ™”์˜ ์ฐธ๊ณ  ์‚ฌํ•ญ:

* 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

Openxr ํ…์Šค์ฒ˜์— ์ง์ ‘ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์ถ”๊ตฌํ•˜๋Š” ์กฐ์‚ฌ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด #25735๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” ์ŠคํŒŒ์ด๋”๋ชฝํ‚ค๊ฐ€ ์žฅ์น˜์—์„œ ๋‹ค๋ฅธ ์—”์ง„๊ณผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ขํžˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ Servo๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ JS ๋ฒค์น˜๋งˆํฌ๋ฅผ ์ฐพ๊ณ  Servo์˜ ์„ฑ๋Šฅ์„ ์žฅ์น˜์— ์„ค์น˜๋œ Edge ๋ธŒ๋ผ์šฐ์ €์™€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชฐ์ž… ๋ชจ๋“œ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  ๋‘ ๋ธŒ๋ผ์šฐ์ € ๋ชจ๋‘์—์„œ ๋ณต์žกํ•œ ๋ฐ”๋นŒ๋ก  ๋ฐ๋ชจ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ์šฐ๋ฆฌ์—๊ฒŒ ๊ณง ์ถœ์‹œ๋  ์ŠคํŒŒ์ด๋”๋ชฝํ‚ค ์—…๊ทธ๋ ˆ์ด๋“œ์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒค์น˜๋งˆํฌ๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ANGLE ์—…๊ทธ๋ ˆ์ด๋“œ์™€ ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ IPC ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

$ 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์ถ•์„ ์ž˜๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด ์ :

  • ๋ Œ๋”๋ง ์‹œ๊ฐ„๊ณผ ์‹คํ–‰ ์‹œ๊ฐ„์€ ๋Œ€๋ถ€๋ถ„ ์•ˆ์ •์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ „์ฒด์ ์œผ๋กœ ์ŠคํŒŒ์ดํฌ๊ฐ€ ํด ๋•Œ ์ŠคํŒŒ์ดํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํฐ ์ŠคํŒŒ์ดํฌ๊ฐ€ ์–ด๋–ค ์ด์œ ์—์„œ๋“  ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋Š” ๋ชจ๋“  ๊ฒƒ์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์†ก ์‹œ๊ฐ„์€ ์ „์ฒด ๋ชจ์–‘๊ณผ ๊ฝค ์ž˜ ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ธฐ์‹œ๊ฐ„๋„ ์ „์ฒด์ ์ธ ๋ชจ์–‘์ด ์ €๋ ‡๊ณ  _๋งค์šฐ_ ๋ฌผ๊ฒฐ

ํ˜„์žฌ ์ƒํƒœ: IPC ์ˆ˜์ •์œผ๋กœ FPS๋Š” ์ด์ œ 55 ์ฃผ๋ณ€์„ ๋งด๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๋ฌด๋ฆฌํ•˜๊ฒŒ ํ”๋“ค๋ฆฌ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ๋“œ ํ›„ ์ฒ˜์Œ ๋ช‡ ์ดˆ ๋™์•ˆ(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+ms: 0

raf ์ „์†ก 0.640677 20.275104 6.944751
<1ms: 2
<2ms: 3
<4ms: 29
<8ms: 513
<16ms: 99
<32ms: 1
32+ms: 0

raf ๋Œ€๊ธฐ 1.645886 40.955208 9.386255
<1ms: 0
<2ms: 10
<4ms: 207
<8ms: 114
<16ms: 236
<32ms: 65
32+ms: 15

raf ์‹คํ–‰ 3.090104 526.041198 6.226997
<1ms: 0
<2ms: 0
<4ms: 68
<8ms: 546
<16ms: 29
<32ms: 1
32+ms: 3

raf ์ˆ˜์‹  0.203334 6.441198 0.747615
<1ms: 554
<2ms: 84
<4ms: 7
<8ms: 2
<16ms: 0
<32ms: 0
32+ms: 0

์Šค์™‘ ์š”์ฒญ 0.003490 73.644322 0.428460
<1ms: 627
<2ms: 18
<4ms: 1
<8ms: 0
<16ms: 0
<32ms: 0
32+ms: 2

raf ๋ Œ๋” 5.450312 209.662969 8.055021
<1ms: 0
<2ms: 0
<4ms: 0
<8ms: 467
<16ms: 176
<32ms: 3
32+ms: 1

run_one_frame 8.417291 2579.454948 22.226204
<1ms: 0
<2ms: 0
<4ms: 0
<8ms: 0
<16ms: 326
<32ms: 290
32+ms: 33

์Šค์™‘ ๋ฒ„ํผ 0.658125 12.179167 1.378725
<1ms: 260
<2ms: 308
<4ms: 72
<8ms: 4
<16ms: 4
<32ms: 0
32+ms: 0

์Šค์™‘ ์™„๋ฃŒ 0.041562 5.161458 0.136875
<1ms: 642
<2ms: 3
<4ms: 1
<8ms: 1
<16ms: 0
<32ms: 0
32+ms: 0

๊ทธ๋ž˜ํ”„:

์žฅ๊ธฐ ์‹คํ–‰:

image

๋” ์งง์€ ์‹คํ–‰:
image

ํฐ ์ŠคํŒŒ์ดํฌ๋Š” ์„ผ์„œ ๋ฒ”์œ„ ๋‚ด์— ์†์„ ๋„ฃ์—ˆ์„ ๋•Œ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” wait/run_one_frame ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๋“ค์ญ‰๋‚ ์ญ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งจ ์œ„์— ๋†“์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” OS๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ์ œํ•œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ:

  • ๋„์ž…๋˜๋Š” ์†์˜ ํฐ ์ŠคํŒŒ์ดํฌ๋Š” JS ์ฝ”๋“œ(basil green, "raf render")๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์ƒ๋Œ€๋กœ ์ „์†ก ์‹œ๊ฐ„์ด ์›ํ™œํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋˜ ๋‹ค๋ฅธ JS ์ŠคํŒŒ์ดํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ Œ๋”๋ง ๋ฐ ์ „์†ก ์‹œ๊ฐ„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ƒ๋‹นํ•œ ์˜ˆ์‚ฐ ๋ฉ์–ด๋ฆฌ์ž…๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์„ฑ๋Šฅ๋„ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Š๋ผ ๋ฐ”๋น ์„œ ์ „์†ก ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. https://github.com/servo/webxr/issues/113 ์ž…๋‹ˆ๋‹ค . @jdm ์ด ์กฐ์‚ฌ ์ค‘์ž…๋‹ˆ๋‹ค.

    • Surfman ์—…๋ฐ์ดํŠธ๋Š” ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Surfmanup ์— ๋Œ€ํ•œ @asajeffrey์˜ ์ธก์ •๊ฐ’์ด ๋‚ด ๊ฒƒ๋ณด๋‹ค ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • ํ‘œ๋ฉด ๊ณต์œ ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(surfmanup์—์„œ ์ฐจ๋‹จ๋จ)

  • xr-profile๋กœ ์ธก์ •ํ•  ๋•Œ ์žฅ์น˜์— ํ‘œ์‹œ๋˜๋Š” FPS๋Š” ๊ฑฐ์˜ ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  IO ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ ๋ณด๊ณ  ๊ทธ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ๊ผฌ์ด๋Š” ๊ฒƒ์€ ๋ณผ์Šˆํ„ฐ์—๊ฒŒ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํŽ˜์ธํŠธ ๋ฐ๋ชจ๋Š” ์ฒ˜์Œ์œผ๋กœ ์† ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ฆฌ๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ๋•Œ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

(์ด๊ฒƒ์€ webxr ์ž…๋ ฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ ์ž‘์šฉ์„ ์‹œ๋„ํ•˜๋Š” ํŽ˜์ธํŠธ ๋ฐ๋ชจ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

@Manishearth ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์˜ค๋ฒ„๋ ˆ์ดํ•˜๊ณ  ํ•ด๋‹น ์ด๋ฒคํŠธ์™€ ์—ฐ๊ด€์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ? JS ์ฝ”๋“œ ์ตœ์ดˆ ์ปดํŒŒ์ผ ์™ธ์—๋„ ์ˆ˜๋งŽ์€ ์ƒˆ ์ฝ”๋“œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์— ๋„๋‹ฌํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์— ๋„๋‹ฌํ•˜๋ฉด ๋งŽ์€ GC๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ ๊ทธ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. @nox ์˜ SM ์—…๋ฐ์ดํŠธ๊ฐ€ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. FxR Android์˜ ์ด SM ๋นŒ๋“œ์—์„œ ๋ถ„๋ช…ํžˆ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

xr-ํ”„๋กœํŒŒ์ผ๋ง ํ•ญ๋ชฉ๊ณผ ์ƒ๊ด€๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์ž ์žฌ์ ์œผ๋กœ ๊ธฐ์กด ์„ฑ๋Šฅ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ์–‘์ด ๋™์ผํ•œ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Manishearth xr- ํ”„๋กœํŒŒ์ผ๋ง ํ•ญ๋ชฉ์ด JS GC ์ด๋ฒคํŠธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๊นŒ(๋˜๋Š” ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ)? ํ•ฉ๋ฆฌ์ ์ธ ๋Œ€๋ฆฌ์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“ , ์‹œ์ž‘ ์ŠคํŒŒ์ดํฌ๋Š” ๋‚˜์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋จผ์ € 60fps์—์„œ ๋ชจ๋“  _else_์„ ์–ป๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ์‹œ 1~2์ดˆ ๋™์•ˆ ๋ฒ„๋ฒ…๊ฑฐ๋ฆฐ๋‹ค๋ฉด ๋œ ์‹œ๊ธ‰ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์•ฝ๊ฐ„์˜ ์กฐ์ •์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Manishearth ์šฐ์„  ์ˆœ์œ„์— ์™„์ „ํžˆ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค! ๋‚˜๋Š” ๋‹น์‹ ์ด "๊ผฌ์ž„ ํ’€๊ธฐ"๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ •์ƒ ์ƒํƒœ๋กœ ์šด์ „ํ•˜๋ ค๊ณ  ํ•˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ›„์ž๊ฐ€ ๋” ์ค‘์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ, ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„ ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ถ„์„์„ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ „์†ก ์‹œ๊ฐ„์ด ๊ธ‰์ฆํ•˜๋Š” ์†Œ๊ทœ๋ชจ ์‹คํ–‰์˜ ๊ทธ๋ž˜ํ”„ ๋ ๊ทผ์ฒ˜์— ์žˆ๋Š” ์ŠคํŒŒ์ดํฌ: ๊ทธ๋•Œ ๋‚ด๊ฐ€ ๋จธ๋ฆฌ๋ฅผ ์›€์ง์ด๋ฉฐ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๊ณ  ์žˆ์—ˆ๊ณ  Alan๋„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ FPS๊ฐ€ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๋Š” OS์˜ ํƒ“์œผ๋กœ ๋Œ๋ ธ์Šต๋‹ˆ๋‹ค. . 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 ๋Š” ํ˜„์žฌ 5ms๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ทธ๋Ÿฐ ๋‹ค์Œ delay = delay * 2; ์—์„œ ๊ฐ ๋ฐ˜๋ณต๋งˆ๋‹ค ๋‘ ๋ฐฐ๋กœ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. while delay < timeout ๋ฃจํ”„์˜ ๋งจ ์œ„์—์„œ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ ˆ์ „ ์ˆœ์„œ๋Š” 5micro -> 10 -> 20 -> 40 -> 80 -> 160 -> 320 -> 640 -> 1.28milli -> 2.56milli -> 5.12milli์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

5.12๋ฐ€๋ฆฌ์ดˆ์— ๋„๋‹ฌํ•˜๋ฉด ๋ฃจํ”„( delay > timeout ์ดํ›„)์—์„œ ๋น ์ ธ๋‚˜์™€ ์ด 5,115๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๋Œ€๊ธฐํ•˜๊ณ  OS๊ฐ€ ๊ฐ sleep ํ›„์— ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šฐ๋Š” ๋ฐ ์†Œ์š”๋œ ์ถ”๊ฐ€ ์‹œ๊ฐ„์„ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค

๊ทธ๋ž˜์„œ ์ œ ์ƒ๊ฐ์— ๋ฌธ์ œ๋Š” ๋‹น์‹ ์ด ์ด 5ms ์ด์ƒ์„ ์ž๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฉ”์‹œ์ง€ ์ดํ›„ 1ms ์ด์ƒ(๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” 2.5ms ์ด์ƒ) ๋™์•ˆ ๋‘ ๋ฒˆ ์ž๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์‹œ๊ฐ„์— ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ณ  ๋‹น์‹ ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž ์žฌ์ ์ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๋‹ค์Œ ๋ฐ˜๋ณต์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹ ?).

https://doc.rust-lang.org/std/thread/fn.yield_now.html ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ž ๊ธˆ์— ๋Œ€ํ•œ ์ด ๊ธฐ์‚ฌ๋ฅผ ๋ณด๋ฉด ๋งค๋ฒˆ yield ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋™์•ˆ ์•ฝ 40๋ฒˆ ํšŒ์ „ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. , ์ตœ์ ์ž…๋‹ˆ๋‹ค("ํšŒ์ „" ๋‹จ๋ฝ ์ฐธ์กฐ, ์ง์ ‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Œ). ๊ทธ ํ›„์—๋Š” ์ˆ˜์‹ ๊ธฐ์—์„œ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ํ˜„์žฌ ๋ฐ˜๋ณต์„ ๊ณ„์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ฃผ ์ž„๋ฒ ๋”ฉ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋‚ด์—์„œ ํ•˜์œ„ ๋ฃจํ”„์ฒ˜๋Ÿผ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—).

(๋ฌผ๋ก , ๋‹น์‹ ์ด ์ธก์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ipc ๋ถ€๋ถ„์— ์œ„ ์ผœ์ ธ recv_timeout ์—ฌ์ „ํžˆ์— calll ์ธก์ • ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ด€๊ณ„๊ฐ€ recv_timeout ์˜จ์„ mpsc ์“ฐ๋ ˆ๋“œ ์ฑ„๋„์€ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ํšŒ์ „/ํ•ญ๋ณต์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ํ™•์ธ๋˜์ง€ ์•Š์€ "IPC ์ˆ˜์ •"์ด ์–ธ๊ธ‰๋˜์—ˆ์œผ๋ฏ€๋กœ ipc๋กœ ์ธก์ •ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ด๋ฏธ ๊ณ ๋ ค๋˜์—ˆ๋‹ค๋ฉด ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค. run_one_frame์˜ ์ธก์ •์„ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๊ธฐ์ค€์œผ๋กœ ๋ถ„์„ํ•˜๊ณ  thread::sleep()-ing์— ์†Œ์š”๋œ ์‹œ๊ฐ„์„ ์ธก์ •ํ•  ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๊นŒ?

์ด๋ฏธ ๋ถ„ํ•ด๋˜์–ด ๋Œ€๊ธฐ/๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ์ •ํ™•ํžˆ ์ด๋ ‡์Šต๋‹ˆ๋‹ค. run_one_frame์˜ ๋‹จ์ผ ํ‹ฑ์€ ํ•˜๋‚˜์˜ ๋ Œ๋”๋ง, ํ•˜๋‚˜์˜ ๋Œ€๊ธฐ ๋ฐ ์ฒ˜๋ฆฌ ์ค‘์ธ ๋ถˆํ™•์‹คํ•œ ์ˆ˜์˜ ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค(ํฌ๊ท€).

recv_timeout์€ ์ธก์ •์— ์ข‹์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

์Šฌํ”„๊ฒŒ๋„ #25678์˜ ์ŠคํŒŒ์ด๋”๋ชฝํ‚ค ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ์ด ๊ฐ€์žฅ ํฐ ๊ฒƒ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฐ๋ชจ์˜ ํ‰๊ท  FPS๊ฐ€ ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค. Hill Valley ๋ฐ๋ชจ๊ฐ€ ์•ฝ๊ฐ„ ์˜ฌ๋ผ๊ฐ”์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ์ธ์ˆ˜ ์—์„œ -Z gc-profile ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Servo๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋งˆ์Šคํ„ฐ์™€ ์ŠคํŒŒ์ด๋”๋ชฝํ‚ค ์—…๊ทธ๋ ˆ์ด๋“œ ๋ถ„๊ธฐ ๊ฐ„์˜ GC ๋™์ž‘์— ์ฐจ์ด๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GL ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋“œ๋˜๊ณ  ํ‘œ์‹œ๋œ ํ›„์—๋Š” GC๊ฐ€ ๋ณด๊ณ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์ง€์ ์— ๋Œ€ํ•œ ์ธก์ •:

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์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ Ion JIT๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด 12FPS์—์„œ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ๋ช‡ ์ดˆ ํ›„์— ๊ฐ‘์ž๊ธฐ 1FPS๋กœ ๊ฐ์†Œํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ๋จธ๋ฌธ๋‹ค.

ํ•ด๋‹น ํŒจ์น˜๋กœ ๋ช‡ ๊ฐ€์ง€ ์ธก์ •์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŽ˜์ธํŠธ์—์„œ ๋ณด๊ธฐ์— ์ฝ˜ํ…์ธ ๊ฐ€ ๋งŽ์ง€ ์•Š์„ ๋•Œ 60fps๋ฅผ ์–ป๊ณ  ๊ทธ๋ ค์ง„ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ ๋•Œ 50ish fps๋กœ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค(๋…ธ๋ž€์ƒ‰ ์ŠคํŒŒ์ดํฌ๋Š” ๋‚ด๊ฐ€ ๊ทธ๋ฆฐ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ ๋•Œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค). ์ด์œ ๋ฅผ ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด openxr ์Šค๋กœํ‹€๋ง์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๋งŒํผ ๋Š๋ฆฌ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์Šค์™‘ ์š”์ฒญ ํƒ€์ด๋ฐ์ด ์•ฝ๊ฐ„ ๋Š๋ฆฝ๋‹ˆ๋‹ค. rAF ์‹คํ–‰ ์‹œ๊ฐ„์€ ์ฒ˜์Œ์—๋Š” ๋Š๋ฆฌ์ง€๋งŒ(์ด๊ฒƒ์ด ์ดˆ๊ธฐ "์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฒ˜์Œ ๋ณผ ๋•Œ" ์†๋„ ์ €ํ•˜์ž„) ๊ทธ ํ›„์—๋Š” ๊ฝค ์ผ์ •ํ•ฉ๋‹ˆ๋‹ค. openxr์ด ์šฐ๋ฆฌ๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ์ด๋ฅผ ์•ผ๊ธฐํ•  ๋ˆˆ์— ๋„๋Š” ์†๋„ ์ €ํ•˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

image

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋“œ๋ž˜๊ทธ ๋ฐ๋ชจ๋ฅผ ์œ„ํ•ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. y ์Šค์ผ€์ผ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์šฐ๋ฆฌ๋ฅผ ๋Š๋ฆฌ๊ฒŒ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

image

ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€ #25837์„ ์ ์šฉํ•œ ์ƒํƒœ์—์„œ ์ธก์ •์„ ํ–ˆ์œผ๋ฉฐ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„๋‹ˆ์—ˆ์ง€๋งŒ ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค

์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ ๋•Œ 60FPS์—์„œ 45FPS๋กœ ์ด๋™ํ•˜๋Š” ์ˆœ๊ฐ„์˜ ์„ฑ๋Šฅ ๋„๊ตฌ ๊ทธ๋ž˜ํ”„:

image

๋น„๋‚œ์€ ์ „์ ์œผ๋กœ xrWaitFrame์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ๋‹ค๋ฅธ ๋ชจ๋“  ํƒ€์ด๋ฐ์€ ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. xrBeginFrame์€ ์—ฌ์ „ํžˆ โ€‹โ€‹xrWaitFrame ์งํ›„์— ์žˆ๊ณ  xrEndFrame์€ xrBeginFrame ์ดํ›„ 4us์ž…๋‹ˆ๋‹ค(๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘). ๋‹ค์Œ xrWaitFrame์€ xrEndFrame ๋ฐ”๋กœ ๋’ค์— ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…๋˜์ง€ ์•Š์€ ์œ ์ผํ•œ ๊ฐ„๊ฒฉ์€ xrWaitFrame ์ž์ฒด์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค.

๋“œ๋ž˜๊ทธ ๋ฐ๋ชจ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

๋‹ค์Œ์€ ๋™์ผํ•œ ์Šค์ผ€์ผ์˜ ํŽ˜์ธํŠธ ๋ฐ๋ชจ์ž…๋‹ˆ๋‹ค.

image

์šฐ๋ฆฌ๋Š” ์‹œ์ž‘/์ข…๋ฃŒ ํ”„๋ ˆ์ž„ ์‚ฌ์ด์— ๋Š๋ฆฌ๊ณ (๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒฝ์šฐ 5ms์—์„œ 38ms๋กœ!) ๋Œ€๊ธฐ ํ”„๋ ˆ์ž„ ์กฐ์ ˆ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์•„์ง ์ด๊ฒƒ์ด ์™œ ๊ทธ๋Ÿฐ์ง€ ์„ค๋ช…ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค.

๋“œ๋ž˜๊ทธ ๋ฐ๋ชจ๋Š” ๊ด‘์›์ด ๊ทธ๋ฆผ์ž๋ฅผ ๋“œ๋ฆฌ์šฐ๋ฏ€๋กœ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์ž ์ž‘์—…์€ GL ์ธก์—์„œ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์‰ฝ๊ฒŒ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์™„์ „ํžˆ GLSL์„ ํ†ตํ•ด ์™„๋ฃŒ๋˜๋ฉด ์–ด๋ ค์›€์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WebGL API๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ํ”„๋ ˆ์ž„์ด ์™„๋ฃŒ๋˜๋ฉด ์ตœ์ ํ™”ํ•  ์œ„์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ๋ชจ๋‘ GLSL ์ชฝ์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„€๋„์šฐ API๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จํ•˜์—ฌ WebGL ํ˜ธ์ถœ์„ ๋ณผ ์ˆ˜ ์—†์—ˆ๊ณ  ์…ฐ์ด๋”๋กœ ์ „๋‹ฌ๋˜๋Š” ์ผ๋ถ€ ๋น„ํŠธ๋งŒ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฐœ๋ณ„ ๋ฐ๋ชจ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰