Форум программистов, компьютерный форум CyberForum.ru

Работа с SurfaceView - Android

Восстановить пароль Регистрация
 
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
01.08.2014, 18:12     Работа с SurfaceView #1
Отрисовка в SurfaceView никогда не вызывала трудностей, до тех пор, пока не запустил приложение на телефоне с экраном 1920х1080px. Фпс упал в 2 раза. Существуют ли какие-либо базовые мтоды оптимизации/ускорения отрисовки без использования OpenGL ES? движки типа AndEngine не предлагать)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2014, 18:23     Работа с SurfaceView #2
расскажите что и как вы рисуете
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
01.08.2014, 18:28  [ТС]     Работа с SurfaceView #3
Все банально) в потоке дёргаю метод (изначально 40 FPS):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void updateScreen(Screen screen) {
        if (!UiApplication.getUiApplication().isActive() || screen == null || (screen.isHide() && !screen.isNeedForceUpdate()))
            return;
        try {
            Canvas canvas = getHolder().lockCanvas();
            synchronized (getHolder()) {
                if (canvas != null) {
                    drawScreen(screen, canvas);
                    getHolder().unlockCanvasAndPost(canvas);
                }
            }
        } catch (Exception e) {
            Log.d(UiApplication.getUiApplication().getAppID(), "SCREEN HOLDER PAINT: " + e.getMessage());
        }
    }
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2014, 18:33     Работа с SurfaceView #4
что вы рисуете? треугольники линии круги битмапы?
как вы считаете fps?
почему сами не ригулируете фпс?
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
01.08.2014, 18:35  [ТС]     Работа с SurfaceView #5
Рисую битмапы. ФПС регулирую) Хотя.. может в этом то и косяк. я высчитываю время sleep - при нормальных условиях без нагрузки. Т.е. timeToSleep = 1000 / FPS.

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
while (isStart()) {
            if (timePauseStart != 0)
                timePause = System.currentTimeMillis() - timePauseStart;
            timeInGamePrecise = System.currentTimeMillis() - startTime - timePause;
            if (!isPause()) {
                if (timePauseStart != 0) {
                    startTime += timePause;
                    timePauseStart = 0;
                    timePause = 0;
                }
                long time = System.currentTimeMillis();
                setStart(isStart() && update());
                time = System.currentTimeMillis() - time;
                try {
                    long timeToSleep = delay - time;
                    sleep(timeToSleep < 0 ? 10 : timeToSleep);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                timeInGame += delay;
            }
            else {
                if (timePauseStart == 0)
                    timePauseStart = System.currentTimeMillis();
                try {
                    sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
Непосредственно в этом месте и происходит вычисление времени сна
Java
1
2
3
4
5
6
7
8
9
10
11
 
                long time = System.currentTimeMillis();
                setStart(isStart() && update());
                time = System.currentTimeMillis() - time;
                try {
                    long timeToSleep = delay - time;
                    sleep(timeToSleep < 0 ? 10 : timeToSleep);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                timeInGame += delay;
Где delay - это наше рассчитаное 1000 / FPS
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2014, 18:40     Работа с SurfaceView #6
ну и последний вопрос, умеете ли вы анализировать производительсность используя это ? Используя эту тулзу которая идёт в сдк (доступна из ddms) вы можете понять почему фрэймы дропаются. Из личного опыта скажу что битмапы рисуются само долго. Тоесть если надо рисовать что то примитивное, напрмиер красный круг и есть 2 варианта - использовать битмапку круга и делать drawBitmap на канвасе или рисовать с помощью соответствующих методов на канвасе, то второй вариант в разы быстрее.
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
01.08.2014, 18:49  [ТС]     Работа с SurfaceView #7
Если честно, то пытался понять) но не получилось=( может мат части не хватает...

Добавлено через 7 минут
Цитата Сообщение от YAUHEN Посмотреть сообщение
есть 2 варианта - использовать битмапку круга и делать drawBitmap на канвасе или рисовать с помощью соответствующих методов на канвасе, то второй вариант в разы быстрее.
это понятно.. Но если нужны спрайты персонажа отрисовать - его кругами не сделаешь...
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2014, 18:52     Работа с SurfaceView #8
Цитата Сообщение от little-dgek Посмотреть сообщение
это понятно.. Но если нужны спрайты персонажа отрисовать - его кругами не сделаешь...
совершенно верно, именно поэтому когда речь идёт о спрайтах и прочем игрострое - все шлют к игровым движкам не безпричинно. ведь там всё рисуется используя opengl
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2014, 18:56     Работа с SurfaceView
Еще ссылки по теме:

Android Мерцание в SurfaceView
Android Camera без SurfaceView
Воспроизведение видео в SurfaceView Android
Узнать фон SurfaceView Android
Восстановление SurfaceView Android

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

Или воспользуйтесь поиском по форуму:
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
01.08.2014, 18:56  [ТС]     Работа с SurfaceView #9
Вот я уже начал копать все это... Не хочу в движки лезть.. Люблю свои велосипеды=) Просто переписать мою существующую реализацию под OpenGL быстрее, чем сейчас изучать движки.

Например, мне надо переписать только сам механизм отрисовки с SurfaceView на GLSurfaceView.
Но это будет только в том случае, если не получится оптимизировать отрисовку тут... (По крайней мере для этого проекта)
Yandex
Объявления
01.08.2014, 18:56     Работа с SurfaceView
Ответ Создать тему
Опции темы

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