Question

Yong
Освоившийся

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

Изучать 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;
}

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

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

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

 

Edited by Yong

LilPokemon
LilPokemon gave Yong a warning for this post
Reason: Нарушение правил форума · Points: 0 ·

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

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

Share this post


Link to post

5 answers to this question

  • 0
LilPokemon
Гуру форума

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

Share this post


Link to post
  • 0
Yong
Освоившийся
15 часов назад, DEST сказал:

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

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

Share this post


Link to post
  • 0
DEST
Maintainer

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

Share this post


Link to post
  • 0
Cawfee
Великий Гуру

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 , создано

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

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • снайк
      By снайк
      Проект Meridian Project (CR:MP) выходит на стадию активного расширения. Мы серьезно обновили основу мода и теперь ищем талантливых разработчиков, готовых вместе с нами дополнять и улучшать игровой мир.
       
      Важное уточнение по условиям: На текущем этапе мы работаем на энтузиазме и долгосрочную перспективу. В данный момент все средства уходят на техническую разработку и поддержание серверной инфраструктуры, поэтому сразу оплачивать работу мы не сможем.
       
      Как только сервер будет успешно запущен и начнет функционировать в штатном режиме, мы перейдем на оплату труда. Со своей стороны гарантируем честность и различные «плюшки» на сервере для членов команды.
       
      Что мы предлагаем:
      Работа над структурированным и оптимизированным модом.
      Четкие ТЗ и адекватное руководство.
      Возможность стать частью ключевого состава на старте.
       
      Наши требования:
      Уверенное владение языком PAWN.
      Знание MySQL и основ оптимизации.
      Желание развивать качественный проект, а не просто «накидать код».
      Ответственность: взялись за задачу — довели до конца.
       
      Ваши задачи:
      Разработка и внедрение новых систем (работы, функционал фракций и др.).
      Исправление багов и доработка текущего функционала.
       
      Убедительная просьба: если вас не устраивают условия работы на перспективу или вам не интересен сам процесс создания качественного продукта — пожалуйста, не тратьте наше и своё время. Мы ищем единомышленников, которые готовы расти вместе с проектом, а не тех, кто ищет легкой и быстрой наживы здесь и сейчас.
       
      Связаться с нами: 
      Telegram: https://t.me/escape_log
      ВКонтакте: https://vk.com/oskar_novicc
    • tamikmod
      By tamikmod
      проблема на фото указана, прошу помочь