Показать сообщение отдельно
Старый 30.05.2010, 19: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)