Здраствуйте, сегодня хочу расказать что же такое оптимизация кода, для чего она нужна и как же её сделать. (( Вся стстья написана полностью мной и так как я понимаю и делаю. ))
Оптимизация - это изменения кода, так что бы размер его, объем занимаемой памяти и кол-во совершаемых действий компьютером довести до минимума, но при этом функциональность кода оставить без изменений.
Новички которые только начинают писать свои первые скрипты,пишут много бесполезных действий для программы, тем самым нагружая её.
Начнём с циклов. В циклах, когда нужно выполнить его для всех игроков, обычно используют MAX_PLAYERS, тем самым выполняя действие 500 раз, но при этом мало у кого на сервере стоит реально 500 слотов.Поэтому я бы советовал использховать GetMaxPlayers(), тогда сервер будет получать кол-во реальных слотов и выполнять действие столько раз сколько у вас слотов, не нагружая его лишними действиями.
Кстати тоже самое можно сказать и про MAX_VEHICLES,ведь не у кого на севрере почти не стоит 2000 машин,а цикл будет выполнять 2000 действий,хотя реальных автомобилей может быть 100.
Дальше, я думаю на нагрузку на сервер это не влияет, но делает код меньше и удобней.
Если вы пишите множество условий, но при этом некоторые действия выполняются в любом из них, то можно просто данное действие вынести за пределы условий, так как оно выполнится в любом случае. Например:
Так как конструкция switch/case работает значительно быстрее и использовать её гораздо удобнее(во всяком случае мне).
Сейчас ещё вспомнил частую ошибку,которую постоянно видел:
Code
if(PlayerAdmin[playerid] > 0){} else if(PlayerAdmin[playerid] == 0){SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");}
Зачем делать условие при прохождение котрого,ничего не пройзойдет - это глупо! Правильный пример:
Code
if(PlayerAdmin[playerid] == 0){SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");}
Кстати,если при прохождение проверки исполняется одно действие,то { } ставить не обязательно,то есть можно оставить так:
Code
if(PlayerAdmin[playerid] == 0)SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");
И на конец,забудьте глупое утверждение,что чем больше код тем он "круче",совсем наоборот,чем меньше по объему ваш код,тем лучше,главное это функциональность этого самого кода!
Статья подготовлена специально для rp-sc.ru и samp-rus.com,копирование статьи на другие проекты запрещено.
Прощай самп-рус =Р
Сообщение отредактировал Impereal - Понедельник, 02.05.2011, 14:10
И вот, прошло уже больше года со дня релиза foreach от Y_Less'a, а они все еще выдумывают что то c GetMaxPlayers...
More than 4 years of development, more than 250,000 lines of source code, more than a hundred units and more than 3400 revisions. Valakas Roleplay - choose your role.
Impereal Увы, но с GetMaxPlayers() за счет вызова функции далеко не лучший вариант. Результаты: GetMaxPlayers - 1315ms (для справки я выставил всего 200 слотов) Просто 500 игроков - 311ms http://best.of.by/paste/d1073b89 В этом ты ошибся, и как сказал ув.Eakwarp пора обновляться. Далее на счет условий, там, где возможно лучше всегда использовать оператор переключатель "switch". Далее пример с возвратом тоже не лучший способ, во-первых, иной раз ты не знаешь, что вернет функция SendClientMessage, во-вторых, это полностью идентично действию и я не думаю, что это прибавит частоту выполнения. if(PlayerAdmin[playerid] == 0) { SendClientMessage(playerid,COLOR_WHITE,"Вы не администратор!"); return 1; } Только в первом случаи ты вызываешь функцию и возвращаешь полученное значение из функции.
Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
Сообщение отредактировал toneysix - Понедельник, 02.05.2011, 14:23
More than 4 years of development, more than 250,000 lines of source code, more than a hundred units and more than 3400 revisions. Valakas Roleplay - choose your role.
Далее на счет условий, там, где возможно лучше всегда использовать оператор переключатель "switch".
Про это написал.
Quote (toneysix)
Далее пример с возвратом тоже не лучший способ, во-первых, иной раз ты не знаешь, что вернет функция SendClientMessage, во-вторых, это полностью идентично действию и я не думаю, что это прибавит частоту выполнения. if(PlayerAdmin[playerid] == 0) { SendClientMessage(playerid,COLOR_WHITE,"Вы не администратор!"); return 1; } Только в первом случаи ты вызываешь функцию и возвращаешь полученное значение из функции.
Окей,учту. Написал как сам делаю и как думаю,возможно в чём то не прав
Добавлено (02.05.2011, 14:32) --------------------------------------------- upd. лучше перевести на русский ссылку выше, чем велосипеды изобретать.
More than 4 years of development, more than 250,000 lines of source code, more than a hundred units and more than 3400 revisions. Valakas Roleplay - choose your role.
Goshik, запуститься то он запустить , ну должен по крайне мере, кстати, с авто реально можно забыть, но просто ставим памятку себе в начале мода и всё, не забываем
Спор на форуме, все равно что олимпиада среди умственно отсталых: даже если ты победил, ты все равно гермофродит. Хочешь остаться при своем мнении - держи его при себе.
Ну да,только я там чуть чуть другое имел ввиду А так то вот
Quote (Impereal)
Кстати,если при прохождение проверки исполняется одно действие,то { } ставить не обязательно,то есть можно оставить так: Codeif(PlayerAdmin[playerid] == 0)SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");
Прощай самп-рус =Р
Сообщение отредактировал Impereal - Понедельник, 02.05.2011, 15:45
Fus1, двойка с минусом, все равно медленнее foreach. Impereal, советую переписать весь фак, без использования неправильных примеров.
More than 4 years of development, more than 250,000 lines of source code, more than a hundred units and more than 3400 revisions. Valakas Roleplay - choose your role.