윈도우 매니저 스터디: 2. 윈도우 매니저 최적화
TRANSCRIPT
http://nemoux00.wordpress.com
컴포지팅 최적화
OPENGL 확장 인터페이스
WAYLAND 확장 프로토콜
소프트웨어 아키텍처 개선
메모리 복사 최소화 메모리 사용을 최소화하고, 불필요한 메모리 전송을 줄여라!
제한된 자원의 스마트기기 활용 범위 확대
고해상도 디스플레이 등장 (레티나, 4K, …)
애니메이션 효과 일반화
지연 모드 지원 SCENE GRAPH 을 잘 관리하여 효과적인 렌더링을 하자!
윈도우 매니저는 SCENE GRAPH 관리 필수
효율적인 화면 갱신 및 불필요한 렌더링 제거 필수
하드웨어 가속 지원 CPU 대신 GPU 를 적극 활용하자!
3D 가속 지원 게임/서비스 지원 필수
컴포지팅을 위한 OpenGL 확장 기능 활용 필수
효과적인 하드웨어 플레인 활용 필수
ZERO-COPY 윈도우 버퍼 공유 및 복사 최소화 가장 기본적인/필수적인 컴포지팅 최적화!!!
버퍼 중복 제거 클라이언트와 서버가 하나의 버퍼 공유 ■ 레퍼런스 기반 버퍼 관리 (공유 메모리/DRM 기반 버퍼)
버퍼 복사 제거 화면이 변경된 부분만 갱신 ■ SCENE GRAPH 을 이용한 효과적인 데미지/클리핑 관리
window (client)
buffer
window (client)
buffer
compositor (server)
framebuffer
buffer
buffer
buffer
damage
damage
: 클라이언트 버퍼 공유 : 수정된 (damaged) 부분만 복사
copy copy
copy
데미지/클리핑 관리 최소 더블 버퍼링 필요 이전 프레임버퍼에서 변경된 부분만 갱신
■ 현재 프레임버퍼 모니터 출력
■ 이전 프레임버퍼 수정된 부분 갱신 후 다음 프레임버퍼로 사용
프레임버퍼 히스토리 관리 필수 (이전 프레임버퍼에 대한 정보 유지)
window (client)
buffer
window (client)
buffer
compositor (server)
framebuffer
buffer
buffer
copy
copy
window (client)
buffer
window (client)
buffer
damage
compositor (server)
copy
framebuffer (old)
buffer
buffer
damage
framebuffer
buffer
buffer
지연 모드(retained-mode) vs 즉시 모드(immediate mode) 지연 모드는 클라이언트의 요청을 모아서 한번에 반영
■ 모든 그래픽 정보 유지/관리 (즉시 모드는 반대)
윈도우 매니저는 일반적으로 지연 모드를 사용하는 것이 유리 ■ 화면 갱신 비율에 맞춰서 효율적인 렌더링 가능 (영상 vs 게임)
■ SCENE GRAPH 을 이용하여 불필요한 렌더링 제거 (데미지/클리핑)
■ 수정된 부분이 다음 화면 갱신 전에 다시 변경이 된다면 무시 가능
scanout
vblank
scanout
vblank
…
60 hz
window (client)
buffer
damage (1st)
window (client)
buffer
damage (2st)
ignore
기존 하드웨어가속 컴포지팅 기본적인 데미지/클리핑 관리 불필요
텍스처 부분 갱신 미지원
프레임버퍼 부분 렌더링 미지원
향후 하드웨어가속 컴포지팅 텍스처 부분 갱신 지원
■ OpenGL 확장 인터페이스 (SUBIMAGE extension)
데미지/클리핑 관리를 통한 부분 렌더링 지원 ■ 프레임버퍼 히스토리 관리
■ OpenGL 확장 인터페이스 (BUFFER_AGE/SWAP_BUFFERS_WITH_DAMAGE extension)
2D 기반 컴포지팅에 OpenGL 을 사용할 때의 문제점 더블 버퍼링을 지원하지만 이전 프레임버퍼에 대한 보장 없음
3D 게임을 지원하는 목적으로 개발되었기 때문에 부분 텍스처 갱신과 렌더링에 대한 지원 없음
…
2D 기반 컴포지팅을 위한 OpenGL 확장 기능 (최신) BUFFER_AGE extension 프레임버퍼 히스토리 관리 지원
SUBIMAGE extension 텍스처 부분 갱신 지원
SWAP_BUFFERS_WITH_DAMAGE extension 부분 렌더링 지원
…
프레임버퍼 히스토리 관리 기능 최근에 추가된 BUFFER_AGE extension 을 이용
이전 프레임버퍼에서 변경된 부분만 갱신하여 다음 프레임버퍼로 활용 가능
■ 이전 프레임버퍼에 이전 변경 사항 복사 (이전 프레임버퍼 현재 프레임버퍼로 변경된 영역)
■ 이전 프레임버퍼에 이번 변경 사항 복사 (현재 프레임버퍼 다음 프레임버퍼로 변경된 영역)
framebuffer (prev)
buffer
buffer
framebuffer
buffer
buffer
framebuffer (next)
buffer
buffer
damage
window (client)
buffer
damage (1st)
window (client)
buffer
damage (2st)
damage
damage
텍스처 부분 갱신 지원 SUBIMAGE extension 이용
GL 렌더러에서 공유 메모리 버퍼를 사용할 때 변경된 부분만 갱신 ■ 기존에는 텍스처를 부분적으로 업데이트하는 것이 불가능
window (client)
buffer
window (client)
buffer
compositor (server)
framebuffer
texture
texture
texture
damage copy damage
부분 렌더링 지원 SWAP_BUFFERS_WITH_DAMAGE extension 이용
BUFFER_AGE extension 과 같이 사용 ■ 이전 프레임버퍼에서 필요한 부분만 다시 렌더링 할 수 있도록 지원
■ 기존에는 전체 프레임버퍼를 한번에 렌더링하는 기능만 제공
■ 해당 확장 기능으로 이전 프레임버퍼를 효과적으로 사용 가능
window (client)
buffer
window (client)
buffer
compositor (server)
framebuffer
texture
texture
texture
damage
damage
rendering
AMD Mantle API 공개 (& APPLE Metal API)
범용성을 중요시 하는 DirectX 와 OpenGL 대체
콘솔 게임은 범용성 보다는 성능 중시 ■ 특정 플랫폼에 최적화된 로우 레벨 API 사용
개별적으로 사용되던 로우 레벨 API 에 대한 표준화 시도 ■ PC 뿐 아니라 다양한 콘솔도 적용 가능
DirectX 와 OpenGL 차기 버전 준비 중 MS 는 Mantle 에 대항할 수 있는 성능을 가진 DirectX 12 준비
NVIDIA, AMD, INTEL 등 다양한 회사에서 OpenGL 최적화 진행
wl_subsurface 프로토콜 효과적인 CSD (Client Side Decoration) 지원
클라이언트에서의 불필요한 서페이스 합성 제거
편리한 윈도우 프레임 지원
영상 재생 어플리케이션 개발 지원
…
APPLICATION
FRAME
WINDOW
APPLICATION
VIDEO
CONTROL
presentation 프로토콜 효과적인 영상 재생 및 UI 애니메이션 지원
시간 동기화 및 큐잉 지원
Maintained by Pekka Paalanen at Collabora
CLIENT (VIDEO)
BUFFER
WAYLAND
WINDOW synchronized video frame
FRAMEBUFFER
CLIENT (VIDEO)
BUFFER
WAYLAND
WINDOW video frame with sync timing
FRAMEBUFFER
WINDOW WINDOW
sync
sync
싱글 스레드 기반 윈도우 매니저/툴킷 엔진 UI 관련 이벤트 처리는 UI 스레드에서 단독으로 처리
입력 이벤트 처리, 렌더링, 애니메이션 등 처리해야 할 작업 증가
관련연구) 리눅스 선점 커널 (2.6), node.js, …
wl_event_loop_dispatch()
dispatch idle source
wait epoll
dispatch fd source
destroy needless source
wl_event_source_fd_dispatch()
wl_event_source_timer_dispatch()
wl_event_source_signal_dispatch()
wl_display_run()
wl_display_flush_clients()
animation, rendering, …
두 개 이상의 병렬 GPU 지원 호스트 + 그래픽 메모리 및 주소공간 관리 (PRIME, IOMMU, …)
병렬 디스플레이 동기화 기술 필요 (NVIDIA Mosaic/QuardSync/SwapSync, …)
RAM
VRAM
PAGE
PAGE
PAGE
PAGE
PAGE
PAGE
PAGE
PAGE
PAGE
GPU0 (GART)
CPU (MMU)
physical address virtual address virtual address
PAGE
PAGE GPU1 (GART)
전체 화면 모드에서 클라이언트가 렌더링한 화면과 결과 화면이 동일
WESTON CLIENT MESA client-side MESA server-side
GPU
batch buffer
texture buffer
frame buffer
local name wl_drm wl_drm
wl_drm_buffer EGLImageKHR
eglSwapBuffers
flush (rendering)
wl_buffer
flush (rendering)
texture buffer
batch buffer
frame buffer
CRTC
마우스 커서 플레인 지원 마우스 커서가 여러 개라면??
하드웨어 플레인 사용 윈도우 선정 같은 플레인에 존재하는 윈도우에 의해 클리핑 되지 않는 윈도우
비교적 화면 갱신이 많은 윈도우
…
현재 WESTON 동작 방식 화면 앞에서 뒤의 순서로 클리핑 되지 않는 윈도우 선정
더블 버퍼링 vs 트리플 버퍼링 프레임버퍼 렌더링/플리핑/스캔아웃 타이밍 고려
vblank vblank vblank vblank
framebuffer0
framebuffer1
vblank vblank vblank vblank
framebuffer0
framebuffer1
1. rendering time < vblank
2. rendering time > vblank (double buffering)
3. rendering time > vblank (triple buffering)
vblank vblank vblank vblank
framebuffer0
framebuffer1
framebuffer2
rendering
rendering rendering
rendering
rendering
rendering
rendering
rendering
rendering
rendering
scan out
scan out
scan out
scan out
scan out
scan out
scan out
scan out
scan out
scan out
scan out
scan out
vsync vsync vsync
page flip
page flip
page flip
page flip
page flip
page flip
윈도우 매니저 기반 디스플레이 동기화 재생률 보장 (영상, …) vs 응답성 보장 (게임, …)
{ 입력 … 출력 } 불확정 요소 ■ 스케줄링, 대기 이벤트 처리, …
■ 렌더링 대기/소요 시간, VSYNC 대기 시간, …
window (client)
compositor (server) keyboard/mouse
GPU event
…
event
handle event
redraw surface
commit surface
display
graph
disp
renderer (mesa/drm)
framebuffer
rendering
pageflip fence
scanout
…