그래 픽 시스템

4067 단어
디자이너 의 수 요 는 모든 window 가 독립 된 모듈 로 디자인 할 수 있다 는 것 이다.window 의 트 리 구조, 각 노드 가 화면 에 있 는 크기 위치 와 무늬 를 표현 하 는 방식 이 필요 합 니 다.시스템 이 해결 해 야 할 일 은 디자이너 가 디자인 한 window 트 리 구 조 를 식별 하고 OpenGL 의 API 로 그 릴 수 있다 는 것 이다.많은 window 가 그림 을 합성 하여 화면 에 표시 합 니 다.
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;  //       ,        

좋은 웹페이지 즐겨찾기