์ฅ์น์์ ๋ชฐ์ ํ ๋ชจ๋๋ฅผ ์ฌ์ฉํ ๋ ๋ฎ์ FPS ๊ฐ์ ์์ธ์ ๋ํ ์กฐ์ฌ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ์ด๊ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ฐํ์ง ๋ช ๊ฐ์ง ์ ๋ณด:
OpenXR API์ฉ ๋ง์ปค๊ฐ ์๋ ํ์ธํธ ๋ฐ๋ชจ ์ ํ์ ์ ์์ฆ ์ฌํ๋๋ฉฐ ๊ทธ ๊ธฐ๊ฐ ๋์์๋ ํ์๋ฉ๋๋ค.
์ด๋ฌํ ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ์ฃผ์ด์ง๋ฉด ์์ํ๊ธฐ ์ํด ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ์๋ํ ๊ฒ์ ๋๋ค.
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๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์, ๊ทธ๋ฆฌ๊ณ ๋ผ์ค์ ์กฐ์ฌ์ ๋ฐ๋ฅธ ๋ ๋ค๋ฅธ ์ ๋ณด:
ํ๋กํ์ 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 ์ฌ์ฉFiles
ํญ์ WinXR_Perf.wprp๋ฅผ HL ์ฅ์น ํฌํธ์ "์ฑ๋ฅ ์ถ์ "์์ ์ฌ์ฉ์ ์ ์ ์ถ์ ํ๋กํ๋ก ์ฌ์ฉ--features profilemozjs
๋น๋์ด๋ฌํ ์ถ์ (์ฅ์น ํฌํธ์ "์ถ์ ์์"์์ ๊ฐ์ ธ์ด)์ Windows ์ฑ๋ฅ ๋ถ์๊ธฐ ๋๊ตฌ ๋ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋๊ตฌ๋ ์ค๋ ๋ ์ด๋ฆ์ ํ์ํ์ง ์์ง๋ง ๊ฐ์ฅ ๋ง์ CPU๋ฅผ ์ฌ์ฉํ๋ ์ค๋ ๋๋ ์คํ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋จํ๊ฒ ์๋ณํ ์ ์์ต๋๋ค.
ํน์ openxr ํ๋ ์์ ์๊ฐ ๋ถํฌ๋ฅผ ํ๋กํ์ผ๋งํ๋ ค๋ฉด:
CPU ์ฌ์ฉ๋์ ๋ํ ๊ฐ์ฅ ์ ์ฉํ ๋ณด๊ธฐ:
์คํฌ๋ฆฝํธ ์ค๋ ๋์์ ์ฝ๊ฐ ๋ ์ ์ ์์ ์ ์ํํ ์ ์๋ ํ ๊ฐ์ง ๊ฐ๋ฅ์ฑ:
๋ชฐ์ ํ ํ๋ ์์ ๋ ๋๋งํ ๋ ๋ ์ ์ ์์ ์ ์ํํ ์ ์๋ ํ ๊ฐ์ง ๊ฐ๋ฅ์ฑ:
surface_origin_is_top_left
). ๋ชฐ์
ํ ๋ชจ๋๋ ๋ณํ ์์ด ํ๊ดด๋ ์ ์์ต๋๋ค.https://bugzilla.mozilla.org/show_bug.cgi?id=1591346 ๋ฐ jrmuizel๊ณผ์ ๋ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ด๋ จ ๋๋ง๋ฑ๋ถ์ด ์ฝ๋: 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 ํธ์ถ์ ์์ ํ ํผํ๋ ๋ฐฉ๋ฒ์ ์กฐ์ฌํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด์๋ ๋ค์์ด ํ์ํฉ๋๋ค.
๊ทธ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. surfman์ ํ๋ฉด์ ์์ฑํ ์ปจํ ์คํธ์ ๋ํ ์ฐ๊ธฐ ์ก์ธ์ค ๊ถํ๋ง ์ ๊ณตํ๋ฏ๋ก ํ๋ฉด์ด openxr ์ค๋ ๋์ ์ํด ์์ฑ๋ ๊ฒฝ์ฐ WebGL ์ค๋ ๋์์ ์ธ ์ ์์ ๊ฒ์ ๋๋ค. https://github.com/pcwalton/surfman/blob/a515fb2f5d6b9e9b36ba4e8b498cdb4bea92d330/surfman/src/device.rs#L95 -L96
์ ์๊ฒ ๋ฐ์ํฉ๋๋ค. webgl ์ค๋ ๋์์ openxr ๋ ๋๋ง์ ์ํํ๋ค๋ฉด openxr์ ํ ์ค์ฒ์ ์ง์ ๋ ๋๋งํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์ฌ๋ฌ ์ค๋ ๋ฉ ๊ด๋ จ ๋ฌธ์ ๊ฐ ๋ ์ด์ ๋ฌธ์ ๊ฐ ๋์ง ์์ ๊ฒ์ ๋๋ค(์: ์ฌ๋ฌ d3d ์ฅ์น ์ฌ์ฉ์ ๊ธ์งํ๋ eglCreatePbufferFromClientBuffer ๊ด๋ จ ์ ํ ์ฌํญ). ๊ณ ๋ คํ๋ค:
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
์ด์ ๋ํ ์ข์ ๋ฐ์ดํฐ ์๊ฐํ๋ฅผ ์ป๋ ๊ฒ์ ๊น๋ค๋กญ์ต๋๋ค. ๋์ ์ ๊ทธ๋ํ๊ฐ ์ด์์ ์ด์ง๋ง 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
๊ทธ๋ํ:
์ฅ๊ธฐ ์คํ:
๋ ์งง์ ์คํ:
ํฐ ์คํ์ดํฌ๋ ์ผ์ ๋ฒ์ ๋ด์ ์์ ๋ฃ์์ ๋์ ๋๋ค.
์ด๋ฒ์๋ wait/run_one_frame ์๊ฐ์ด ๊ฐ์ฅ ๋ค์ญ๋ ์ญํ๊ธฐ ๋๋ฌธ์ ๋งจ ์์ ๋์์ต๋๋ค. ์ด๋ OS๊ฐ ์ฐ๋ฆฌ๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐธ๊ณ ํ ๋ช ๊ฐ์ง ์ฌํญ:
์์ ๋ณด๊ณ ๊ทธ๋ฆฌ๊ธฐ ์์ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๊ผฌ์ด๋ ๊ฒ์ ๋ณผ์ํฐ์๊ฒ ์กด์ฌํ์ง ์์ต๋๋ค. ์๋ง๋ ํ์ธํธ ๋ฐ๋ชจ๋ ์ฒ์์ผ๋ก ์ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฌ๊ธฐ๋ก ๊ฒฐ์ ํ ๋ ๋ง์ ์์ ์ ์ํํ๊ณ ์์ต๋๊น?
(์ด๊ฒ์ 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์ ์์๋ ์๊ฐ์ ์ธก์ ํ ์๊ฐ์ ํ์ต๋๊น?
์ธ ๊ฐ์ง ์ธก์ ํฌ์ธํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ๋์ ๋ํ https://github.com/servo/webxr/blob/68b024221b8c72b5b33a63441d63803a13eadf03/webxr-api/session.rs#L364
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ํ https://github.com/servo/webxr/blob/2841497966d87bbd561f18ea66547dde9b13962f/webxr-api/lib.rs#L124 ์ ์ฒด์ ์ผ๋ก,
๋ํ thread::sleep
๋ํ ํธ์ถ
recv_timeout
์ ๊ด๋ จํ์ฌ ์ด๊ฒ์ ์์ ํ ์ฌ๊ณ ํด์ผ ํ ์ฌํญ์ผ ์ ์์ต๋๋ค.
๋๋ ํ์์์์ ์ ์ฉ์ฑ์ ๋ํด ์ถ๋ก ํ๊ธฐ๊ฐ ๋ค์ ์ด๋ ต๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ๋๋ง๋ ํ๋ ์์ ๊ณ์ฐํ๊ณ ์์ผ๋ฏ๋ก frame_count
๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ฌ์ฉ ์ฌ๋ก๋ "์๋ง๋ ํ๋ ์์ ๋ ๋๋งํ์ง ์๋ ํ๋ ์ด์์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๋จผ์ ํ๋ ์์ ๋ ๋๋งํ ๋ค์ ๋ฉ์ธ ์ค๋ ๋์ ์ ์ฒด ์ด๋ฒคํธ ๋ฃจํ"?
๋ํ ํ์ฌ ์ฌ์ฉ๋ delay
์ ์ค์ ๊ณ์ฐ์ ๋ํด ๋ช ๊ฐ์ง ์์ฌ์ด ์์ต๋๋ค.
delay = timeout / 1000
์์ ์์ํ๊ณ timeout
๋ ํ์ฌ 5ms๋ก ์ค์ ๋์ด ์์ต๋๋ค.delay = delay * 2;
์์ ๊ฐ ๋ฐ๋ณต๋ง๋ค ๋ ๋ฐฐ๋ก ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค.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์ด ์ฐ๋ฆฌ๋ฅผ ์ ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ค๋ฅธ ๊ณณ์์๋ ์ด๋ฅผ ์ผ๊ธฐํ ๋์ ๋๋ ์๋ ์ ํ๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ๋๋๊ทธ ๋ฐ๋ชจ๋ฅผ ์ํด ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๋๋ค. y ์ค์ผ์ผ์ ๋์ผํฉ๋๋ค. ์ฌ๊ธฐ์์ ์คํ ์๊ฐ์ด ์ฐ๋ฆฌ๋ฅผ ๋๋ฆฌ๊ฒ ํ๋ค๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ถ๋ช ํฉ๋๋ค.
ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ #25837์ ์ ์ฉํ ์ํ์์ ์ธก์ ์ ํ์ผ๋ฉฐ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ ์๋์์ง๋ง ๋๋ ๋น์ ๊ณผ ๋น์ทํ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค
์ฝํ ์ธ ๋ฅผ ๋ณผ ๋ 60FPS์์ 45FPS๋ก ์ด๋ํ๋ ์๊ฐ์ ์ฑ๋ฅ ๋๊ตฌ ๊ทธ๋ํ:
๋น๋์ ์ ์ ์ผ๋ก xrWaitFrame์ ์๋ ๊ฒ ๊ฐ์ผ๋ฉฐ ๋ค๋ฅธ ๋ชจ๋ ํ์ด๋ฐ์ ๋งค์ฐ ๊ฐ๊น์ต๋๋ค. xrBeginFrame์ ์ฌ์ ํ โโxrWaitFrame ์งํ์ ์๊ณ xrEndFrame์ xrBeginFrame ์ดํ 4us์ ๋๋ค(๋ ๊ฒฝ์ฐ ๋ชจ๋). ๋ค์ xrWaitFrame์ xrEndFrame ๋ฐ๋ก ๋ค์ ์์ต๋๋ค. ์ค๋ช ๋์ง ์์ ์ ์ผํ ๊ฐ๊ฒฉ์ xrWaitFrame ์์ฒด์ ์ํด ๋ฐ์ํ๋ ๊ฐ๊ฒฉ์ ๋๋ค.
๋๋๊ทธ ๋ฐ๋ชจ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ถ์ ์ ์ป์ ์ ์์ต๋๋ค.
๋ค์์ ๋์ผํ ์ค์ผ์ผ์ ํ์ธํธ ๋ฐ๋ชจ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์์/์ข ๋ฃ ํ๋ ์ ์ฌ์ด์ ๋๋ฆฌ๊ณ (๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ์ฐ 5ms์์ 38ms๋ก!) ๋๊ธฐ ํ๋ ์ ์กฐ์ ์ด ์์๋ฉ๋๋ค. ์์ง ์ด๊ฒ์ด ์ ๊ทธ๋ฐ์ง ์ค๋ช ํ์ง ์์์ผ๋ฏ๋ก ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ ๋ค.
๋๋๊ทธ ๋ฐ๋ชจ๋ ๊ด์์ด ๊ทธ๋ฆผ์๋ฅผ ๋๋ฆฌ์ฐ๋ฏ๋ก ๋๋ ค์ง๋๋ค. ๊ทธ๋ฆผ์ ์์ ์ GL ์ธก์์ ์ํ๋๋ฏ๋ก ์ฝ๊ฒ ์๋๋ฅผ ๋์ผ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์์ ํ GLSL์ ํตํด ์๋ฃ๋๋ฉด ์ด๋ ค์์ด ์์ ์ ์์ต๋๋ค. WebGL API๋ฅผ ํตํด ๋ชจ๋ ํ๋ ์์ด ์๋ฃ๋๋ฉด ์ต์ ํํ ์์น๊ฐ ์์ ์ ์์ต๋๋ค.
๋ค, ๋ชจ๋ GLSL ์ชฝ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋์ฐ API๊ฐ ์๋ํ๋ ๋ฐฉ์๊ณผ ๊ด๋ จํ์ฌ WebGL ํธ์ถ์ ๋ณผ ์ ์์๊ณ ์ ฐ์ด๋๋ก ์ ๋ฌ๋๋ ์ผ๋ถ ๋นํธ๋ง ํ์๋์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ํด๊ฒฐ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ ์ด ํ์ํ ๊ฐ๋ณ ๋ฐ๋ชจ์ ๋ํ ๋ฌธ์ ๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ์ฌ ์ํ: IPC ์์ ์ผ๋ก FPS๋ ์ด์ 55 ์ฃผ๋ณ์ ๋งด๋๊ณ ์์ต๋๋ค. ๋๋๋ก ๋ฌด๋ฆฌํ๊ฒ ํ๋ค๋ฆฌ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ก๋ ํ ์ฒ์ ๋ช ์ด ๋์(30๊น์ง ๋ด๋ ค๊ฐ ์ ์๋ ๊ณณ) ๋ฐ ๋จผ์ ์์ ๋ด ๋๋ค(20์ผ๋ก ๋ด๋ ค๊ฐ ๋).