歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android游戲編程之SurfaceView進行連續渲染

Android游戲編程之SurfaceView進行連續渲染

日期:2017/3/1 10:01:57   编辑:Linux編程

SurfaceView類是一個用於處理Surface的視圖,也是Android API提供的另一個類。

什麼是Surface?它是一個抽象的原是緩沖區,被屏幕組合器用於渲染特定視圖。屏幕組合器是Android上所有渲染的幕後推手,並最終負責將所有的像素點推送到GPU。

我們的目標就是在一個獨立的線程中執行渲染,而不用大量占用UI線程,因為UI線程還有很多工作要做。SurfaceView類提供了一種在UI線程之外的線程中進行渲染的方式。

SurfaceHolder和鎖定

為了在UI線程之外的另一個不同線程中渲染到SurfaceView,我們需要獲得一個SurfaceHolder類的實例,如下所示:

SurfaceHolder holder = surfaceView.getHolder();

SurfaceHolder是Surface的一個包裝,可為我們做一些輔助工作。它提供兩個方法:

Canvas SurfaceHolder.lockCanvas();

SurfaceHolder.unlockAndPost(Canvas canvas);

第一個方法鎖定Surface用於渲染並返回一個可用的Canvas實例。第二個方法解鎖Surface並確保通過Canvas進行繪制的內容可顯示在屏幕上。我們將在渲染線程中使用這兩個方法以獲取Canvas,通過它進行渲染並最終確保我們渲染的圖像能在屏幕上可見。我們必須確保傳遞到SurfaceHolder.unlockAndPost()方法的Canvas與從SurfaceHolder.lockCanvas()方法接收的相同。

當SurfaceView被實例化時,Surface並沒有立即創建。相反,它是異步創建的。每當活動暫停或再次恢復而重新創建時,該Surface都將被銷毀。

Surface的創建與有效性

只要Surface沒有生效,我們就不能從SurfaceHolder中獲取Canvas。不過,我們可以通過下面的語句來查看Surface是否已被創建:

boolean isCreated = surfaceHolder.getSurface().isValid();

如果該方法返回true,我們就可安全的鎖定該Surface並通過接收到的Canvas來在其上進行繪制。我們必須絕對確保在調用SurfaceHolder.lockCanvas()之後再次解鎖Surface,否則我們的活動可能會鎖定手機。

Copyright © Linux教程網 All Rights Reserved