Drawing slowed down after resume.

Problems with Canvas, OpenGL, etc...

Drawing slowed down after resume.

Postby Quipeace » Wed Oct 06, 2010 8:11 pm

Hello, me again :P,

Yeah, guess what, I'm stuck again. I'll just skip the introduction, because I think you all know that by now..
My openGL renderer usually runs at approx 60FPS, while the logic thread runs at about 200FPS. When I move away from my application by opening another application and go back to my app the drawing slows down, jumping between 52/56 when idle and occasionally as low as 40FPS. The logic thread continues to run at 200FPS, so that isn't the problem.

Even though 40FPS seems high enough, the drawing looks choppy. I can "restore" the framerate by killing my app and restarting it, so I assume it's a pause/resume thing.

I really hope you guys have seen it before, because I have no idea where to start looking. Even when I remove the drawing functions from onDraw the framedrop seems to occur, although I obviously can't see whether it's choppy or not.

My code is a bit messy, but I'll post it anyway:

RENDERER:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.         @Override
  2.         public void onDrawFrame(GL10 gl)
  3.         {
  4.                 if(System.currentTimeMillis() - start > 250)
  5.                 {
  6.                         Log.i("LauncherGL", "RENDERER FPS: " + frames*4);
  7.                         frames = 0;
  8.                         start = System.currentTimeMillis();
  9.                 }
  10.                
  11.                 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  12.                
  13.                 if(!updateScreen.isAlive())
  14.                 {
  15.                         Log.i("LauncherGL", "Start Thread");
  16.                         updateScreen.start();
  17.                 }
  18.        
  19.                 //drawHome(gl);        
  20.                 drawAppDrawer(gl);
  21.                
  22.                 frames++;
  23.         }
  24.  
  25.         @Override
  26.         public void onSurfaceChanged(GL10 gl, int w, int h)
  27.         {
  28.                 if(!appInfos.get(0).loaded)
  29.                 {
  30.                         for (int i = 0; i < appInfos.size() && i < 150; i++)
  31.                         {
  32.                                 appInfos.get(i).texID = loadTexture(gl, appInfos.get(i).icon, 64, 64);
  33.                                 shortcut[i] = new shortcutTile();
  34.                         }
  35.                         view = LauncherGL.getView();           
  36.                         drawerTexID = loadTexture(gl, view.getDrawable(R.drawable.drawer), 512, 64);           
  37.                         appDrawer = new drawerTile(drawerWidth, drawerHeight); 
  38.                         appInfos.get(0).loaded = true;
  39.                
  40.                         gl.glMatrixMode(GL10.GL_PROJECTION);
  41.                         float ratio = (float) w / (float) h;
  42.                         screenSize[0] = w;
  43.                         screenSize[1] = h;
  44.                         virtualSize[0] = 500;
  45.                         virtualSize[1] = (float) 500.0f / (float) ratio;
  46.                         gl.glFrustumf(-virtualSize[0]/2, virtualSize[0]/2, virtualSize[1]/2, -virtualSize[1]/2, 0.1f, 1);
  47.                         gl.glViewport(0, 0, screenSize[0], screenSize[1]);
  48.                        
  49.                         tileSpacingX = (virtualSize[0]/nAppsX);
  50.                         tileSpacingY = (virtualSize[1]/nAppsY);
  51.                         xPadding = (tileSpacingX-70)/2;
  52.                         yPadding = (tileSpacingY-70)/2;        
  53.                        
  54.                         drawerX = 0-(drawerWidth/2);
  55.                        
  56.                         gl.glMatrixMode(GL10.GL_MODELVIEW);
  57.                         gl.glEnable(GL10.GL_DEPTH_TEST);
  58.                        
  59.                         dynamics.setVars(this, LauncherGL.getView());
  60.                        
  61.                         start = System.currentTimeMillis();
  62.                         Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_DISPLAY);
  63.                 }
  64.         }
  65.  
  66.         @Override
  67.         public void onSurfaceCreated(GL10 gl, EGLConfig config)
  68.         {
  69.                 _gl = gl;
  70.                
  71.                 dynamics = LauncherGL.getDynamics();
  72.                 flags = LauncherGL.getFlags();
  73.                
  74.                 gl.glClearColor(0f, 0f, 0f, 0.0f);
  75.                 gl.glEnable(GL10.GL_CULL_FACE);
  76.                 gl.glFrontFace(GL10.GL_CCW);
  77.                 gl.glCullFace(GL10.GL_BACK);
  78.  
  79.                 gl.glEnable(GL10.GL_TEXTURE_2D);
  80.                 gl.glShadeModel(GL10.GL_SMOOTH);
  81.                 gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
  82.                 gl.glEnable(GL10.GL_BLEND);
  83.         }
  84.         public void deleteTextures()
  85.         {
  86.                 int texArray[] = new int[150];
  87.                 int i = 0;
  88.                
  89.                 for (i=0; i < appInfos.size(); i++)
  90.                         texArray[i] = appInfos.get(i).texID;
  91.                 texArray[i+1] = drawerTexID;
  92.                
  93.                 _gl.glDeleteTextures(texArray.length, texArray, 0);
  94.                 appInfos.get(0).loaded = false;
  95.         }
  96.        
  97.        
  98.         public void drawHome(GL10 gl)
  99.         {
  100.                 gl.glLoadIdentity();
  101.                 homeY = dynamics.getHomeYCoord();
  102.                 gl.glTranslatef(homeX, homeY, 0);
  103.         }
  104.         public void drawAppDrawer(GL10 gl)
  105.         {
  106.                 gl.glLoadIdentity();
  107.                 drawerY = dynamics.getDrawerYCoord();
  108.                 appsY = dynamics.getAppsYCoord();      
  109.  
  110.                 gl.glTranslatef(drawerX, drawerY, -0.10001f);
  111.                 gl.glBindTexture(GL10.GL_TEXTURE_2D, drawerTexID);
  112.                 appDrawer.draw(gl);
  113.  
  114.                 gl.glTranslatef(-((virtualSize[0]/2)-(drawerWidth/2))+xPadding, tileSpacingY/2 + appsY, 0);
  115.  
  116.                 int x = 0;
  117.                 int y = 0;
  118.                 for (int i = 0; i < appInfos.size(); i++)
  119.                 {
  120.                         if (x == nAppsX)
  121.                         {
  122.                                 gl.glTranslatef(-tileSpacingX*nAppsX, tileSpacingY , 0);
  123.                                
  124.                                 x = 0;
  125.                                 y++;
  126.                         }
  127.                         gl.glBindTexture(GL10.GL_TEXTURE_2D, appInfos.get(i).texID);
  128.                         shortcut[i].draw(gl);
  129.                         gl.glTranslatef(tileSpacingX, 0, 0);
  130.                         x += 1;
  131.                 }
  132.         }
  133.  
Parsed in 0.043 seconds, using GeSHi 1.0.8.4


ACTIVITY:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.     @Override
  2.     public void onCreate(Bundle savedInstanceState)
  3.     {
  4.         super.onCreate(savedInstanceState);    
  5.  
  6.         view = new LauncherView(this);
  7.         renderer = view.getRenderer();  
  8.         flags = new Flags();
  9.         dynamics = new ScreenDynamics();
  10.        
  11.         /*mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
  12.         List<Sensor> mySensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
  13.         if(mySensors.size() > 0)
  14.         {
  15.             mSensorManager.registerListener(this, mySensors.get(0), SensorManager.SENSOR_DELAY_NORMAL);
  16.             Toast.makeText(this, "Start ORIENTATION Sensor", Toast.LENGTH_LONG).show();      
  17.         }*/
  18.        
  19.         getAllPackages();      
  20.         setContentView(view);
  21.     }
  22.    
  23.     @Override
  24.     protected void onPause()
  25.     {
  26.         super.onPause();
  27.         flags.setUpdateScreenRunning(false);
  28.         renderer.deleteTextures();
  29.         view.onPause();
  30.     }
  31.     @Override
  32.     protected void onResume()
  33.     {
  34.         super.onResume();
  35.         flags.setUpdateScreenRunning(true);
  36.         view.onResume();
  37.         view.requestRender();
  38.     }
  39.     @Override
  40.     protected void onDestroy()
  41.     {
  42.         super.onDestroy();
  43.         flags.setKillUpdateScreen(true);
  44.     }
  45.    
  46.     @Override
  47.     public boolean onKeyDown(int keyCode, KeyEvent event)  {
  48.         if (keyCode == KeyEvent.KEYCODE_BACK)
  49.         {
  50.                 if(flags.getDrawerOpen())
  51.                         dynamics.setDrawerYVelocity(5);
  52.                 else
  53.                         dynamics.setDrawerYVelocity(-5);
  54.             return true;
  55.         }
  56.         return super.onKeyDown(keyCode, event);
  57.     }
Parsed in 0.037 seconds, using GeSHi 1.0.8.4
Quipeace
Developer
Developer
 
Posts: 27
Joined: Tue Feb 23, 2010 4:00 pm

Top

Return to Android 2D/3D Graphics - OpenGL Problems

Who is online

Users browsing this forum: No registered users and 2 guests