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

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

Войти
Регистрация
Восстановить пароль
 
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
#1

Работа с SurfaceView - Программирование Android

01.08.2014, 18:12. Просмотров 1137. Ответов 8
Метки нет (Все метки)

Отрисовка в SurfaceView никогда не вызывала трудностей, до тех пор, пока не запустил приложение на телефоне с экраном 1920х1080px. Фпс упал в 2 раза. Существуют ли какие-либо базовые мтоды оптимизации/ускорения отрисовки без использования OpenGL ES? движки типа AndEngine не предлагать)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2014, 18:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с SurfaceView (Программирование Android):

SurfaceView не отображается - Программирование Android
Учусь программировать по книге П. Дейтел, Х. Дейтел "Android для программистов. Создаём приложения". Делаю уже 5 приложение, но это не...

Восстановление SurfaceView - Программирование Android
Кто работал с SurfaceView, помогите! Рисую на SurfaceView с помощью onTouchEvent(), без потока, все замечательно рисует, сворачиваю...

SurfaceView + onKeyDown - Программирование Android
Проблемка очень простая - не реагирует на onKeyDown в классе, наследующем SurfaceView. Исправьте мою криворукость, пожалуйста, подскажите,...

Мерцание в SurfaceView - Программирование Android
Всем привет! Рисую на SurfaceView фон и на нем анимированные объекты. Кадры беру из атласа. Появилось мерцание, причем фон не мерцает а...

Ошибка в SurfaceView - Программирование Android
есть игра. отрисовка идет через SurfaceView и поток привязанный к нему. ошибка возникает в следующем моменте - я открываю сам игровой...

SurfaceView&Canvas - Программирование Android
Подскажите, как реализовать отображение, например, карандашика, когда рисуешь на Canvas в SurfaceView. В какую сторону копать, чтобы такое...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2014, 18:23 #2
расскажите что и как вы рисуете
0
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
01.08.2014, 18:28  [ТС] #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());
        }
    }
0
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2014, 18:33 #4
что вы рисуете? треугольники линии круги битмапы?
как вы считаете fps?
почему сами не ригулируете фпс?
0
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
01.08.2014, 18:35  [ТС] #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
0
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2014, 18:40 #6
ну и последний вопрос, умеете ли вы анализировать производительсность используя это ? Используя эту тулзу которая идёт в сдк (доступна из ddms) вы можете понять почему фрэймы дропаются. Из личного опыта скажу что битмапы рисуются само долго. Тоесть если надо рисовать что то примитивное, напрмиер красный круг и есть 2 варианта - использовать битмапку круга и делать drawBitmap на канвасе или рисовать с помощью соответствующих методов на канвасе, то второй вариант в разы быстрее.
0
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
01.08.2014, 18:49  [ТС] #7
Если честно, то пытался понять) но не получилось=( может мат части не хватает...

Добавлено через 7 минут
Цитата Сообщение от YAUHEN Посмотреть сообщение
есть 2 варианта - использовать битмапку круга и делать drawBitmap на канвасе или рисовать с помощью соответствующих методов на канвасе, то второй вариант в разы быстрее.
это понятно.. Но если нужны спрайты персонажа отрисовать - его кругами не сделаешь...
0
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
01.08.2014, 18:52 #8
Цитата Сообщение от little-dgek Посмотреть сообщение
это понятно.. Но если нужны спрайты персонажа отрисовать - его кругами не сделаешь...
совершенно верно, именно поэтому когда речь идёт о спрайтах и прочем игрострое - все шлют к игровым движкам не безпричинно. ведь там всё рисуется используя opengl
0
little-dgek
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 9
01.08.2014, 18:56  [ТС] #9
Вот я уже начал копать все это... Не хочу в движки лезть.. Люблю свои велосипеды=) Просто переписать мою существующую реализацию под OpenGL быстрее, чем сейчас изучать движки.

Например, мне надо переписать только сам механизм отрисовки с SurfaceView на GLSurfaceView.
Но это будет только в том случае, если не получится оптимизировать отрисовку тут... (По крайней мере для этого проекта)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2014, 18:56
Привет! Вот еще темы с ответами:

SurfaceView сворачивание программы - Программирование Android
@Override protected void onDraw(Canvas canvas){ //рисует игровое поле super.onDraw(canvas); Paint paint = new Paint();...

Обработка касаний в SurfaceView - Программирование Android
Всем привет! Для обработки касаний в surfaceview определяю OnTouchEvent () но касания не обрабатываются. Контролирую через Log.d(). В чем...

Canvas, SurfaceView, Touch - Программирование Android
Всем добра. Возник один баг (может в коде проблема), который неприятно выглядит в приложении. Рисуя с помощью SurfaceView, Canvas...

Простейший пример SurfaceView - Программирование Android
Здравствуйте. Напишите пожалуйста простейшую программу рисующую точку на экране с помощью SurfaceView.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2014, 18:56
Ответ Создать тему
Опции темы

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