Вопросы

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

Изучать 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 пользователей онлайн

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

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

    • KAIF
      От KAIF


      Скачать файл GTA RolePlay-МОД,СБОРКА
      !!!!!ВСЕГО ОДНА КОПИЯ!!!! 
      Единственный мод GTA RP.
       
      Фракции:
      Правительство
      ГИБДД
      Полиция Южного
      ФСБ
      ЦГБ-А
      Автошкола
      Китайская мафия
      Русская Мафия
      Итальянская Мафия
      Американская Мафия
      Чеченская Мафия
      ВВС
      МЧС
      ОПГ Тяп-Ляп
      ОПГ Хади-Такташ
      СМИ Южного
      ФСИН
      В комплекте идёт СБОРКА И МОД.
      Единственный мод GTA RP.
      Добавил KAIF Добавлено 01.01.2024 Категория Моды Автор Aleksandr  
    • KAIF
      От KAIF
      !!!!!ВСЕГО ОДНА КОПИЯ!!!! 
      Единственный мод GTA RP.
       
      Фракции:
      Правительство
      ГИБДД
      Полиция Южного
      ФСБ
      ЦГБ-А
      Автошкола
      Китайская мафия
      Русская Мафия
      Итальянская Мафия
      Американская Мафия
      Чеченская Мафия
      ВВС
      МЧС
      ОПГ Тяп-Ляп
      ОПГ Хади-Такташ
      СМИ Южного
      ФСИН
      В комплекте идёт СБОРКА И МОД.
      Единственный мод GTA RP.
    • Узбек
      От Узбек
      Всем добрый вечер ребят! 
      Я начинающий, сегодня я вам сливаю команду 2(шт) на технические работы
      Ловите