【问题标题】:DrawBitmap in Canvas Is Slow画布中的 DrawBitmap 很慢
【发布时间】:2018-05-28 17:18:36
【问题描述】:

下面是我的代码

public class GameController extends SurfaceView implements SurfaceHolder.Callback {
        public static int WIDTH =800;
        public static int HEIGHT =399;

        private GameThread gameThread;
        private ArrayList<Background> backgrounds = new ArrayList<>();
        private Bitmap[] bgsrc ;

        public GameController(Context context) {
            super(context);
            getHolder().addCallback(this);
            setFocusable(true);
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            bgsrc = new Bitmap[5];
            for (int i=0;i<bgsrc.length;i++){
                bgsrc[i] = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.mountain_background_v2), i*800,0,800,399);
            }
            for (int i=bgsrc.length-1;i>=0;i--){
                if (i==0 || i==2) continue;
                backgrounds.add(new Background(bgsrc[i],-10+i*2 ));
            }

            //create GameThread Object and start Thread
            gameThread = new GameThread(getHolder(),this);
            gameThread.setRunning(true);
            gameThread.start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            boolean retry = true;
            int counter =0;
            while(retry && counter<1000){
                counter++;
                try{
                    gameThread.setRunning(false);
                    gameThread.join();retry = false;
                    gameThread = null;
                }catch (InterruptedException e){
                    e.printStackTrace();
                }

            }
        }

        public void update(){

               for (Background background: backgrounds){
                   background.update();
               }
        }

        @Override
        public void draw(Canvas canvas){
            super.draw(canvas);
            final float scaleFactorX = getWidth()/(WIDTH*1.f);
            final float scaleFactorY = getHeight()/(HEIGHT*1.f);
            if (canvas!=null){
                final int saveCount = canvas.save();
                canvas.scale(scaleFactorX,scaleFactorY);

                for (Background background: backgrounds){
                    background.draw(canvas);
                }
                canvas.restoreToCount(saveCount);
            }
        }
    }

当我从 Arraylist 在 Canvas 上绘制位图时,我的绘制速度非常慢,在 GameThread 类上我初始化了 FPS(每秒帧数)= 60,但是在缩放画布之后它变得很慢,我已经尝试在绘制之前缩放位图,但仍然相同表现。没有数组我的意思是单个图像绘制好,我该如何解决这个问题并获得我想要的准确速度..请帮助我..谢谢..

【问题讨论】:

    标签: java android canvas bitmap android-drawable


    【解决方案1】:

    draw() 中的额外调用和计算导致帧速率显着降低。我宁愿在初始化阶段对位图进行一次所有需要的缩放,并保持较高的帧速率。

    【讨论】:

    • 兄弟,我已经尝试在创建 Surface 视图时缩放位图,并且还提高了帧速率,但性能仍然相同.. 你能看到这个链接,我在哪里发布了详细信息.. 帮助我请..stackoverflow.com/questions/50554539/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多