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秒加入第二幅图片纹理区域:

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

posted @   丛林小阁楼  阅读(780)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示