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