Показать сообщение отдельно
Старый 30.05.2010, 19:17   #17
odd
Мастер
 
Аватар для odd
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dmitriy-dim (10.09.2010)