Доступ к архиву

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Запущенный SAMP или скриптеры СНГ соединяйтесь

Знали ли вы про те советы, которые я назвал


  • Всего проголосовало
    8
Статус
В этой теме нельзя размещать новые ответы.

SWAT_O_PLUS

Изучающий
Пользователь
Регистрация
9 Фев 2014
Сообщения
193
Лучшие ответы
0
Репутация
26
Прочти это, если ты тру-скриптор секёшь в павно!

Многие скажут: не учи меня, я все знаю, я 5 лет в павно (гы в павно)

Друзья, я нахожу на самом популярном форуме среди pawn-скриптеров. Который даже называется по-дурацки. Еще до сих пор мало кто знает, что pawno это та самая маленькая программка, которая идет в комплекте поставки samp сервера для редактирования pwn файлов, а язык, на котором мы пишем наши шедевры называется pawn. Но речь не об этом, я хочу задать один вопрос: вас не задолбало ковыряться в этом говне? Ау, сообщество, мы вообще не развиваемся. Давайте я разделю наше сообщество:

1. Энтузиасты - скриптят, потому что им интересно создавать что-то новое, воплощать свои идеи, в основном именно они придумывают какие-то инновации.
2. Корыстные (в том числе и я) - люди, для которых это заработок, большая часть из них не сидит на форумах, большая часть из них фиксит баги энтузиастов и школоскриптеров, большинство из них является школоскриптерами, большинство из них не умеют скриптить, да они пишут код который даже работает, однако этого не достаточно.

Одни пишут скрипты, другие их собирают в моды, при чем делают это отвратительно. Бывает надо поменять цену какой-нибудь вещи в моде. Её приходиться менять в 5 местах. Не уже ли сложно додуматься, что писать волшебные числа в коде литералами это плохо? Ну есть же макросы ( #define'ы ), есть переменные. Про switch в OnDialogResponse я вообще молчу. case 11235: ??? , но в моде это ладно, когда в FS все думают что ид 1 свободен, и вопли в коментах у меня открывается регистрация. Бывает берешь FS с паблика и час подстраиваешь его что бы он заработал как надо. Корыстные скажут, это те кто публикуют глупые, я то секу.... Но нет

А теперь, после всего это вылитого дерьма перейду к теме.

Почему же такое происходит. Вы посмотрите на форумы. На этот и на другие. 90% это нытье по поводу не работает, не компилиться. 9% Пубкикации шедевров. 1% что-то реально полезное. Мне кажется, что нам не хватает соглашений. Нам нужно создать перечень правил скриптинга и всего с этим связанного, а потом тыкать в эти правила нерадивых публикаторов, чтобы они правильно оформляли свои работы, а они будут это делать ведь они держаться только на ваших + в репу. Что бы те кто пишут скрипты на заказ или моды редактирует делали хотя бы простые вещи которые и им, и последующим скриптерам упрощают работу.

А теперь примеры таких соглашений.

1. streamer - это де факто уже стандарт, все должны им пользоваться, это единственное средство которое поможет создать неограниченное кол-во обектов/чекпоинтов/иконок на карте

2. DC_CMD - лучший процессор команд, он и удобен, и работает быстро. //Буквально сегодня (24.01.2017) столкнулся с модом в котором нет командного процессора вообще. Заказчик сказал что они купили мод месяц назад и по моду это видно что над ним недавно хорошо работали. Но как в 2016 году писать эту герлянду из else if, которая за линию работает, если есть zcmd dc_cmd которые работают за логарифм (или даже константу на хеш таблице). А потом вопросы вида: А сколько он онлайна выдержить.

Дополнение от OKStyle: Существует , который работает еще быстрее и имеет флаги команд, теперь админку сделать еще проще.

3. Замена цикла по всем игрокам на foreach - обман века. Распространенный пример оптимизации цикла по всем игрокам не эффективен.
форич нет вызовов нативных функций, есть накладные расходы связанные с извлечением индекса из массива. Вместо инкремента и сравнения с константой времени компиляции, делается инкремент, разыменование, копирование и сравнение с переменной, что работает дольше. На сколько дольше? Скорее всего незначительно, впрочем как и 1000 проверок if'ом. Если вы создаете выделенный сервер для вас актуальна именно пиковая нагрузка. Если максимальное количество слотов уменьшить, то уменьшиться и относительное преимущество форича. Я предполагаю что на 20 слотах с 5 онлайна, форич проиграет по скрорости, в любом случаем при пиковой нагрузке (полный сервер), форич проигрывает, из-за дополнительный накладных расходов.

Тест провести мне лень и скорее всего выигрыш при полном будет незначительным, впрочем как и проигрыш при пустом. Для побежки по всем игрокам это не рационально по следующим причинам:
1. Повышение пиковой нагрузки, или как минимум не снижение.
2. Лишняя зависимость в мод
3. Не последовательная пробежка, ну это кэширование и так далее.
4. Не читаемый синтаксис // ну это спорно, на вкус и цвет ...

Даже если считать, все пункты незначительным, пользы от какого решения нет, но есть лишняя зависимость.

Однако, если вы хотите сделать пробежку по всем игрокам определенной группы, например админы, здесь будет выигрыш и такое решение полезно, однако я ни разу не видел, что бы кто-то так делал, я вижу форич по всем игрокам с проверкой на принадлежность группе, что опять же будет хуже при полном онлайне, чем обычный цикл.
PHP:
#include <a_samp>
#include <foreach>

new PlayerLogged[MAX_PLAYERS];

main(){
    print("\n\nНачало теста.");
	printf("MAX_PLAYERS is %d", MAX_PLAYERS);
    for(new i; i < MAX_PLAYERS; i++)
        Iter_Add(Player, i);
        
    new iter_count;
    foreach(new i: Player){
        iter_count++;
		PlayerLogged[i]=1;
	}
    printf("foreach совершил %d итераций", iter_count);
    
    new time_1 = GetTickCount();
    for(new j; j < 1_000; j++){
		for(new i;i<MAX_PLAYERS;i++)
			if(!PlayerLogged[i]) continue;
    }
    time_1 = GetTickCount()-time_1;
    
    new time_2 = GetTickCount();
    for(new j; j < 1_000; j++)
    {
        foreach(new i: Player){
			if(!PlayerLogged[i]) continue;
		}
    }
    time_2 = GetTickCount()-time_2;
    
    printf("Цикл for на %d игроков обработался за %dс", MAX_PLAYERS, time_1);
    printf("Цикл foreach на %d игроков обработался за %dс\n\n", iter_count, time_2);
}
PHP:
Начало теста.
[22:06:53] MAX_PLAYERS is 1000
[22:06:53] foreach совершил 1000 итераций
[22:06:53] Цикл for на 1000 игроков обработался за 82с
[22:06:53] Цикл foreach на 1000 игроков обработался за 99с

Однако, при правильном его использовании можно добиться незначительной оптимизации. Но, по моему личному опыту, я не рекомендую пользоваться этой библиотекой начинающим пользователям. Так как добавление лишней библиотеки, это дополнительные усилия по ее изучению и обслуживанию.

Существуют примеры, где использование foreach не только оправдано, но даже и необходимо. Один из таких примеров, следующая задача: написать "сообщение всем администраторам". Однако нужно осторожно пользоваться данной библиотекой. Я рекомендую её только продвинутым скриптерам и профессионалам. А новичкам и любителям, следует подробно ознакомиться с принципом работы и функционалом перед использованием.

4. Это что лень или жадность? Глупость!
PHP:
 CMD:poweron(playerid,params[]){
	if(sscanf(params, "u", params[0]))  return;
//.....
}
Часто в оптимизации существует дилема, можно сэкономить либо оперативную память, либо процессорное время. Если речь идет не о микроконтроллерах, то экономят процессор.
Вы экономите ячейку (4 байта) при этом будете делать разыменование каждый раз, когда обращаетесь. При этом падает читаемость кода, писать params[0] не удобно, проще придумать имя и радоваться автодополнению (Я пишу в notepad++ и кайфую, а вы и дальше пользуйтесь pawno).
А теперь самое фатальное: amx - стековая машина память под локальные переменные выдаляется один раз при старте этой машины. Если минимальный размер стека необходимый для выполнения этой функции не превышает эту величину для других функций, а она обычно зашкаливает в OnGameModeInit и других стандартных пабликах, то вы не экономите даже эти несчастные 4 байта. Более того params храниться в куче и доступ туда дольше чем к локальной переменной, плюс разыменование: вы тупо нагружаете процессор и не экономите память.

5. #pragma dynamic //вернемся к стековости amx.
Эта прагма позволяет указывать размер кучи/стека. По умолчанию 16кб (4096 ячеек). Понасоздавав кучу строк str[2000] большой длинны и получив какой-то варн мы находим решение величайшую пагму динамик. Но находяться умники, которые говорят, что это все костыли, надо решать проблему, снижать размер стека, делая ВСЕ! строковые переменные глобальными и используя глупости из прошлого пункта. Более того мало кто знает ПОЧЕМУ большой размер стека плохо, ну типо кеш процессора и так далее, НО 16кб и 20кб стека не соизмеримы с МЕГАБАЙТНЫМ кешом процессора. Да какое кэширование в виртуальной машине? Это очень незначительное ускорение.

6. А зачем нам большие строки?
Раньше мы хранили акки в файлах. Кто-то придумал некоторые обобщения и появились Dini и mxIni. Но для хранения данных придумали более удобные системы SQLite и MySQL. На SQL все забили и вправду MySQL лучше, ну ок. Да он лучше, только мы пользоваться не умеем, и создаем в таблицах по 100 полей и шлем один большой запрос большой длинны. 100 полей в таблице это не совсем хорошо. Тем более большая часть из них используется редко. Можно сделать дополнительную таблице где храниться id игрока, ключ, значение

7. Как мы храним банки мафий и количество металла на заводе? Правильно, как идиоты.
Создать таблицу с 23 полями и одной строкой как-то не ок. При этом все целочисленные. Ключ, значение? Не, не слышал.

Я уже молчу про то, что лень заглянуть в словарь переводчик чтобы посмотреть как будет склад (stock, storage).
И это только-то, что я сейчас вспомнил.

Спасибо, тем кто дочитал до конца, это принесло вам немного опыта, вы сделали полезное себе. Дополните кто чем может, только не голословно, а с обоснованием.

Продолжается основная деятельность темы: прием дополнений к этим правилам.

Напоминаю, что я собираю советы в основном для любителей, которые публикуют свои работы. Так же принимаются любые советы связанные с офомлением/кодированием/проектированием/структуризацией. Советы по оптимизации принимаются только глобальные, а не уровня экономии тактов. Совет про оптимизацию строк которые идут в SendClientMessage в длину 144, я считаю глобальным советом при кодировании, это не так сложно и не так занудно писать str[144] вместе str[200] или str[256]. А вот вещи типа надо писать так:
PHP:
PlayerMoney[PlayerLicensor[playerid]]+=200;
GivePlayerMoney(PlayerLicensor[playerid],200);
SendClientMessage(PlayerLicensor[playerid],"У вас согласились купить лицензию за 200$");
Вместо
PHP:
new licensor=PlayerLicensor[playerid];
PlayerMoney[licensor]+=200;
GivePlayerMoney(licensor,200);
SendClientMessage(licensor,"У вас согласились купить лицензию за 200$");
Это спорная оптимизация по памяти в ущерб времени выполнения с ухудшением читаемости кода.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу