How to draw lots of bitmaps on screen in an Android game without slow performance

前端 未结 6 1985
一个人的身影
一个人的身影 2020-12-28 20:32

I want to make a tile based game for android. At the moment I am drawing each tile as a separate bitmap. I have a big for loop that reads from a string and draws different

6条回答
  •  萌比男神i
    2020-12-28 20:38

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.util.AttributeSet;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    
    public class MapLoader extends SurfaceView implements SurfaceHolder.Callback,
        Runnable {
    
    SurfaceHolder holder;
    Thread thread;
    
    Bitmap grass = BitmapFactory.decodeResource(getResources(),
            R.drawable.tilemapdemo);
    boolean running = false;
    
    int[][] grassCoords = new int[][] { { 0, 16, 32, 48, 64 },
            { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 },
            { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 } };
    
    public MapLoader(Context context, int width, int height) {
        super(context);
    
        holder = getHolder();
        holder.addCallback(this);
    }
    
    public MapLoader(Context context, AttributeSet attrs) {
        super(context, attrs);
    
        holder = getHolder();
        holder.addCallback(this);
    }
    
    public MapLoader(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    
        holder = getHolder();
        holder.addCallback(this);
    }
    
    public void pause() {
        running = false;
    
        while (running) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;
        }
        thread = null;
    }
    
    public void resume() {
        running = true;
        thread = new Thread(this);
        thread.start();
    
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    
        running = true;
        thread = new Thread(this);
        thread.start();
    
    }
    
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Canvas c = holder.lockCanvas();
        draw(c);
        holder.unlockCanvasAndPost(c);
    
    }
    
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    
    }
    
    @Override
    public void run() {
    
        while (running == true) {
    
            // performs drawing to the canvas
            if (!holder.getSurface().isValid()) {
    
                continue;
            }
    
            Canvas c = holder.lockCanvas();
    
            int x = 0;
            int y = 0;
    
            for (x = 0; x < grassCoords.length; x += grass.getWidth()) {
    
                for (y = 0; y < grassCoords.length; y += grass.getHeight()) {
    
                    c.drawBitmap(grass, x, y, null);
                }
    
            }
    
            holder.unlockCanvasAndPost(c);
    
        }
    
    }
    

    }

提交回复
热议问题