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

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

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

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

Ответ
 
Опции темы
Старый 30.05.2010, 14:02   #16
cherepets
Бывалый
 
Аватар для cherepets
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

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

Вот пример участка кода, который отвечает за отрисовку объектов (взято с помощью декомпиляции):
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 в Мидлет Паскале нет.
В итоге, после упрощения получим что-то типа такого:

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);
        } 
Спрайты в игре тоже хранятся в виде кучи отдельных файлов, что порождает большие размеры программы и огромные массивы картинок для их хранения.
Вы вообще слышали, что существуют специальные библиотеки для работы со спрайтами?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dmitriy-dim (10.09.2010)
Старый 30.05.2010, 15:44   #18
cherepets
Бывалый
 
Аватар для cherepets
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

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

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

Главное ускорение всё же в использовании локальных переменных а и b.
Попробуй хотя бы их добавить в программу, FPS вырастет, я думаю как минимум раза в 2.
И используй числа, а не цифры для обозначения типа юнита. 4 миллиардов значений должно хватить. Чего нельзя сказать о цифрах и буквах.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо odd за это полезное сообщение:
cherepets (30.05.2010), dmitriy-dim (10.09.2010)
Старый 30.05.2010, 17:19   #20
cherepets
Бывалый
 
Аватар для cherepets
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

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

перейти на цифры можно, попробую)) а вообще я добился уже 2.5 фпс, чего при пошаговом перемещении хватит (прощитал все деления зарание + более грамотно реализовал задержку)
(Offline)
 
Ответить с цитированием
Старый 31.05.2010, 09:52   #21
cherepets
Бывалый
 
Аватар для cherepets
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

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

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

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

kzip сам консольный, весит 15 кб.
Я архивирую так: просто перекидываю все нужные файлы в папку с kzip.exe, потом с консоли ввожу такую команду:
kzip /r game.jar 
И всё чудесно запаковывается. Правда потом нужно открыть архив с помощью того же WinRAR и удалить сам файл kzip.exe из архива.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо odd за это полезное сообщение:
cherepets (01.06.2010), dmitriy-dim (10.09.2010)
Старый 01.06.2010, 11:19   #23
cherepets
Бывалый
 
Аватар для cherepets
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

MidletPascal - 868166 байт
kzip - 868240 байт

и правда экономия)))
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо cherepets за это полезное сообщение:
Igor (01.06.2010), Rock2roll (31.07.2010)
Старый 01.06.2010, 18:46   #24
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Как ты сжимал? У меня твоя прога сжимается так:
Было: 873263
Стало: 864136
А если твои картинки объединить в один пакет, то сжимать будет намного лучше.
(Offline)
 
Ответить с цитированием
Старый 01.06.2010, 19:17   #25
cherepets
Бывалый
 
Аватар для cherepets
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

ты жмешь офф версию, с тех пор многое изменилось))
последняя тестовая дала такие результаты)

кстати в офф картинки не тронуты, а по тестовой прошелся пнгаутом
(Offline)
 
Ответить с цитированием
Старый 10.09.2010, 15:05   #26
dmitriy-dim
Оператор ЭВМ
 
Регистрация: 30.08.2010
Сообщений: 26
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

ста, что лучше для экономного расхода памяти:
1. описать глобальную переменную в качестве параметра цикла, которую будут использовать три процедуры.
или
2. в каждой из трех процедур описать локальную переменную в качестве параметра цикла.
спасибо.
, пожалуйттеобъясни
(Offline)
 
Ответить с цитированием
Старый 27.05.2011, 14:00   #27
PassCall
Разработчик
 
Аватар для PassCall
 
Регистрация: 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, 10:56   #28
AssA
AnyKey`щик
 
Аватар для AssA
 
Регистрация: 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) в цикле
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 ...
тестировал на своем телефоне, возможно на других будет по-другому.

Последний раз редактировалось AssA, 01.09.2011 в 14:07.
(Offline)
 
Ответить с цитированием
Старый 01.02.2012, 11:54   #29
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 417
Написано 100 полезных сообщений
(для 182 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Может быть и оффтоп, но статья довольно полезная: Игровые циклы или ЭлектроКардиоГама
(Offline)
 
Ответить с цитированием
Старый 20.01.2014, 16:10   #30
RblSb
Оператор ЭВМ
 
Аватар для RblSb
 
Регистрация: 25.08.2013
Адрес: Москва
Сообщений: 45
Написано 13 полезных сообщений
(для 28 пользователей)
Ответ: Общие советы по оптимизации MIDlet Pascal / Java2me программ

Разве многопоточность увеличит скорость выполнения?
И я так и не понял, в чем плюс локальных переменных? Попробовал - вроде ничего не изменилось
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


Часовой пояс GMT +1, время: 08:36.


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