• libgdx学习记录20——多线程MultiThread资源处理


    在libgdx中,一般的逻辑流程都在rende()函数中执行,这个函数是由opengl的渲染线程调用的,一般的图形显示和逻辑处理都在这个线程中。

    一般情形下,在这个线程中处理就行了。但是当某些逻辑处理比较费时,可能会引起画面卡顿、不连贯等现象。这时,可以将主要的逻辑处理放在另一个线程中,然后再即将进行图形渲染时再将其传送到render线程中执行。

    回传采用Gdx.app.postRunnable()函数,该函数调用后,回传的那部分代码会在下一次render()函数调用之前执行。

    具体实例:

      1 package com.fxb.newtest;
      2 
      3 import com.badlogic.gdx.ApplicationAdapter;
      4 import com.badlogic.gdx.Gdx;
      5 import com.badlogic.gdx.graphics.Color;
      6 import com.badlogic.gdx.graphics.GL10;
      7 import com.badlogic.gdx.graphics.Texture;
      8 import com.badlogic.gdx.graphics.g2d.BitmapFont;
      9 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
     10 import com.badlogic.gdx.graphics.g2d.TextureRegion;
     11 import com.badlogic.gdx.utils.Array;
     12 
     13 public class Lib020_Thread extends ApplicationAdapter{
     14 
     15     float currentTime;
     16     //float lastTime;
     17     
     18     SpriteBatch batch;
     19     BitmapFont font;
     20     int count = 0;
     21     
     22     Array<TextureRegion> array1 = new Array<TextureRegion>();
     23 
     24     
     25     Thread thread = new Thread(){
     26         @Override
     27         public void run() {
     28             // TODO Auto-generated method stub
     29             //final int a = 2;
     30             
     31             try{
     32                 while(true)
     33                 {
     34                     Thread.sleep( 1000 );        
     35                     count++;    
     36                     
     37                     if( count == 3 ){
     38                         Gdx.app.postRunnable(new Runnable(){
     39                             @Override
     40                             public void run() {
     41                                 // TODO Auto-generated method stub
     42                                 TextureRegion region = new TextureRegion( new Texture( Gdx.files.internal( "data/pal4_1.jpg" ) ) );
     43                                 array1.add( region );
     44                             }
     45                         });
     46                     }
     47                     if( count == 5 ){
     48                         Gdx.app.postRunnable(new Runnable(){
     49                             @Override
     50                             public void run() {
     51                                 // TODO Auto-generated method stub
     52                                 TextureRegion region = new TextureRegion( new Texture( Gdx.files.internal( "data/badlogic.jpg" ) ) );
     53                                 array1.add( region );
     54                             }
     55                         });
     56                     }
     57                 }            
     58             }
     59             catch(Exception e){
     60                 e.printStackTrace();
     61             }            
     62         }
     63     };
     64     
     65     
     66     @Override
     67     public void create() {
     68         // TODO Auto-generated method stub
     69         super.create();
     70         
     71         batch = new SpriteBatch();
     72         font = new BitmapFont();
     73         font.setColor( Color.BLACK );
     74         
     75         thread.start();
     76         
     77         //array1.add( new TextureRegion( new Texture( Gdx.files.internal( "data/badlogic.jpg" ) ) ) );        
     78     }
     79 
     80     @Override
     81     public void render() {
     82         // TODO Auto-generated method stub
     83         super.render();
     84         Gdx.gl.glClearColor( 1, 1, 1, 1 );
     85         Gdx.gl.glClear( GL10.GL_COLOR_BUFFER_BIT );
     86         
     87         batch.begin();
     88         
     89         
     90         float width = 0;
     91         for( int i=0; i<array1.size; ++i ){
     92             batch.draw( array1.get(i), width, 0 );
     93             width += array1.get(i).getRegionWidth()+5;
     94         }
     95         font.draw( batch, ""+count, 100, 280 );    
     96         batch.end();
     97 
     98     }
     99 
    100     @Override
    101     public void dispose() {
    102         // TODO Auto-generated method stub
    103         super.dispose();
    104         font.dispose();
    105         batch.dispose();
    106     }
    107     
    108 }

    运行效果:

    刚开始没有加入图片纹理区域:

    第3秒后加入第一幅图片纹理区域:

    第5秒加入第二幅图片纹理区域:

    当某些逻辑运算或资源加载比较费时时,可以考虑多线程方式。

  • 相关阅读:
    【转】【python】装饰器的原理
    Common Subsequence---最长公共子序列
    N个数的全排列 -------指定排头法
    Oil Deposits----深搜问题
    Worm
    亲和串
    n个数的最小公倍数
    整除的尾数
    Substrings 子字符串-----搜索
    N的互质数----欧拉函数
  • 原文地址:https://www.cnblogs.com/MiniHouse/p/3778126.html
Copyright © 2020-2023  润新知