Вопросы

Добрый вечер друзья.

Изучать pawn я начал относительно не давно, могу самостоятельно написать какие-то команды, системы (не сложные)

Но когда речь заходит об оптимизации, я даже не знаю что сказать, так-как  совершенно в этом не разбираюсь.

 

У меня есть команда:

Спойлер

CMD:setvw(playerid, params[])
{
    if(player[playerid][padmin] < 2) return true;
    if(sscanf(params, "dd", params[0], params[1])) return SendClientMessage(playerid, -1, "Используйте: /setvw [id игрока] [вирт.мир]");
    if(!IsPlayerConnected(params[0])) return SCM(playerid,COLOR_RED,"Такого игрока нет!");
    if(login_check[params[0]] == false) return SCM(playerid, COLOR_RED, "Игрок не авторизован!");
	SetPlayerVirtualWorld(params[0], params[1]);
	static const fmt_str[] = "Администратор %s [%d] изменил Ваш виртуальный мир на %d";
	new string[sizeof(fmt_str)+MAX_PLAYER_NAME-2-2-2];
	format(string, sizeof(string), fmt_str, GN(playerid), playerid, params[1]);
	SendClientMessage(params[0], COLOR_BLUE, string);
	static const fmt_strlog[] = "Администратор %s [%d] изменил виртуальный мир игроку %s [%d] на %d";
	new stringlog[sizeof(fmt_strlog)+MAX_PLAYER_NAME-2-2-2+MAX_PLAYER_NAME-2-2];
	format(stringlog, sizeof(stringlog), fmt_strlog, GN(playerid), playerid, GN(params[0]), params[0], params[1]);
	AdmChat(COLOR_LIGHTGREY,stringlog);
    return true;
}

Хотелось бы услышать здравой критики по поводу данной команды, вообще по поводу ее оптимизации или построении кода.

Хотелось бы услышать хорошие советы на будущее и т.д и т.п.

Жду Вашей критики и советов в исправлении чего-то :)

 

Отредактировано пользователем Yong

LilPokemon
LilPokemon предупредил Yong за это сообщение
Причина: Нарушение правил форума · Баллы: 0 ·

Заметка от LilPokemon , создано

3.1. Заголовок темы должен отражать основную суть темы. Темы без информативного заголовка будут переименовываться, а автор может быть предупрежден (на усмотрение модератора).

Поделиться сообщением


Ссылка на сообщение

5 ответов на этот вопрос

  • 0

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

Поделиться сообщением


Ссылка на сообщение
  • 0

@Yong в этой команде ничего не оптимизировать. 

Поделиться сообщением


Ссылка на сообщение
  • 0
15 часов назад, DEST сказал:

@Yong в этой команде ничего не оптимизировать. 

Просто я с static const не сильно знаком, я все правильно подсчитал ? Или может можно было проще сделать? Ведь команда выводит текст игроку, затем в админ чат, я использую два формата в команде, хочу услышать от профессионалов, правильно ли все сделано, или же можно было проще как то сделать 

Поделиться сообщением


Ссылка на сообщение
  • 0

@Yong самый простой вариант подсчета это просто выделить символы в кавычках и внизу, в редакторе покажет сколько их. Потом после прибавить еще значения, которые будут подставлены вместо %s, %d и т.д. 

Поделиться сообщением


Ссылка на сообщение
  • 0

1. Static const, конечно, удобен для подсчета строки, но сильно раздувает код. Если Вас, конечно, никак не напрягают "лишние" строки, то ничего плохого не скажу. И помните, что оптимизация включает не только экономию памяти, быстродействие системы, но и удобство в понимании кода. Мне, например, порой бывает трудно понять за что отвечает params[0] или params[1], params[2] и так далее. А постоянно возвращаться в начало команды, где расположен sscanf, из которого хоть что-то понятно, мне не нравится. Потому я привык использовать отдельные переменные, а в params записывать только строки.

2. В sscanf есть отличный параметр "u", который возвратит ID игрока. Если этого игрока нет в сети, то вернет INVALID_PLAYER_ID. Так если есть встроенные параметры, созданные для извлечения ID игрока, зачем прибегать к другим?

3. Было бы неплохо проверить, есть ли вообще в команде параметры. Возможно, игрок ввел пустую строку (просто /setvw). А система будет вызывать функцию sscanf, что требует какого-то времени. Было бы неплохо в начале команды проверить сразу наличие параметров.

4. Этот макрос очень полезен, он есть во многих библиотеках, но на всякий случай, в начало мода добавьте (нужен он для проверки наличия параметров. Это лучше, чем strlen, в данном случае по крайней мере):

Спойлер

#if !defined isnull
    #define isnull(%1)\
        ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif

5. Можно заняться упаковкой строк. Выгоды от нее немного, но лишней не будет (правда важно понимать что такое упаковка строк и когда ее не следует применять).

6. Если команда не срабатывает по какой-либо причине (например, нет доступа, неправильно введены аргументы, игрок не в сети и все в этом роде), я возвращаю 0. Это позволит через функции, вызывающиеся после этой команды, например, OnPlayerCommandPerformed в DC_CMD, pawncmd, проверить, сработала ли команда. Мне, например, оно нужно. Глядите так и Вам пригодится. Лишним не будет.

 

И с учетом всех вышеприведенных изменений мой код выглядел бы так:

Спойлер

CMD:setvw(playerid, params[])
{
    static const MSG_USE_CMD_SETVW[] = !"Используйте: /setvw [id игрока] [вирт.мир]";

    if(player[playerid][padmin] < 2)
        return 0;

    else if(isnull(params))
        return SendClientMessage(playerid, -1, MSG_USE_CMD_SETVW) & 0;
 
    new id, world;
    if(sscanf(params, "ud", id, world))
        return SendClientMessage(playerid, -1, MSG_USE_CMD_SETVW) & 0;
    else if(id == INVALID_PLAYER_ID)
        return SCM(playerid,COLOR_RED, !"Такого игрока нет!") & 0;
else if(!login_check[id])
        return SCM(playerid, COLOR_RED, !"Игрок не авторизован!") & 0;
 
    SetPlayerVirtualWorld(id, world);
 
    new string[66+(-2+MAX_PLAYER_NAME)+(-2+4)+(-2+MAX_PLAYER_NAME)+(-2+4)+(-2+4)+1]; // считал по второму форматированию т.к. оно явно больше
 
    format(string, sizeof string, "Администратор %s [%d] изменил Ваш виртуальный мир на %d", GN(playerid), playerid, world);
    SendClientMessage(id, COLOR_BLUE, string);
 
    format(string, sizeof string, "Администратор %s [%d] изменил виртуальный мир игроку %s [%d] на %d", GN(playerid), playerid, GN(id), id, world);
    AdmChat(COLOR_LIGHTGREY, string);
return 1;
}

 

 

Заметка от DEST , создано

Автоматическое "разукрашивание кода"

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Aleksey98
      От Aleksey98
      Необходим человек: который сможет написать систему тюнинга!
      как на крупных проектах типа: Arizona и Radmir
      И еще требуется Мапперы на новый топовый проект!
      Связь : https://vk.com/id289498732
    • Mister Odin
      От Mister Odin
       
      new
       g_teleport_list[39][E_TELEPORT_LIST] = {  {"Спавн пгт.Батырево", 1802.3612, 2508.4824, 15.8887},  {"Спавн г.Арзамас", -113.5887, 977.7222, 12.0346},     {"Спавн г.Южный", 2744.2770, -2446.7246, 21.8988},     {"Центральный банк", 1852.020385,2040.791381,15.892713},  {"Рублёвка", -837.7783, 888.6161, 12.7232},  {"Казино", 1332.4252, 2358.7014, 17.6641},  {"Битва за контейнеры", 614.5167, 1722.3566, 12.0709},  {"Автосалон низкого класса", 2493.9616, -722.9544, 12.3315},  {"Автосалон среднего класса", 1407.7449, 455.4801, 13.1630},  {"Автосалон высокого класса", -14.0637, 2614.5664, 10.9892},   {"Мотосалон Harley Davidson", 785.720153, 750.465087, 12.000024},  {"Автошкола", 1909.174438,2227.679687,15.708162},  {"Военкомат", 1916.778564,2302.411376,15.574637},  {"Правительство области", -139.140975,593.789611,12.145712},  {"Отдел полиции №1 (ГИБДД)", 1906.805786,-2234.382812,11.257631},  {"Отдел полиции №2 (УМВД)", 2581.309326,-2416.139892,21.960090},  {"Отдел ФСБ", 1823.904663,2095.636718,15.848405},  {"Городская больница г.Арзамас", -285.797210,581.851562,12.120290},   {"СМИ", -317.708038,821.221679,13.051450},  {"Воинская часть", 1703.197265,1678.025878,15.279437},  {"Арзамасская ОПГ", 438.705322,1046.505126,12.002637},  {"Батыревская ОПГ", 1941.203857,2161.006591,15.705187},  {"Лыткаринская ОПГ", -2346.002441,75.257041,21.002962},  {"Шахта", 2381.5727, 1726.4451, -2.1506},  {"Завод", -1062.6697, 2204.1894, 38.0964},  {"Инкосация", 1864.1374, 2011.7136, 15.8546},  {"Транспортная Компания", 2362.1115, 1972.5627, 15.5530},  {"База механиков", 1840.918090,-118.025146,15.695312},  {"Курьерская служба доставки", 2764.509765,-2396.882568,21.890625},  {"Аренда автобуса(Южный)", 2771.041992,-2454.780761,21.845964},  {"Аренда автобуса(Арзамас)", -127.487670,943.652648,12.142824},   {"Аренда автобуса(Батырево)", 1798.986328,2529.591552,15.664262},  {"Гоночная трасса", -1568.7784, 1611.8305, 36.3971},  {"Дом на горе", -789.5397, -456.7479, 741.1422},  {"СТО и тюнинг-ателье", 1856.1375, -122.3266, 15.6888},  {"Аренда транспорта пгт.Батырево", 1763.641723,2255.673339,15.865348},  {"Аренда транспорта г.Арзамас", -36.923530,1360.673583,12.002090},  {"Аренда транспорта г.Южный", 1966.599975,-2603.943603,10.820312},  {"Тайный интерьер в Лыткарино", -2424.5818, 2846.3291, 40.7908} };