1. 接口使用不當
1)GLES中的glAAx 形式的接口使用,glTranslatex,glRotatex,glScalex等函數。
float posx = 100.0f, posy = 100.0f, posz = 100.0f;
glTranslatef(posx, posy, posz);
//等價於
int fpX = (int)(posx * 65536), fpY = (int)(posy * 65536), fpZ = (int)(posz * 65536);
glTranslatex(fpX, fpY, fpZ);
public void setRenderer(Renderer renderer) {
checkRenderThreadState();
if (mEGLConfigChooser == null) { // here
mEGLConfigChooser = new SimpleEGLConfigChooser(true);
}
if (mEGLContextFactory == null) {
mEGLContextFactory = new DefaultContextFactory();
}
if (mEGLWindowSurfaceFactory == null) {
mEGLWindowSurfaceFactory = new DefaultWindowSurfaceFactory();
}
mGLThread = new GLThread(renderer);
mGLThread.start();
}
/**
* This class will choose a RGB_565 surface with
* or without a depth buffer.
*
*/
private class SimpleEGLConfigChooser extends ComponentSizeChooser {
public SimpleEGLConfigChooser(boolean withDepthBuffer) {
super(5, 6, 5, 0, withDepthBuffer ? 16 : 0, 0);
}
}
4)android中不同資源目錄導致紋理資源被隱式修改:2冪次的紋理放在drawable目錄下,在高分屏android機器上從drawable中加載紋理資源後進行1.2倍隱式擴充,導致紋理不再是2的冪次。http://www.linuxidc.com/Linux/2014-03/98793.htm
1)上次適配AntTweakBar GLES時,它庫中EndDraw函數結束繪制時將當前矩陣堆棧設為TEXTURE_MATRIX,下次進入渲染函數時在BeginDraw中各種嘗試修改模型視圖失效實際修改的都是紋理矩陣,glGetError返回也為0。
2)批量繪制地圖上路網數據, 阈值達到一定程度,隨機性crash!// 所有item同步做動畫
glScale(scalex, scaley, scalez);
batch_draw_100_itmes();
// 不同步動畫
// V1 通過opengl做動畫
for (int cursor = 0; cursor < 100; cursor++)
{
glScale3fv(items[cursor].scaleVar);
items[cursor].single_draw_item();
}
// V2 CPU對頂點進行計算,然後批量繪制
for (int cursor = 0; cursor < 100; cursor++)
{
cpu_scale_vertices(items[cursor].scaleVar);
}
batch_draw_100_items();
當每個item動畫個異步執行時,V1的實現item縮放過度依賴於opengl,而且沒法實現批處理! V2犧牲點CPU計算性能換來GPU的批量繪制。
改進:cpu_scale_vertices操作可以單獨在update線程中執行, batch_draw_100_items在GL繪制線程中。 4)一幀繪制中,FBO不能切換過頻繁。做路況渲染中,為每個256*256的瓦片建立一個FBO,FBO直接與紋理關聯;每幀可能繪制3-5個瓦片,即進行3-5次FBO切換。實測發現FBO切換開銷遠大於數據上傳OpenGL的開銷。 5)一些非常耗性能操作: