그래 픽 시스템
surface 를 설명 하 는 데이터 구 조 는 BufferData 입 니 다.BufferData 는 세계 좌표계 의 window 크기 위 치 를 기록 합 니 다.texture 를 묘사 하 는 클래스 는 Graphic Buffer 입 니 다.Graphic Buffer 는 모델 좌표계 에서 texture 의 크기, 이미지 형식 을 기록 합 니 다.
struct BufferData {
FlatRegion dirtyRegion; //
SmallRect crop; //
uint8_t transform; //
uint8_t reserved[3];
};
다 중 버퍼 기술 을 넣다.Shared BufferStack 을 BufferData 의 버퍼 로 사용 하고 BufferQueue 를 Graphic Buffer 의 버퍼 로 사용 합 니 다.
class SharedBufferStack {
volatile int32_t head; // server's current front buffer
volatile int32_t available; // number of dequeue-able buffers
volatile int32_t queued; // number of buffers waiting for post
volatile int8_t index[NUM_BUFFER_MAX];
BufferData buffers[NUM_BUFFER_MAX];
int8_t headBuf;
};
이 를 통 해 알 수 있 듯 이 Shared BufferStack 은 실제 BufferData 의 대기 열 로 세 개의 포인터 로 팀 에 들 어가 서 팀 을 나 가 는 작업 을 한다.그러면 패키지 가 필요 합 니 다: Shared BufferStack 에 필요 한 메모리 의 도구 류 를 분배 하고 파티 에 들 어 가 는 도구 류 를 분배 합 니 다.이에 따라 Graphic Buffer 는 Graphic Buffer Producer, Grapgic Buffer Consumer, Surface Flinger Consumer 가 있다.
하나의 앱 에 최대 31 개의 surface 가 동시에 존재 하고 31 개의 Shared BufferStack 에 대응 합 니 다.이 Shared BufferStack 및 조작 방법 은 Shared Client 로 봉 인 됩 니 다.호출 체인 은 new SurfaceClient () - > SurfaceFlinger:: createCentry Connection () - > new UserClient () - > new SharedClient ()
APP 가 surface 를 만 드 는 데 편리 하도록 Surface Control 클래스 를 패키지 합 니 다. APP 가 시 작 될 때 new Surface Client () - > new Surface Control () APP 가 Surface Control:: getSurface () 를 호출 하면 surface 를 만 들 수 있 습 니 다.surface 를 만 드 는 동시에 해당 하 는 SharedBufferStack, APP 사 이 드 파티 도구 류 SharedBufferClient 를 만 들 고 시스템 사 이 드 파티 도구 류 SharedBuffer Server 를 만 듭 니 다.호출 체인 은 Surface Control:: getSurface () - > new Surface () - > Surface:: init () - > UserClient:: getTokenForSurface () - > Layer:: setToken () - > new SharedBufferServer () - > new SharedBufferClient ()
위의 호출 체인 에는 자바 층 의 Canvas 호출 을 위 한 OpenGL API 가 포 함 된 Surface 가 있 습 니 다.그래서 View 의 그리 기 와 연결 할 수 있 습 니 다.View. onDraw (Canvas canvas) - > Canvas. drawXX 방법 - > Surface:: XXX 방법 - > OpenGL. API.
APP 측 조작 즉 new View () / View. invalidate () - > onMeasure / onLayout - > Shared Buffer Client:: Dequeue () 시퀀스 에 여유 가 있 으 면 시퀀스 의 첫 번 째 BufferData 를 APP 에 저장 합 니 다 - > APP 는 BufferData 에 데 이 터 를 기록 합 니 다 - > Shared Buffer Client:: Queue ()이 BufferData 를 렌 더 링 시퀀스 에 저장 합 니 다. - > GraphicBuffer 만 들 기 - > onDraw 에서 GraphicBuffer 에 데 이 터 를 기록 합 니 다. - > Surface Client:: signal Server () 알림 시스템 업데이트 화면 입 니 다.
시스템 사 이 드 조작 은 앱 측 에서 보 내 온 알림 을 받 고 Shared BufferStack 을 순환 적 으로 검사 하기 시작 하 는 Looper 작업 으로, 렌 더 링 할 BufferData 가 있 으 면 렌 더 링 화면 을 꺼 내 렌 더 링 할 BufferData 가 순환 을 멈 추고 다음 앱 에서 보 내 오 는 알림 을 기다 리 고 있 습 니 다.순환 마다 16ms 의 간격 이 있다.이 Looper 스 레 드 는 Surface Flinger: threadLoop () 입 니 다.
한 순환 에서 몇 가지 작업 을 해 야 합 니 다: handle PageFlip () handle Repaint () post Framebuffer ()
앞의 두 단계 의 진정한 집행 은 Layer 류 입 니 다.Layer 에는 두 개의 변수 가 있 습 니 다. mCurrent State / mDrawingState, 즉 더 블 버퍼 입 니 다.PageFlip 은 이 두 변 수 를 교환 하여 front page 를 back page 로 바 꾸 어 데 이 터 를 받 고 back page 를 front page 로 바 꾸 어 표시 한 다 는 뜻 이다.Layer 계산 matrix 와 mesh - > matrix 를 texture - > RenderEngin 에 가 하여 texture 와 mesh 에 따라 그립 니 다.
Z - order 에 따라 최상 위 레이 어 에서 최 하층 으로 옮 겨 다 니 는 것 을 주의 하 세 요.최상 위 에서 계 산 된 mesh 는 원래 의 전체 사각형 (가 려 지지 않 았 기 때문에) 이 고 2 층 에서 계 산 된 mesh 는 보 이 는 구역 visiable Region 만 있 으 며 상층 투명 구역 에 덮 인 부분 을 포함한다.visiableRegion 은 원래 의 사각형 과 상층 의 불투명 한 구역 에서 감소 할 수 있 습 니 다. 그러면 visiableRegion 의 데이터 구 조 는 바로 다음 과 같 습 니 다.
struct Geometry{
uint32_t w; //
uint32_t h; //
Rect crop; // ,
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.