#Storm 29 Опубликовано 3 марта, 2019 И снова здравствуйте, форумчане... Хотел узнать, что вообще нужно для оптимизации мода, какие советы будут? Что именно можно оптимизировать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
16Shadows 101 Опубликовано 3 марта, 2019 (изменено) Циклы с малым числом итераций и однозначными значениями при итерациях можно заменить прямым кодом. Меньше переменных - выше скорость. new Float:pickups[3][3] = {...}; for(new i; i < 3; i++) CreatePickup(model, pickups[i][0], pickups[i][1], pickups[i][2]); Можно заменить на: CreatePickup(model, x, y, z); CreatePickup(model, x, y, z); CreatePickup(model, x, y, z); Использовать одну и ту же переменную несколько раз по возможности. Много раз видел, что под каждый кусок данных создают новую переменную. Например, new str1[10], str2[20]; format(str1, sizeof(str1), "Пример 1"); format(str2, sizeof(str2), "Пример номер 1"); SendClientMessage(playerid, -1, str1); SendClientMessage(playerid, -1, str2); Очевидно, две переменных строки, которые в сумме составляют 30 символов (= 30 ячеек = 120 байт), можно заменить одной, ещё и уменьшив её длину: new str[15]; format(str, sizeof(str), "Пример 1"); SendClientMessage(playerid, -1, str); format(str, sizeof(str), "Пример номер 1"); SendClientMessage(playerid, -1, str); В итоге одна переменная длиной в 15 символов (= 15 ячеек = 60 байт) Так можно сильно сэкономить память. Более редкий совет для Pawn, но актуальный в общем для программирования: пытаться решать задачи не рекурсивно, а итеративно: Можно возводить в степень рекурсией: stock power(base, pow) { if(pow == 1) return base; else return power(base, pow-1)*base; } Тогда при каждом вызове функции power будет создаваться копия переменных base и pow для работы с ними. Если нам нужно возвести число в 10000 степень, то памяти может не хватить. Задачу также можно решить итеративно: stock power(base, pow) { new result = base; for(new i; i < pow-1; i++) result*base; return result; } Памяти такое решение займёт гораздо меньше. По возможности работать с ссылками на переменные (экономить память): Не утверждаю, что это совет корректен для Pawn, но в общем пригодится stock Example(arg1, arg2, arg3) { return arg1*arg2*arg3; } Для работы функции, будут созданы три копии переменных, что займёт доп. 12 байт памяти. А можно передать переменные ссылкой: stock Example(&arg1, &arg2, &arg3) { return arg1*arg2*arg3; } Тогда копии переменных не будут создаваться, а данные будут браться прямо из переменных. Таким же образом можно переписать значение переменно с помощью функции. Изменено 3 марта, 2019 пользователем 16Shadows 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
#Storm 29 Опубликовано 3 марта, 2019 Так, хорошо... А как понизить рекурсию грамотно? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
16Shadows 101 Опубликовано 3 марта, 2019 Ну от конкретной задачи зависит. Где-то рекурсию легко заменить итерациями (в частности, хвостовая рекурсия), а где-то потребуется написать очень сложные конструкции, чтобы итеративный метод работал правильно. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
#Storm 29 Опубликовано 3 марта, 2019 @16Shadows, можешь показать примеры уменьшения рекурсии? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
16Shadows 101 Опубликовано 3 марта, 2019 Ну в описании пункта я оставил пример, а дальше уже ищите у себя в моде рекурсию. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты