DrawBitmap в Canvas медленен - PullRequest
0 голосов
/ 28 мая 2018

Вот мой код Ниже

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, мой рисунок очень медленный, когда в классе GameThread I я инициализировал FPS (кадров в секунду) = 60Но после масштабирования Canvas его стало медленным, я уже пробовал масштабировать растровое изображение перед рисованием, но все равно производительность.без массива я имею в виду с одним изображением хорошо, как я могу решить эту проблему и получить точную скорость, что я хочу .. PLZ, помогите мне .. Спасибо ..

1 Ответ

0 голосов
/ 29 мая 2018

Дополнительные вызовы и вычисления в draw() вызывают значительное снижение частоты кадров.Я бы предпочел выполнить все необходимое масштабирование растровых изображений один раз, на этапе инициализации, и сохранить более высокую частоту кадров.

...