我最近开始学习在Android中使用OpenGLES。我正在使用GLWallpaperService类和渲染创建一个动态壁纸。
问题是在Android模拟器中可以显示动画,但是在测试使用HTC Incredible S设备时,FPS保持在45-50左右,但屏幕仍然是空白的。
以下是代码片段:
onDrawFrame
public void onDrawFrame(GL10 gl) {
float currLevel = curve[(MAX_CURVE_POINT_NO + curveStart - 1)
% MAX_CURVE_POINT_NO];
if (!isCreated) {
isCreated = !isCreated;
_spriteVerices = BufferFactory.createFloatBuffer(8);
spriteTextCordinates = BufferFactory.createShortBuffer(8);
}
_spriteVerices.put(spriteVerices);
spriteTextCordinates.put(spriteTextCordinatesArray);
_spriteVerices.position(0);
spriteTextCordinates.position(0);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_BLEND);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_LINE_SMOOTH);
gl.glEnable(GL10.GL_POINT_SMOOTH);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glScalef(0.8f, 0.8f, 1.0f);
gl.glTranslatef(-0.2f, 0, 0);
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, _spriteVerices);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, spriteTextCordinates);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glPushMatrix();
gl.glTranslatef(1.0f, currLevel, -0.01f);
gl.glColor4f(0.0f, 0.5f, 1.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glPopMatrix();
curve[curveStart] = ekgMap[curveStart]; // ((rand()%32768)/32768.0)*0.4-0.2;
curveStart = (curveStart + 1) % MAX_CURVE_POINT_NO;
}
onSurfaceChanged
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 60f, (float) width / (float) height, 1f, 100f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glTranslatef(0, 0, -5);
gl.glRotatef(30f, 1, 0, 0);
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_RESCALE_NORMAL);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
// Set the color of light bouncing off of surfaces to respect the
// surface color
gl.glEnable(GL10.GL_COLOR_MATERIAL);
setupLightSources(gl);
// Turn on a global ambient light. The "Cosmic Background Radiation", if
// you will.
float[] ambientLightRGB = { 0.3f, 0.3f, 0.3f, 1.0f };
gl.glLightModelfv(GL10.GL_LIGHT_MODEL_AMBIENT, ambientLightRGB, 0);
}
onSurfaceCreated
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
this.loadTexture(gl, mContext, R.drawable.dot);
gl.glClearDepthf(1f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
// Turn on culling, so OpenGL only draws one side of the primitives
gl.glEnable(GL10.GL_CULL_FACE);
gl.glFrontFace(GL10.GL_CCW);
gl.glCullFace(GL10.GL_BACK);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_BLEND);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_LINE_SMOOTH);
gl.glEnable(GL10.GL_POINT_SMOOTH);
}
Thanks,