forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=48)
-   -   Общие советы по оптимизации MIDlet Pascal / Java2me программ (http://forum.boolean.name/showthread.php?t=12554)

cherepets 30.05.2010 18:02

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
сериес40 (все что цветное и не смарт)

odd 30.05.2010 19:17

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
Вот пример участка кода, который отвечает за отрисовку объектов (взято с помощью декомпиляции):
PHP код:

for(125 >= jj++)
{
    for(
125 >= ii++)
    {
        if(
objectmap[1][1] == 0)
        {
            
Lib_cherryfont.font(2);
            
M.G.drawImage(player, (60 4) + 30 + (M.RNG.nextInt() & ->>> 1) % 2, ((40 i1 4) - hero[j1 1][1].getHeight()) + 3520);
            
cx i;
            
cy j;
        }
        if((((
byte)(objectmap[1][1].compareTo(String.valueOf('b')) == ? -0))) != 0)
        {
            
M.G.drawImage(object[1], (60 4) + 26, ((40 i1 4) - object[1].getHeight()) + 3520);
        }
        if((((
byte)(objectmap[1][1].compareTo(String.valueOf('q')) == ? -0))) != 0)
        {
            
M.G.drawImage(object[1], (60 4) + 26, ((40 i1 4) - object[1].getHeight()) + 3520);
        }
        if((((
byte)(objectmap[1][1].compareTo(String.valueOf('v')) == ? -0))) != 0)
        {
            
M.G.drawImage(object[1], (60 4) + 26, ((40 i1 4) - object[1].getHeight()) + 3520);
        }
        if((((
byte)(objectmap[1][1].compareTo(String.valueOf('z')) == ? -0))) != 0)
        {
            
M.G.drawImage(object[15 1], (60 4) + F.tI(F.fI((65 object[15 1].getWidth()) / 2)) + 10 + (M.RNG.nextInt() & ->>> 1) % 2, ((40 i1 4) - object[15 1].getHeight()) + 3520);
        }
        if((((
byte)(objectmap[1][1].compareTo(String.valueOf('i')) == ? -0))) != 0)
        {
            
M.G.drawImage(object[16 1], (60 4) + F.tI(F.fI((65 object[16 1].getWidth()) / 2)) + 10 + (M.RNG.nextInt() & ->>> 1) % 2, ((40 i1 4) - object[16 1].getHeight()) + 3520);
        } 

Сразу бросаются в глаза ненужные повторные вычисления одного и того же выражения, да и у вас видимо тип юнита хранится в виде буквы, а сравнение данной буквы порождает кучу ненужных сравнений и переконвертаций объектов. Лучше тип юнита хранить в виде числа 0, 1, 2, 3... так легче сравнивать потом. Также не мешало бы использовать хотя бы оператор else, раз continue в Мидлет Паскале нет.
В итоге, после упрощения получим что-то типа такого:

PHP код:

int ab;
for(
125 >= jj++)
{
    for(
125 >= ii++)
    {
        
= (60 4) + 26;
        
= ((40 i1 4) + 35;
        if(
objectmap[1][1] == 1)
        {
            
Lib_cherryfont.font(2); // Ненужное повторяющееся действие в цикле, можно выкинуть из цикла вообще
            
M.G.drawImage(player+ (M.RNG.nextInt() & ->>> 1) % 2hero[j1 1][1].getHeight()), 20);
            
cx i// Тоже выкинуть
            
cy j// Тоже никак не используется в цикле
        
}
        if(
objectmap[1][1] == 1)
        {
            
M.G.drawImage(object[1], aobject[1].getHeight()), 20);
        }
        else if(
objectmap[1][1] == 2)
        {
            
M.G.drawImage(object[1], aobject[1].getHeight()), 20);
        }
        else if(
objectmap[1][1] == 3)
        {
            
M.G.drawImage(object[1], aobject[1].getHeight()), 20);
        }
        else if(
objectmap[1][1] == 4)
        {
            
M.G.drawImage(object[15 1], 16 F.tI(F.fI((65 object[15 1].getWidth()) / 2)) + (M.RNG.nextInt() & ->>> 1) % 2object[15 1].getHeight()), 20);
        }
        else if(
objectmap[1][1] == 5)
        {
            
M.G.drawImage(object[16 1], 16 F.tI(F.fI((65 object[16 1].getWidth()) / 2)) + (M.RNG.nextInt() & ->>> 1) % 2object[16 1].getHeight()), 20);
        } 

Спрайты в игре тоже хранятся в виде кучи отдельных файлов, что порождает большие размеры программы и огромные массивы картинок для их хранения.
Вы вообще слышали, что существуют специальные библиотеки для работы со спрайтами?

cherepets 30.05.2010 19:44

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
предметов больше чем цифр, вот и перешел на буквы.
выбор шрифта в другом месте стоит, хз почему он у тебя там))

а вот else можно и наставить)))

odd 30.05.2010 20:28

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
Главное ускорение всё же в использовании локальных переменных а и b.
Попробуй хотя бы их добавить в программу, FPS вырастет, я думаю как минимум раза в 2.
И используй числа, а не цифры для обозначения типа юнита. 4 миллиардов значений должно хватить. Чего нельзя сказать о цифрах и буквах.

cherepets 30.05.2010 21:19

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
декомпиль + моя логика видимо помешали твоему восприятию программы.
(i * 60 - j * 4) + l * 6 + 26;
считается и так по одному разу для каждого значения i и j

перейти на цифры можно, попробую)) а вообще я добился уже 2.5 фпс, чего при пошаговом перемещении хватит (прощитал все деления зарание + более грамотно реализовал задержку)

cherepets 31.05.2010 13:52

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
а можно еще про kzip поподробнее?
в смысле как им паковать. нормальной инструкции нет + консольными архиваторами не пользовался
и еще вопрос о каком именно kzip'е идет речь? есть аналог винзипа для линя с таким названием и консольный на 15кб

учитывая сколько я времени потратил на переход на цифры (так и не закончил), прирост менее 10000% считается маленьким...

odd 01.06.2010 14:03

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
kzip сам консольный, весит 15 кб.
Я архивирую так: просто перекидываю все нужные файлы в папку с kzip.exe, потом с консоли ввожу такую команду:
PHP код:

kzip /r game.jar 

И всё чудесно запаковывается. Правда потом нужно открыть архив с помощью того же WinRAR и удалить сам файл kzip.exe из архива.

cherepets 01.06.2010 15:19

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
MidletPascal - 868166 байт
kzip - 868240 байт

и правда экономия)))

odd 01.06.2010 22:46

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
Как ты сжимал? У меня твоя прога сжимается так:
Было: 873263
Стало: 864136
А если твои картинки объединить в один пакет, то сжимать будет намного лучше.

cherepets 01.06.2010 23:17

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
ты жмешь офф версию, с тех пор многое изменилось))
последняя тестовая дала такие результаты)

кстати в офф картинки не тронуты, а по тестовой прошелся пнгаутом

dmitriy-dim 10.09.2010 19:05

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
ста, что лучше для экономного расхода памяти:
1. описать глобальную переменную в качестве параметра цикла, которую будут использовать три процедуры.
или
2. в каждой из трех процедур описать локальную переменную в качестве параметра цикла.
спасибо.
, пожалуйттеобъясни

PassCall 27.05.2011 18:00

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
Могу добавить насчет экономии памяти.

Не следует загружать сразу все ресурсы в память. Обычно это относиться к РПГ играм, так как картинок в РПГ чуть больше, чем дофига.

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

Пример:
Есть туча изображений монстров и не меньшее количество изображений вещей (иконки).


Загружаем изображения монстров (иконки не трогаем) в массив, например, Monsters_image:array [1..50] of image. Ходим, бьем их и т.д. И вдруг нам понадобилось взглянуть в инвентарь. Нам необходимо загрузить иконки. Но перед этим необходимо "очистить" массив Monsters_image. "Очистить" изображения можно, присвоив каждому элементу массива "пустое" изображение. Пример "пустого изображения": null:image; (по умолчанию тип image является одиночным пикселем белого цвета, и занимет 4 байта). Теперь грузим иконки. После того, как игрок вышел из меню инвентаря, таким же способом "очищаем" иконки и загружаем изображения монстров обратно.

Плюс: экономия (значительная!) памяти.
Минус: Каждый раз при входе и выходе из меню инвентаря на загрузку ресурсов уходит 1-2 секунды (зависит от количества изображений и телефона)

AssA 01.09.2011 14:56

Ответ: Общие советы по оптимизации 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) в цикле
Код:

for i:=0 to L do ...
аргумент L вычисляется каждый раз. я имею ввиду L как выражение, например length(s), и если в цикле длина строки изменилась, число итераций также измениться.

3) для циклов быстрее всего выполняется условие
Код:

const
  MAXLEN=10;
.....
while i<MAXLEN do ...

чуть медленнее
Код:

while i<=MAXIND do ...
и почти в 2 раза медленнее
Код:

while i<MAXIND+1 do ...
тестировал на своем телефоне, возможно на других будет по-другому.

AVL 01.02.2012 15:54

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
Может быть и оффтоп, но статья довольно полезная: Игровые циклы или ЭлектроКардиоГама

RblSb 20.01.2014 20:10

Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ
 
Разве многопоточность увеличит скорость выполнения?
И я так и не понял, в чем плюс локальных переменных? Попробовал - вроде ничего не изменилось


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot