序:開始決定寫東西辟宗,內(nèi)容不限,關(guān)于工作內(nèi)容的吝秕,關(guān)于自己業(yè)余研究的泊脐,關(guān)于生活的...因?yàn)橹挥袑懴聛恚悸凡艜?huì)更清晰烁峭,印象才會(huì)更深刻容客,更可以Share秕铛。ps:我是個(gè)女碼農(nóng),現(xiàn)在從事Unity游戲缩挑、應(yīng)用的開發(fā)但两。不要試圖問一個(gè)女生為什么選擇這個(gè)職業(yè),做了就是做了供置,并且要做好谨湘。
Ok,well這次簡短點(diǎn)芥丧,我最近碰到一個(gè)關(guān)于Unity截屏的問題紧阔。用過的人很快會(huì)想到兩種截屏的方式:
Application.CaptureScreenshot(string file name),這會(huì)截取當(dāng)前屏幕保存為png格式续担,存放在Application.dataPath(PC/Mac)擅耽,Application.persistantDataPath(移動(dòng)設(shè)備)。如果需要獲取圖片用作顯示物遇,或保存在系統(tǒng)照片集下乖仇,就需要通過www的方式讀取后再做處理,不是很方便询兴。
Texture2D.ReadPixels(Rect source, int destX, int destY, bool recaculateMipmaps=true), 這會(huì)讀取指定區(qū)域內(nèi)的屏幕像素至一張texture中乃沙,用于UI顯示、保存等蕉朵。相比方法一更方便直觀崔涂。我們大多數(shù)都是采用該方法阳掐。
但是始衅,最近碰到的問題是,在一些低端性能差點(diǎn)的Android設(shè)備上缭保,用以上兩種方式截出來的圖是黑色(像素值全是0)汛闸,用了coroutine方式WaitEndOfFrame,試圖修改Texture2D的format艺骂、size诸老,放在Monobehavior.OnPostRender()中...試過想到的各種方法均無效琐旁,也沒有報(bào)warning柠偶、error。就想到嘗試用第三種方式來實(shí)現(xiàn):RenderTexture赔蒲。
通過將Camera的內(nèi)容渲染到一張RT中忧额,然后用Texture2D.ReadPixels()方法從當(dāng)前的RT中讀取厘肮,結(jié)果可行!代碼如下:
public static Texture2D CaptureCamera(Rect rect, params Camera[] cameras)
{
RenderTexture rt = new RenderTexture ((int)Screen.width, (int)Screen.height, 24);
//臨時(shí)設(shè)置相關(guān)相機(jī)的targetTexture為rt, 并手動(dòng)渲染相關(guān)相機(jī)
for (int i=0; i<cameras.Length; i++)
{
if(cameras[i] != null)
{
cameras[i].targetTexture=rt;
cameras[i].Render();
}
}
//激活這個(gè)rt, 并從中中讀取像素睦番。
RenderTexture.active = rt;
Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
screenShot.ReadPixels(rect, 0, 0); //注:這個(gè)時(shí)候类茂,它是從RenderTexture.active中讀取像素
screenShot.Apply();
//重置相關(guān)參數(shù)耍属,以使用camera繼續(xù)在屏幕上顯示
for(int i=0; i<cameras.Length; i++)
{
if(cameras[i] !=null)
cameras[i].targetTexture = null;
}
RenderTexture.active = null;
GameObject.Destroy(rt);
return screenShot;
}
分析原因,有如下推斷:Android渲染采用了雙緩沖巩检,而前兩種方式是從繪制到當(dāng)前屏幕的framebuffer中讀數(shù)據(jù)厚骗,當(dāng)設(shè)備運(yùn)行慢時(shí),在Unity調(diào)用接口所讀到的數(shù)據(jù)是從正在寫入的framebuffer里面的兢哭,還沒有swap送入屏幕顯示领舰,所以讀到的像素值為0。采用RenderTexture方式將Camera繪制內(nèi)容寫入texture中厦瓢,從該texture中讀取數(shù)據(jù)能夠解決上述問題提揍,確保數(shù)據(jù)有效。
這是我的一個(gè)推斷煮仇,可能是其他原因劳跃,搜索以及debug無果,希望以后的開發(fā)中能徹底知曉原因浙垫。