在基于LibGdx的Android游戏中绘制200个纹理



当我在同一个屏幕上绘制更多大约100-200个纹理时,设备会变得非常慢,应用程序会毫无例外地崩溃。你能告诉我在不影响性能的情况下拥有100个纹理的最佳方法吗。

  • 我正在使用TextureAtlas中的TextureRegion

MainGame

public void render(SpriteBatch sb) {
    // TODO Auto-generated method stub
    // System.out.println("BallPoolGame Screen - render"); 
    batch = sb;
    sb.setProjectionMatrix(camera.combined);
    sb.begin();
    sb.draw(BACKGROUND_BALL_POOL, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); 
    cellManager.draw(sb); 
    ballManager.draw(sb); 
    sb.end();
}

private void setGameTextures() {
    gameScreenAtlas = new TextureAtlas("data/texturetutorialpack.pack"); 
    RED_BALL  = gameScreenAtlas.findRegion("redball"); 
//  RED_BALL.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear);
    BLUE_BALL = gameScreenAtlas.findRegion("blueball"); 
//  BLUE_BALL.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear);
    GREEN_BALL = gameScreenAtlas.findRegion("greenball"); 
//  GREEN_BALL.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear);
}

CellManager

public void draw(SpriteBatch sb){   
    batch=sb; 
    showImageTexture(MODEL1,207,1);  
    if(showSelectedCell){      
        if(allPossiblePathSize>0)
            setupBoardCellTexture();  
        showImage(CELL_SELECTED, rowCoordinate[cellRow], colCoordinate[cellCol]); 
    } 
}
private void setupBoardCellTexture(){ 
    for(CellGrid c : masterGrid){  
        if(cellTextureIndicator[c.getRow()][c.getCol()]==1){
            showImage(CELL_ALL_PATH_TEXTURE,c.getRowCoordinate() ,c.getColCoordinate() );    
        } 
    }
}
private void showImage(TextureRegion tr, float rowCoordinate, float colCoordinate) {
    batch.draw(tr, colCoordinate,rowCoordinate);
} 

BallManager

public void draw(SpriteBatch sb) {
    batch = sb;
    setupBoardBallTexture();
    if (moveTheBall) {
        updateBallPosition();
        showImage(ball.getTextureRegion(), moveRow + 6, moveCol + 6);
    }
    squeezeBalls.draw(sb);
}

您缺少一些关于您的应用程序的基本数据,需要回答以下问题:

  1. 一个纹理的平均大小(大小:widthxheight)
  2. 此错误发生在哪个设备上(某些设备的填充率可能低于其他设备)
  3. TextureAtlas使用什么纹理过滤器(LINERAL、NEAREST…)

我猜你们正在尝试绘制许多纹理事件,如果它们在视线之外的话。如果是这种情况,则必须检查单元是否对摄影机可见。

另一种猜测是,您试图使用LINERAL TextureFilter绘制过多的元素。当使用线性作为纹理过滤器时,gpu需要比最近的点采样更多的点(我认为这是采样的4倍;所以理论上你的gpu绘制400-800个纹理;取决于图像大小,这对于移动gpu填充率来说太多了)

试着描述更多的情况,然后我可能会对你的问题有更多的了解。

最新更新