Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > FAQ

FAQ Часто задаваемые вопросы

Ответ
 
Опции темы
Старый 24.05.2010, 22:12   #1
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Сообщение Общие советы по оптимизации MIDlet Pascal / Java2me программ

Прежде всего определимся с направлениями оптимизации мидлета. Этих направлений несколько:

- оптимизация размера готового приложения (JAR файла)
- оптимизация использования памяти
- оптимизация скорости работы программы
- оптимизация переносимости программы

Кратко опишу основные советы и рекомендации по оптимизации для каждого направления:

1. Оптимизация по размеру
Зачем это нужно? В первую очередь потому, что на некоторых телефонах стоит
ограничение на максимальный размер исполнимого JAR файла, к примеру у некоторых моделей
телефонов Nokia (40 серии) это ограничение равняется 63 или 127 килобайтам. И эти телефоны
отнюдь не пережиток прошлого, они активно продолжают продаваться и распространяться среди
пользователей. И объясняй потом какой-нибудь блондинке, почему ваша мега-супер-пупер крутая
игра, размером в 150 кб, не пошла на её телефоне, который она покупала исключительно по
внешнему виду и низкой цене. К тому же размер важен при загрузке вашей программы из
Интернета, не исключено, что программу будут качать прямо на телефоне через мобильный браузер,
так что размер программы тут выльется в потраченные рубли и драгоценные секунды ожидания
потенциального пользователя вашего шедевра.

Самый простой и самый популярный метод уменьшения размеров программы - использование
обфускаторов. Таких программ много, вот только краткий список: ProGuard, RetroGuard, JODE...
Программы прекрасно справляются с этой функцией, помимо снижения размера повышают и защиту
вашего приложения.

Следующие методы уже потребуют изменения программы вручную.

- избавление от лишних модулей (MIDlet Pascal) или классов (Java2ME). Я понимаю,
что с использованием разветвленной системы классов/модулей программа становится короче и
понятнее. Увы, это отрицательно сказывается как на размерах готового JAR файла, так и занимаемой
оперативной памяти. Поэтому всегда старайтесь объединить несколько классов/модулей в один или
вообще отказаться от их использования. В идеале должен быть всего 1 класс/модуль - главный и всё.

- Совет чисто для MP - откажитесь от использования специальных типов данных (type), лучше храните
все данные в нескольких массивах, чем в одном массиве с особыми типизированными переменными.
Такие типизированные переменные занимают очень много оперативной памяти, да и требуется время
на извлечение определенного параметра из такой типизированной переменной, а это сказывается на
времени работы программы.

- выделение часто повторяющихся участков кода в отдельную функцию или процедуру. Если у вас один и
тот же код повторяется во многих местах, то есть смысл записать его как процедуру или функцию.

- удаление ненужных процедур. если у вас есть процедуры, которые выполняют второстепенную работу
(инициализация переменных, отладочный вывод на консоль и проч.) и вызываются только 1 раз - есть
смысл избавиться от них вообще, просто перенеся их непосредственный код на место откуда они вызывались.

- Если вы часто обращаетесь к какой-то переменной из массива есть смысл записать её значение в локальную
переменную и обращаться уже к локальной переменной. Казалось бы какая разница, но локальные переменные
читаются быстрее.

- не делайте инициализацию больших массивов непосредственно в коде программы. Часто оптимальнее будет
хранить значения в текстовом файле, а в коде просто прочитать этот файл и записать прочитанные данные в массив.

- Уменьшение размеров графики за счет программ оптимизации графики (pngout, pgcrush) и режимов сжатия.
При рисовании графики используйте как можно меньшее количество цветов и сохраняйте графику в сжатых форматах:
PNG, JPG, GIF, но не BMP и др.

- объединение нескольких графических картинок в один файл. Если у вас в игре куча спрайтов и они хранятся
в разных файлах, то лучше их хранить в одном файле в виде пакета спрайтов или на крайний случай просто
склейте эти фалы с помощью библиотеки Lib_vault. Один большой файл лучше сжимается, чем куча маленьких.

- использовать оптимизированный запаковщик. Не секрет, что JAR файл это обычный ZIP архив, но не многие
знают, что параметрами сжатия можно управлять. Часто сжатие проходит по средним параметрам, обеспечивающим
быструю распаковку, но не самый маленький размер фала после запаковки. Имеет смысл распаковать содержимое
JAR файла и перепаковать его используя более экстремальные параметры сжатия или сторонние архиваторы
(к примеру, архиватор kZip сжимает на 5 - 10 килобайт сильнее, чем обычный Zip)

2. Оптимизация использования памяти

- Используйте как можно меньше переменных, если это возможно, то используйте другие переменные повторно
или временно храните в них какую-то промежуточную информацию

- Если ваше приложение работает с какими-то большими массивами или картинками, то лучше загрузить их
сразу в начале программы, до объявления других мелких переменных.

- Как можно реже делайте создание/удаление объектов. Старайтесь использовать то что уже есть повторно.

- Правильно объявляйте массивы. Вы удивитесь, но массив [1..2, 1...1000] займет гораздо меньше памяти, чем
массив [1..1000, 1..2]. Просто так происходит из-за выравнивания (alignment) данных в памяти.

- Оптимально читайте ресурсы. Для чего используйте специальные библиотеки типа Lib_resload и прочие.
Прочитав какую-то информацию тут же закрывайте файл. Дело в том, что на некоторых телефонах при чтении
ресурса он сразу весь считывается в оперативную память и занимает её пока вы там что-то читаете построчно
или побайтно из файла. То же относится и к сетевым потокам. Не забывайте их закрывать.

- Учитывайте особенности некоторых телефонов. К примеру, на некоторых телефонах картинки с прозрачностью
занимают памяти намного больше, чем непрозрачные.

3. Оптимизация скорости выполнения программы

- используйте более оптимальные алгоритмы.

- повыбрасывайте из цикла ненужные повторные действия.

- сделайте замеры работы различных процедур и функций, сколько времени выполняется каждая из них.
Может быть стОит обращаться к каким-то функциям или процедурам немножко реже?

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

- Как можно реже обращайтесь к RMS. Если у вас в Хранилище Записей хранится какая-то важная для
программы информация, то считайте её в переменную, а не обращайтесь каждый раз в RMS, чтобы узнать
её значение.

- Как можно реже читайте ресурсы. Операции с файлами даже если это внутренние ресурсы программ
всегда происходят очень медленно. Лучше сразу считать все ресурсы в переменные в самом начале программы
и больше к ресурсам не обращаться вообще. Также вместо того чтобы открывать/закрывать файл каждый
раз чтобы что-то там прочитать лучше откройте файл один раз, пометьте его начало (mark) и не закрывайте файл.
При последующем обращении к файлу вместо открытия файла просто делайте сброс (reset). Это сэкономит вам
много времени.

- Используйте многопоточность. Если у вас какая-то процедура часто вызывается может имеет смысл перевести
её работу в отдельный поток?

4. Оптимизация переносимости программы
Не секрет, что современный парк уже существующих моделей телефонов очень большой и он растет каждую
неделю. Поэтому чтобы ваша программа одинаково хорошо работала на большинстве телефонов учитывайте
следующее:

- учитывайте то, что у всех телефонов разные размеры дисплеев. Поэтому весь вывод графики и работа
программы должна идти исходя из полученных программно значений высоты и ширины экрана, а не просто
статичных чисел. Пример: FillRect(0, 0, 176, 220) лучше заменить на FillRect(0, 0, GetWidth, GetHeight).

- Используйте рисованные шрифты (Lib_font). Их размер и вид вам уже заранее известен, а при использовании
стандартных шрифтов не известно какой высоты и ширины будет полученная надпись, да и есть ли данный
шрифт в телефоне вообще - на некоторых телефонах есть только 1 шрифт или телефон не имеет поддержки
нужных букв (попробуйте запустить программу с русскими надписями на китайском телефоне, скорее всего
вы увидите непонятные иероглифы вместо ожидаемых букв).

- последнее время появились телефоны с возможностью поворота дисплея сразу во время работы вашей
программы. Это тоже нужно учитывать иначе программа будет работать некорректно при повороте и выводить
графику не на весь дисплей, а только на часть.

- храните все тексты программы в текстовом файле в ресурсах. Если понадобится перевести вашу программу
на другой язык нужно будет только перевести 1 файл, а не переделывать всю программу.
Вложения
Тип файла: zip kzip.zip (13.0 Кб, 763 просмотров)

Последний раз редактировалось odd, 25.05.2010 в 14:16. Причина: дополнения
(Offline)
 
Ответить с цитированием
Эти 15 пользователя(ей) сказали Спасибо odd за это полезное сообщение:
abcdef (27.05.2010), cherepets (24.05.2010), demon112 (31.05.2010), dmitriy-dim (10.09.2010), DUDAKOV.RU (10.02.2011), Fred-boy (10.07.2013), Igor (25.05.2010), leonid (03.11.2011), nil0q (01.09.2011), Phantom (25.05.2010), Rock2roll (29.05.2010), Romanzes (01.06.2010), Trazzy (25.05.2010), ViNT (24.05.2010), Жека (28.05.2010)
Старый 24.05.2010, 23:19   #2
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

думаю многим это будет полезно))
слушай, а можно подробнее про увеличение скорости выполнения?
уж больно низкий порой фпс у меня выходит (1-2 на телефоне, 180-190 на компе если не ограничивать)
(Offline)
 
Ответить с цитированием
Старый 25.05.2010, 14:03   #3
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Сообщение от cherepets Посмотреть сообщение
думаю многим это будет полезно))
слушай, а можно подробнее про увеличение скорости выполнения?
уж больно низкий порой фпс у меня выходит (1-2 на телефоне, 180-190 на компе если не ограничивать)
Да, что-то низковатый у тебя FPS. Пришли исходники на [email protected] я гляну что там можно будет исправить. Обещаю не передавать исходники никому другому и сам их уничтожу у себя после улучшения.
(Offline)
 
Ответить с цитированием
Старый 25.05.2010, 15:05   #4
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

ну так речь о дум стори2. там 8 сложений, 6 умножений, 2 деления для отрисовки каждого объекта. переделывать я лучше сам буду.

мне интересно узнать есть ли смысл заменять это на сдвиги (и где почитать о них).
что быстрее trunc(i/5); или r/5?
большая ли разница запускаем мы процедуру из своего модуля или из другого?
(Offline)
 
Ответить с цитированием
Старый 25.05.2010, 19:14   #5
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Разницы из какого модуля что запускается нет. А вот числа лучше использовать только целые. Вычисления с целыми проходят быстрее.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dmitriy-dim (10.09.2010)
Старый 25.05.2010, 21:54   #6
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

а что про сдвиги?
можно ли добиться существенного прироста производительности?
(отрисовывается объектов по 700 в сумме, действия над каждым написал выше, а цель - повысить фпс как минимум в 3 раза)
(Offline)
 
Ответить с цитированием
Старый 26.05.2010, 23:19   #7
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Сообщение Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Наткнулся на статью, откуда взят этот текст.
Кому интересно, вот полный вариант: http://www.dtf.ru/articles/read.php?id=44796
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dmitriy-dim (10.09.2010)
Старый 27.05.2010, 21:04   #8
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Сообщение от Igor Посмотреть сообщение
Наткнулся на статью, откуда взят этот текст.
Кому интересно, вот полный вариант: http://www.dtf.ru/articles/read.php?id=44796
Отчасти информация бралась действительно оттуда, тут немного адаптированный и дополненный вариант.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dmitriy-dim (10.09.2010)
Старый 27.05.2010, 21:07   #9
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Сообщение от cherepets Посмотреть сообщение
а что про сдвиги?
можно ли добиться существенного прироста производительности?
(отрисовывается объектов по 700 в сумме, действия над каждым написал выше, а цель - повысить фпс как минимум в 3 раза)
700 объектов? И все отрисовываются на дисплее?
Скорее всего у тебя видимо очень большая карта с большим количеством объектов на ней. И объекты отрисовываются там наверняка не все, большая часть их находится за пределами видимости. Так вот к чему отрисовывать заведомо невидимый объект? Добавь простейшую проверку будет ли объект виден в окне дисплея и если нет - не отрисовывай его.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dmitriy-dim (10.09.2010)
Старый 27.05.2010, 23:07   #10
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

так чтобы проверить надо все равно координаты отсчитать)) а это помним сколько действий
(Offline)
 
Ответить с цитированием
Старый 28.05.2010, 07:42   #11
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

700 проверок всё равно быстрее чем 700 отрисовок
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dmitriy-dim (10.09.2010)
Старый 28.05.2010, 08:30   #12
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Жека, на теории и на эмуляторе да, а нокии нет (проверено)
(Offline)
 
Ответить с цитированием
Старый 29.05.2010, 15:45   #13
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Значит сами объекты хранятся не оптимально. Лучше пробегись 1 раз по массиву и посчитай все положения сразу 1 раз и больше к пересчетам не возвращайся.
(Offline)
 
Ответить с цитированием
Старый 29.05.2010, 22:33   #14
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

так положений 625. сохранить их = убить нокиа с40
(Offline)
 
Ответить с цитированием
Старый 30.05.2010, 17:59   #15
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Нокиа с40? Не слышал о таком.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 19:25.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com