Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Даже не знаю как назвать... 
:(
    Опции темы
SatanClaus
Дата 8.8.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



Суть проблемы в том, что у меня джарик весит около 180 кб. 160 кб из них - картинки... Я, как положено, загружаю их все в память, потом около 20 кб освобождаю...
Так вот, проблема в том, что в начале я некоторые картинки не отображаю, т. е. они лежат себе спокойно где-то в памяти, но когда я их вызываю, то прорисовка изображения занимает примерно сек. 2. Если потом снова загрузить эту же картинку, то она прорисуется быстро...
Кто знает, что это за полтергейст? И можно ли как-то ускорить процес прорисовки?  smile 
PM MAIL   Вверх
W0LF
Дата 8.8.2007, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Цитата

Даже не знаю как назвать...


M
W0LF
как-то, но надо называть. таких названий пожалуйста больше не давай.

Цитата

Если потом снова загрузить эту же картинку, то она прорисуется быстро...

Быть может ты ее прорисовал уже на форме, а потом просто форму подставляешь? кусок кода можешь показать, который отвечает за это?


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
SatanClaus
Дата 8.8.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



Больше не буду...

Есть класс ImageManager, в котором все процедуры и Image статические...
В другом классе я их загружаю...

Код


    public static void setImageIndex(int index){                          //   Выбираю нужный рисунок
        currentImage = ImageManager.slaidshow[index - 1];
    }

    public void paint(Graphics g){                                                 // Собственно рисую этот рисунок
        g.drawImage(currentImage, 0, 0, Graphics.LEFT | Graphics.TOP);
//      -------------------------------------- Нижние кнопки -------------------------------------
        g.setClip(5, Setting.SCREEN_HEIGHT - Setting.HEIGHT_BUTTON, Setting.WIDTH_BUTTON, Setting.HEIGHT_BUTTON);
        g.drawImage(ImageManager.button, 5, Setting.SCREEN_HEIGHT - Setting.HEIGHT_BUTTON, Graphics.LEFT | Graphics.TOP);
        g.setClip(Setting.SCREEN_WIDTH - Setting.WIDTH_BUTTON - 5, Setting.SCREEN_HEIGHT - Setting.HEIGHT_BUTTON, Setting.WIDTH_BUTTON, Setting.HEIGHT_BUTTON);
        g.drawImage(ImageManager.button, Setting.SCREEN_WIDTH - Setting.WIDTH_BUTTON - 5, Setting.SCREEN_HEIGHT - Setting.HEIGHT_BUTTON * 2, Graphics.LEFT | Graphics.TOP);
        g.setClip(0, 0, Setting.SCREEN_WIDTH, Setting.SCREEN_HEIGHT);
    }



У меня есть методы и побольше, но они прорисовываются нормально... Не пойму, что за бок...

Добавлено через 1 минуту и 13 секунд
Это единственный класс, где выводится это изображение...
PM MAIL   Вверх
W0LF
Дата 8.8.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Цитата

но когда я их вызываю, 

я от это не совсем догнал :(
то есть твой метод паинт рисует картинку первый раз на две секунды больше, чем например во второй раз?


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
SatanClaus
Дата 8.8.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



Точно. на эмуляторе конечно все рисуется нормально, а на телефоне вот такой бок.
PM MAIL   Вверх
W0LF
Дата 8.8.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Код

g.setClip(0, 0, Setting.SCREEN_WIDTH, Setting.SCREEN_HEIGHT);

а чему равны SCREEN_WIDTH и SCREEN_HEIGHT?

Добавлено через 2 минуты и 37 секунд
и еще - ты уверен что именно paint() ждет?
поставь в нем время. посмотри скоко времени он занимает первый раз и второй.
может у тя чет происходит перед repaint() что и требует большего времени..
где ты делаешь repaint()?


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
SatanClaus
Дата 8.8.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



Для repaint() есть свой отдельный класс WorkCanvas. С ним, я уверен на 100%, все впорядке.
Я поробовал поменять очередь загрузки картинок в программе.
Те картинки, которые я загружаю первыми, отображаются нормально, те что позже - тормозят...
----------------------------------------------------------------------------------------------------------------------------------
И как я смогу проверить время ожидания, если на эмуляторе у меня все прекрасно работает?

Добавлено через 6 минут и 39 секунд
Как и предполагалось, эмулятор показал 0 мс в обоих случаях  smile 
PM MAIL   Вверх
W0LF
Дата 8.8.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



я у тебя еще спросил что с параметрами SCREEN_WIDTH и SCREEN_HEIGHT?
может они на самом деле меньше, чем высота и ширина экрана?
и получается так, что рисунок во второй раз рисуется в меньшую область, а края не затраются а остаются теми же..
Цитата(SatanClaus @  8.8.2007,  17:08 Найти цитируемый пост)
И как я смогу проверить время ожидания, если на эмуляторе у меня все прекрасно работает? 

Код

public void paint(Graphics g){                                                 // Собственно рисую этот рисунок
         int startTime = (int) System.currentTimeMillis();
        g.drawImage(currentImage, 0, 0, Graphics.LEFT | Graphics.TOP);
//      -------------------------------------- Нижние кнопки -------------------------------------
        g.setClip(5, Setting.SCREEN_HEIGHT - Setting.HEIGHT_BUTTON, Setting.WIDTH_BUTTON, Setting.HEIGHT_BUTTON);
        g.drawImage(ImageManager.button, 5, Setting.SCREEN_HEIGHT - Setting.HEIGHT_BUTTON, Graphics.LEFT | Graphics.TOP);
        g.setClip(Setting.SCREEN_WIDTH - Setting.WIDTH_BUTTON - 5, Setting.SCREEN_HEIGHT - Setting.HEIGHT_BUTTON, Setting.WIDTH_BUTTON, Setting.HEIGHT_BUTTON);
        g.drawImage(ImageManager.button, Setting.SCREEN_WIDTH - Setting.WIDTH_BUTTON - 5, Setting.SCREEN_HEIGHT - Setting.HEIGHT_BUTTON * 2, Graphics.LEFT | Graphics.TOP);
        g.setClip(0, 0, Setting.SCREEN_WIDTH, Setting.SCREEN_HEIGHT);
        int endTime = (int) System.currentTimeMillis();
        String time = String.valueOf(endTime - startTime); 
        g.drawString(time,...);
    }

и проверь реально на девайсе время первой и второй отрисовок


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
SatanClaus
Дата 8.8.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



С SCREEN_WIDTH & SCREEN_HEIGHT у меня тоже все впорядке...
Замеры произвел, в первом случае дало 1132, во втором 1 (или 0)

Добавлено через 2 минуты и 31 секунду
Загрузка другого дала 2150
PM MAIL   Вверх
W0LF
Дата 8.8.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



видишь, получается что в первом случае рисуется наоборот быстрее а не медленнее..


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
SatanClaus
Дата 8.8.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



Ты меня не понял,
один рисунок 1-й раз прорисовывался 1132 мс, второй раз - 0мс;
другой рисунок 1-й раз - 2150 мс, второй раз - 0 мс  smile 
PM MAIL   Вверх
nagliyvred
Дата 8.8.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 2.10.2005

Репутация: 3
Всего: 3



Как вариант, что если добавить буфферизацию и сначала нарисовать этот image на mutable Image а потом уже этот mutable image на экран шлепнуть?
PM   Вверх
SatanClaus
Дата 9.8.2007, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



Пробовал уже, не помогло...  smile Все-равно долго прорисовывается...
PM MAIL   Вверх
zzzvyk
Дата 9.8.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 21.4.2007
Где: Киев

Репутация: нет
Всего: нет



э-э-э по симпотомам похоже на проблемы с видеопамяттю. Телефончик то какой? Попробуй на других...интересно.
Не уверен точно но слышал что некоторые телефоны размещают картинки в общей памяти а при первой отрисовки копируют в видео. Хотя, странно конечно....
PM MAIL Skype   Вверх
SatanClaus
Дата 9.8.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



Телефончик SE K700. Никогда не слышал о таких проблемах. И на эмуле K700 у меня все прорисовывается нормально... 
PM MAIL   Вверх
W0LF
Дата 9.8.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



на k700 у мну проблем никада не было..
попробуй GameCanas
он автоматом делает двойную буфферизацию


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
SatanClaus
Дата 9.8.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



  У меня реализован класс типа GameCanvas, который тоже отвечает за двойную буфферизацию.
С помощью Memory Monitor выяснил, что у меня постоянно забивается память, возможно из-за этого. Хотя не факт, потому что я могу до бессконечности играть в игру, память будет забиваться, но при этом никаких тормозов не наблюдается...
PM MAIL   Вверх
SatanClaus
Дата 9.8.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



  Вроде разобрался, легче конечно от того не стало...
Как выяснилось, дело скорее всего в том, что у некоторых моделей телефонов SE есть два типа используемой памяти plain Java Heap & LAM (Large Array Memory).
При работе телефон использует и ту и другую, просто одна - быстрая, а вторая - медленнее... Так вот, сначала ресурсы загружаются в быструю память, а потом, если не хватает места, в ту, что помедленнее... Ну и эта fast video RAM (plain Java Heap, если я правильно понял) имеет размер всего 80 кб.  smile 
Изображения в моем приложении весят 160 кб, соответственно половина уходит в LAM, а потому, когда я к ним обращаюсь для прорисовки, то первый раз на прорисовку уходит 1-2 сек.
И что тут придумаешь теперь?
PM MAIL   Вверх
VOS
Дата 9.8.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 31.1.2007

Репутация: 6
Всего: 8



Попробуй отрисовать через  drawRegion, правда будет только на MIDP 2.0 работать, но там вроде можно задать нужный кусок Image.
PM MAIL   Вверх
SatanClaus
Дата 10.8.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



Причем здесь drawRegion, я тут про ограничение в памяти телефона говорю.
А изображение у меня на весь экран и на целый файл...
PM MAIL   Вверх
VOS
Дата 10.8.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 31.1.2007

Репутация: 6
Всего: 8



Да я че-то подумал, может имеет смысл сделать одну здоровую картинку, а не несколько поменьше. Ну и выводить соответственно через drawRegion.
PM MAIL   Вверх
SatanClaus
Дата 10.8.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2007

Репутация: 3
Всего: 3



Проблема то в том, что если я зделаю одну большую картинку из всех, что у меня есть, то она по-любому будет больше 80 кб., а в доке по Сони Ериксон я извлек то, что быстрая видео-память имеет размер 80 кб. Отсюда, или нужно каждый раз одни рисунки выгружать, а другие загружать, или мириться с тормозами. Другого выхода я пока не вижу...  smile 
PM MAIL   Вверх
VOS
Дата 10.8.2007, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 31.1.2007

Репутация: 6
Всего: 8



Может попробовать выкинуть (временно) несколько картинок из архива, чтобы проверить действительно ли будет в этом случае быстро все отрисовываться или нет. 
PM MAIL   Вверх
VOS
Дата 10.8.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 31.1.2007

Репутация: 6
Всего: 8



У меня тоже SE поэтому интересно стало. 
Нашел я описание 
http://developer.sonyericsson.com/getDocument.do?docId=65067

Там сказано:

Java heap
Java applications use two kinds of heap memory,plain Java heap and LAM (Large Array Memory).The
LAM is shared with other processes on the phone. Standard Java objects and vectors of Java objects are
always located on the Java heap. Arrays of primitive types (byte[] int[], float[]) however may be
put in the LAM if the plain Java heap is low on memory. Small arrays have a greater chance of ending up
in the plain Java heap,while large arrays more often are stored in the LAM. 
!!!
Images are also sometimes placed in LAM. 
!!!
The size and configuration of the Plain heap size and the LAM size varies between phone models.

Note:From JP-7 Sony Ericsson phones only have one java heap area,which grows dynamically,only lim-
ited by free memory in the phone.

!!!
The size of LAM is not included in the values reported by 
Runtime.freeMemory and
Runtime.totalMemory
!!!

Похоже, нужно чтобы было произведено какое-нибудь обращение к этим изображениям. Т.е. перед первой отрисовкой на экран, например сразу после загрузки, нужно с ними что-нибудь принудительно сделать, например отрисовать все  или часть куда-нибудь. 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1105 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.