Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
tronuo
4 / 3 / 0
Регистрация: 06.06.2011
Сообщений: 79
#1

Рисование на canvas - подтормаживание - Программирование Android

14.09.2015, 21:22. Просмотров 706. Ответов 5
Метки нет (Все метки)

MainActivity.java
Java
1
2
3
4
5
6
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(new GameView(this));
    }
GameView.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
public class GameView extends SurfaceView
{
    private GameThread mThread;
    int touchX = 0;
    int touchY = 0;
    int coordX = 0;
    int coordY = 600;
    int _coordX = 0;
    int X = 0;
    int Y = 0;
    private boolean running = false;
 
 
    public class GameThread extends Thread
    {
        private GameView view;
 
        public GameThread(GameView view)
        {
            this.view = view;
        }
 
        public void setRunning(boolean run)
        {
            running = run;
        }
 
        public void run()
        {
            while (running)
            {
                Canvas canvas = null;
                try
                {
                    canvas = view.getHolder().lockCanvas();
                    synchronized (view.getHolder())
                    {
                        onDraw(canvas);
                    }
                }
                catch (Exception e) { }
                finally
                {
                    if (canvas != null)
                    {
                        view.getHolder().unlockCanvasAndPost(canvas);
                    }
                }
            }
        }
    }
 
 
    public GameView(Context context)
    {
        super(context);
 
        mThread = new GameThread(this);
 
        getHolder().addCallback(new SurfaceHolder.Callback() {
            public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry = true;
                mThread.setRunning(false);
                while (retry) {
                    try {
                        mThread.join();
                        retry = false;
                    } catch (InterruptedException e) {
                    }
                }
            }
 
            public void surfaceCreated(SurfaceHolder holder) {
                mThread.setRunning(true);
                mThread.start();
            }
 
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }
        });
    }
    public boolean onTouchEvent(MotionEvent event)
{
    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
            _coordX = coordX;
            X = (int) event.getX();
            Y = (int) event.getY();
 
    }
    if(event.getAction() == MotionEvent.ACTION_MOVE)
    {
        touchX = ((int) event.getX());
        touchY = (int) event.getY();
        if (Math.abs(touchX - X) > 10){
            coordX = _coordX + (touchX - X);
            invalidate();
 
        }
    }
    if(event.getAction() == MotionEvent.ACTION_UP)
    {
        _coordX = coordX;
        Y = touchY;
    }
    return true;
}
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.fon), 0, 0, null);
        canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.player0000), coordX, coordY, null);
 
    }
}
При перемещении "player0000" по экрану, он тормозит. Хотелось бы узнать почему. Спасибо заранее.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2015, 21:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рисование на canvas - подтормаживание (Программирование Android):

Рисование на View элементе (Canvas) - Программирование Android
Я создал кастомный View элемент(календарь), который наследует View и переопределяет метод onDraw. Надо сделать этот его интерактивным, для...

Как победить подтормаживание при листании ViewPager со списками listview? - Программирование Android
Как победить подтормаживание при листании ViewPager со списками listview? если быстро листать (ну или даже не очень быстро), то...

Рисование с canvas - Delphi
Итак, в чем в общем суть моей проблемы я ввожу скажем две координаты точки, надо проверить принадлежность ее к треугольнику, который в...

Рисование в canvas - HTML, CSS
Здравствуйте. Как закруглить углы квадрата который нарисован на объекте canvas и как потом на этом квадрате нарисовать вопросительный знак?...

Рисование в canvas - Delphi
Есть такая задачка, надо сделать в canvas, с ним никогда не работал. Разработать приложение, в котором имитируется человечек, делающий...

Рисование на canvas - HTML5 Canvas
Здравствуйте! Необходимо создать интерактивную страницу для демонстрации дискретизации звуковой информации. На канве рисуются линии,...

5
Mikalai
260 / 236 / 95
Регистрация: 11.01.2015
Сообщений: 663
14.09.2015, 22:06 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
tronuo, ну ты же на каждом кадре создаёшь новые объекты Bitmap(это дорогие операции). Потом приходит GC и начинает чистить память. Вот от сюда и тормоза.
1
tronuo
4 / 3 / 0
Регистрация: 06.06.2011
Сообщений: 79
14.09.2015, 23:53  [ТС] #3
Спасибо, получилось.
0
Turalll
-1 / 2 / 0
Регистрация: 03.06.2010
Сообщений: 91
20.06.2016, 23:50 #4
мм, у меня та же проблема , что и у автора, он видимо по тем же гайдам написал этот код , что и я . У меня так же при касании экрана Bitmap перерисовывается по новой, в общем точно такой же код, единственное , что не пойму зачем он на 97 строке пишет invalidate(); Ведь он запустил отрисовку в отдельном потоке. А вопрос у меня в том как же автор решил проблему? как не делать эти дорогие операции с отрисовкой Bitmap в каждом кадре ? и как самому удалять старые кадры , чтобы не засорять память?
0
tronuo
4 / 3 / 0
Регистрация: 06.06.2011
Сообщений: 79
21.06.2016, 00:47  [ТС] #5
Это вверх в переменную добавил, чтобы она каждый раз не инициализировались в onDraw.
Java
1
BitmapFactory.decodeResource(getResources(), R.drawable.fon)
0
Turalll
-1 / 2 / 0
Регистрация: 03.06.2010
Сообщений: 91
21.06.2016, 09:16 #6
Вот есть два метода один с invalidate(),это он принудительно вызывает перерисовку ,но для динамичной графики этот метод не подходит,потому что время затрачивается на вызов перерисовки. И для динамичной графики используют прорисовку в отдельном потоке в цикле. И вот я не понимаю зачем у вас и invalidate() и отдельном потоке рисуете?

Добавлено через 6 минут
Если вы не будете использовать invalidate() , то player0000 будет рисоваться и при повторном вызове старый player0000 не будет удаляться и если наставить много player0000 еще и память забивается.. И приходится пеперисовывать каждый раз и фон, чтобы залить старый player0000 и новый норисовать. Вот рекомендуют использовать так называемый пул и будет возможность удалять старый player0000 только я пока не понял как это.

Добавлено через 4 минуты
И вообще у меня конечная проблема в том, что я новый player0000 отрисовываю в не при клике ACTION_DOWN, а при ACTION_MOVE при движении пальцем по экрану , получается player0000 следует за пальцем. Но если быстро палец вести, то прорисовка опаздывает и если честно я не видел на андроид ничего такого где не было бы этого отставания.. А я хочу без отставания) вот думаю как максимально ускорить это дело.
0
21.06.2016, 09:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2016, 09:16
Привет! Вот еще темы с ответами:

Рисование Canvas - C# WPF
вот написал код который рисует мышкой,все хорошо,но есть одна проблема,когда быстро вожу мышкой то не успевает каждую координату...

Рисование в canvas - HTML5 Canvas
Здравствуйте. Есть задание в котором нужно нарисовать красный квадрат с закругленными краями и в этом квадрате должен быть нарисован белый...

Рисование в Canvas - Delphi
Здравствуйте, очень прошу помощи, так как подсказать больше некому. :( Мне нужно реализовать пропорциональное увеличение рисунка в...

Рисование с Canvas - Delphi
Подскажите новичку в Delphi-рисовании, как можно стереть с формы всё, что было нарисовано с помощью Canvas.MoveTo(); Canvas.LineTo();...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru