|
FAQ Часто задаваемые вопросы |
30.05.2010, 18:02
|
#16
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
сериес40 (все что цветное и не смарт)
|
(Offline)
|
|
30.05.2010, 19:17
|
#17
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
Вот пример участка кода, который отвечает за отрисовку объектов (взято с помощью декомпиляции):
for(j = 1; 25 >= j; j++) { for(i = 1; 25 >= i; i++) { if(objectmap[i - 1][j - 1] == 0) { Lib_cherryfont.font(2); M.G.drawImage(player, (i * 60 - j * 4) + l * 6 + 30 + (M.RNG.nextInt() & -1 >>> 1) % 2, ((j * 40 + i * 3 + i1 * 4) - hero[j1 - 1][1 - 1].getHeight()) + 35, 20); cx = i; cy = j; } if((((byte)(objectmap[i - 1][j - 1].compareTo(String.valueOf('b')) == 0 ? -1 : 0))) != 0) { M.G.drawImage(object[1 - 1], (i * 60 - j * 4) + l * 6 + 26, ((j * 40 + i * 3 + i1 * 4) - object[1 - 1].getHeight()) + 35, 20); } if((((byte)(objectmap[i - 1][j - 1].compareTo(String.valueOf('q')) == 0 ? -1 : 0))) != 0) { M.G.drawImage(object[2 - 1], (i * 60 - j * 4) + l * 6 + 26, ((j * 40 + i * 3 + i1 * 4) - object[2 - 1].getHeight()) + 35, 20); } if((((byte)(objectmap[i - 1][j - 1].compareTo(String.valueOf('v')) == 0 ? -1 : 0))) != 0) { M.G.drawImage(object[3 - 1], (i * 60 - j * 4) + l * 6 + 26, ((j * 40 + i * 3 + i1 * 4) - object[3 - 1].getHeight()) + 35, 20); } if((((byte)(objectmap[i - 1][j - 1].compareTo(String.valueOf('z')) == 0 ? -1 : 0))) != 0) { M.G.drawImage(object[15 - 1], (i * 60 - j * 4) + l * 6 + F.tI(F.fI((65 - object[15 - 1].getWidth()) / 2)) + 10 + (M.RNG.nextInt() & -1 >>> 1) % 2, ((j * 40 + i * 3 + i1 * 4) - object[15 - 1].getHeight()) + 35, 20); } if((((byte)(objectmap[i - 1][j - 1].compareTo(String.valueOf('i')) == 0 ? -1 : 0))) != 0) { M.G.drawImage(object[16 - 1], (i * 60 - j * 4) + l * 6 + F.tI(F.fI((65 - object[16 - 1].getWidth()) / 2)) + 10 + (M.RNG.nextInt() & -1 >>> 1) % 2, ((j * 40 + i * 3 + i1 * 4) - object[16 - 1].getHeight()) + 35, 20); }
Сразу бросаются в глаза ненужные повторные вычисления одного и того же выражения, да и у вас видимо тип юнита хранится в виде буквы, а сравнение данной буквы порождает кучу ненужных сравнений и переконвертаций объектов. Лучше тип юнита хранить в виде числа 0, 1, 2, 3... так легче сравнивать потом. Также не мешало бы использовать хотя бы оператор else, раз continue в Мидлет Паскале нет.
В итоге, после упрощения получим что-то типа такого:
int a, b; for(j = 1; 25 >= j; j++) { for(i = 1; 25 >= i; i++) { a = (i * 60 - j * 4) + l * 6 + 26; b = ((j * 40 + i * 3 + i1 * 4) + 35; if(objectmap[i - 1][j - 1] == 1) { Lib_cherryfont.font(2); // Ненужное повторяющееся действие в цикле, можно выкинуть из цикла вообще M.G.drawImage(player, a + 4 + (M.RNG.nextInt() & -1 >>> 1) % 2, b - hero[j1 - 1][1 - 1].getHeight()), 20); cx = i; // Тоже выкинуть cy = j; // Тоже никак не используется в цикле } if(objectmap[i - 1][j - 1] == 1) { M.G.drawImage(object[1 - 1], a, b - object[1 - 1].getHeight()), 20); } else if(objectmap[i - 1][j - 1] == 2) { M.G.drawImage(object[2 - 1], a, b - object[2 - 1].getHeight()), 20); } else if(objectmap[i - 1][j - 1] == 3) { M.G.drawImage(object[3 - 1], a, b - object[3 - 1].getHeight()), 20); } else if(objectmap[i - 1][j - 1] == 4) { M.G.drawImage(object[15 - 1], a - 16 + F.tI(F.fI((65 - object[15 - 1].getWidth()) / 2)) + (M.RNG.nextInt() & -1 >>> 1) % 2, b - object[15 - 1].getHeight()), 20); } else if(objectmap[i - 1][j - 1] == 5) { M.G.drawImage(object[16 - 1], a - 16 + F.tI(F.fI((65 - object[16 - 1].getWidth()) / 2)) + (M.RNG.nextInt() & -1 >>> 1) % 2, b - object[16 - 1].getHeight()), 20); }
Спрайты в игре тоже хранятся в виде кучи отдельных файлов, что порождает большие размеры программы и огромные массивы картинок для их хранения.
Вы вообще слышали, что существуют специальные библиотеки для работы со спрайтами?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.05.2010, 19:44
|
#18
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
предметов больше чем цифр, вот и перешел на буквы.
выбор шрифта в другом месте стоит, хз почему он у тебя там))
а вот else можно и наставить)))
|
(Offline)
|
|
30.05.2010, 20:28
|
#19
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
Главное ускорение всё же в использовании локальных переменных а и b.
Попробуй хотя бы их добавить в программу, FPS вырастет, я думаю как минимум раза в 2.
И используй числа, а не цифры для обозначения типа юнита. 4 миллиардов значений должно хватить. Чего нельзя сказать о цифрах и буквах.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо odd за это полезное сообщение:
|
|
30.05.2010, 21:19
|
#20
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
декомпиль + моя логика видимо помешали твоему восприятию программы.
(i * 60 - j * 4) + l * 6 + 26;
считается и так по одному разу для каждого значения i и j
перейти на цифры можно, попробую)) а вообще я добился уже 2.5 фпс, чего при пошаговом перемещении хватит (прощитал все деления зарание + более грамотно реализовал задержку)
|
(Offline)
|
|
31.05.2010, 13:52
|
#21
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
а можно еще про kzip поподробнее?
в смысле как им паковать. нормальной инструкции нет + консольными архиваторами не пользовался
и еще вопрос о каком именно kzip'е идет речь? есть аналог винзипа для линя с таким названием и консольный на 15кб
учитывая сколько я времени потратил на переход на цифры (так и не закончил), прирост менее 10000% считается маленьким...
Последний раз редактировалось cherepets, 01.06.2010 в 14:07.
|
(Offline)
|
|
01.06.2010, 14:03
|
#22
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
kzip сам консольный, весит 15 кб.
Я архивирую так: просто перекидываю все нужные файлы в папку с kzip.exe, потом с консоли ввожу такую команду:
И всё чудесно запаковывается. Правда потом нужно открыть архив с помощью того же WinRAR и удалить сам файл kzip.exe из архива.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо odd за это полезное сообщение:
|
|
01.06.2010, 15:19
|
#23
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
MidletPascal - 868166 байт
kzip - 868240 байт
и правда экономия)))
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо cherepets за это полезное сообщение:
|
|
01.06.2010, 22:46
|
#24
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
Как ты сжимал? У меня твоя прога сжимается так:
Было: 873263
Стало: 864136
А если твои картинки объединить в один пакет, то сжимать будет намного лучше.
|
(Offline)
|
|
01.06.2010, 23:17
|
#25
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
ты жмешь офф версию, с тех пор многое изменилось))
последняя тестовая дала такие результаты)
кстати в офф картинки не тронуты, а по тестовой прошелся пнгаутом
|
(Offline)
|
|
10.09.2010, 19:05
|
#26
|
Оператор ЭВМ
Регистрация: 30.08.2010
Сообщений: 26
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
ста, что лучше для экономного расхода памяти:
1. описать глобальную переменную в качестве параметра цикла, которую будут использовать три процедуры.
или
2. в каждой из трех процедур описать локальную переменную в качестве параметра цикла.
спасибо.
, пожалуйттеобъясни
|
(Offline)
|
|
27.05.2011, 18:00
|
#27
|
Разработчик
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений (для 319 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
Могу добавить насчет экономии памяти.
Не следует загружать сразу все ресурсы в память. Обычно это относиться к РПГ играм, так как картинок в РПГ чуть больше, чем дофига.
Обычно новички сразу все загружают в память и это - не есть хорошо. Лучше, если загружать только те картинки, которые собираются быть использованными в текущее время и постоянно.
Пример:
Есть туча изображений монстров и не меньшее количество изображений вещей (иконки).
Загружаем изображения монстров (иконки не трогаем) в массив, например, Monsters_image:array [1..50] of image. Ходим, бьем их и т.д. И вдруг нам понадобилось взглянуть в инвентарь. Нам необходимо загрузить иконки. Но перед этим необходимо "очистить" массив Monsters_image. "Очистить" изображения можно, присвоив каждому элементу массива "пустое" изображение. Пример "пустого изображения": null:image; (по умолчанию тип image является одиночным пикселем белого цвета, и занимет 4 байта). Теперь грузим иконки. После того, как игрок вышел из меню инвентаря, таким же способом "очищаем" иконки и загружаем изображения монстров обратно.
Плюс: экономия (значительная!) памяти.
Минус: Каждый раз при входе и выходе из меню инвентаря на загрузку ресурсов уходит 1-2 секунды (зависит от количества изображений и телефона)
__________________
Мечта программиста: запрограммировать процесс программирования.
Всё гениальное - просто.
http://passcall.ucoz.com
|
(Offline)
|
|
01.09.2011, 14:56
|
#28
|
AnyKey`щик
Регистрация: 31.07.2011
Сообщений: 10
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
вопрос: шла речь о "сделайте перерисовку только этой области, а не всего дисплея."
repaint отрисовывает весь экран. как отрисовать именно нужный участок?
и еще: как правильнее объявить переменную tmpGlob в таком случае (т.е. результат функции не нужен). использовать глобальную или создать локальную? к глобальной доступ медленнее, локальная - память занимает......
procedure _light_on;
begin
if sett_light_sw then tmpGlob:= set_lights(0, 100);
end;
позвольте поделиться своими наблюдениями:
1) в отличии от делфей, в мидлет паскаль в условии проверяется всегда оба логических выражения, что может приводить к ошибкам:
program a;
const
len = 10;
var
i: integer;
ar: array[0..len] of integer;
begin
i:=0;
while (i<=len)and(ar[i]<>0) do i:=i+1;
// на последнем шаге, когда i=len+1, будет проверка несуществующего ar[11]
end;
2) в цикле аргумент L вычисляется каждый раз. я имею ввиду L как выражение, например length(s), и если в цикле длина строки изменилась, число итераций также измениться.
3) для циклов быстрее всего выполняется условие
const
MAXLEN=10;
.....
while i<MAXLEN do ...
чуть медленнее и почти в 2 раза медленнее тестировал на своем телефоне, возможно на других будет по-другому.
Последний раз редактировалось AssA, 01.09.2011 в 18:07.
|
(Offline)
|
|
01.02.2012, 15:54
|
#29
|
Разработчик
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 419
Написано 100 полезных сообщений (для 182 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
Может быть и оффтоп, но статья довольно полезная: Игровые циклы или ЭлектроКардиоГама
|
(Offline)
|
|
20.01.2014, 20:10
|
#30
|
Оператор ЭВМ
Регистрация: 25.08.2013
Адрес: Москва
Сообщений: 45
Написано 13 полезных сообщений (для 28 пользователей)
|
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
Разве многопоточность увеличит скорость выполнения?
И я так и не понял, в чем плюс локальных переменных? Попробовал - вроде ничего не изменилось
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:35.
|