一. 離屏渲染觸發(fā)的原理:APP在對(duì)圖片進(jìn)行渲染,合并的時(shí)候會(huì)觸發(fā)離屏渲染辙纬,離屏渲染流程先把圖層保存在幀緩沖區(qū)(offscreen Buffer)中平挑,如果這個(gè)圖層需要進(jìn)行渲染.合并就會(huì)把圖層存的數(shù)據(jù)通過頂點(diǎn)著色器.片元著色器,然后放在離屏緩沖區(qū)(offscreenBuffer)中况褪,然后把其他的圖層也是按照這種形式進(jìn)行存儲(chǔ),然后把存放在離屏渲染緩沖區(qū)的圖片取出來進(jìn)行合并.渲染更耻。如果不需要做渲染.合并的時(shí)候回直接渲染在屏幕上测垛,然后直接從幀緩沖區(qū)中移除。而觸發(fā)離屏渲染的方式有:maks,對(duì)圖片進(jìn)行裁剪,對(duì)顏色進(jìn)行透明度的疊加秧均,添加投影食侮,采用光柵畫,繪制文字的時(shí)候目胡。都會(huì)觸發(fā)離屏渲染锯七。
二.在切圓角的時(shí)候。如果你只是設(shè)置了self.type.layer.cornerRadius=2;這個(gè)方法不會(huì)觸發(fā)離屏渲染誉己。只有在設(shè)置了self.type.layer.masksToBounds = YES;這個(gè)方法的時(shí)候才會(huì)觸發(fā)離屏渲染眉尸。因?yàn)?如果只設(shè)置了第一個(gè)方法 只是對(duì)layer層做了圓角設(shè)置。并沒有多圖片的內(nèi)容進(jìn)行裁剪巨双。所以這個(gè)時(shí)候不會(huì)觸發(fā)離屏渲染噪猾,如下圖所示:
三.因?yàn)殡x屏渲染會(huì)使用額外的內(nèi)存空間(離屏渲染緩沖區(qū)),所以離屏渲染會(huì)有性能問題筑累。會(huì)比較容易形成掉幀袱蜡,offscreenBuffer是有空間限制的(屏幕像素點(diǎn)的2.5),離屏渲染有自己的優(yōu)勢(shì)慢宗。離屏渲染在對(duì)于復(fù)雜圖層進(jìn)行渲染的時(shí)候很高效坪蚁。在我們重復(fù)使用一個(gè)渲染效果的時(shí)候我們可以復(fù)用。
四,OpenGL三種渲染方式:1.Attributes(屬性):通過這個(gè)方式我們可以把數(shù)據(jù)傳到頂點(diǎn)著色器里面橋接到片元著色器中(屬性只能把數(shù)據(jù)傳輸?shù)巾旤c(diǎn)著色器中镜沽,不能傳送到片元著色器中) Attributes方式我們只能傳一些頂點(diǎn)數(shù)據(jù)敏晤、矩陣、紋理坐標(biāo)等缅茉。2茵典、Uniforms: 通過這個(gè)方式我們傳一些固定的、不經(jīng)常變動(dòng)的一些數(shù)據(jù)宾舅。通過Uniforms方式 我們可以把數(shù)據(jù)傳輸?shù)巾旤c(diǎn)著色器中统阿,也可以把數(shù)據(jù)傳輸?shù)狡髦小?、Texture Data(紋理數(shù)據(jù))筹我,通過紋理數(shù)據(jù)可以傳輸?shù)巾旤c(diǎn)著色器和片元著色器中扶平,但是紋理數(shù)據(jù)傳到頂點(diǎn)著色器中是毫無意義的。所以我們?cè)倨綍r(shí)開發(fā)中都不會(huì)把紋理數(shù)據(jù)傳輸?shù)巾旤c(diǎn)著色器中蔬蕊。