Рекомендованные сообщения



Не найдено.

6 posts in this topic

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

Изучать 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 , создано

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
15 часов назад, DEST сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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
Share on other sites
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

    • AndreyBoy
      By AndreyBoy
      У меня появилась постоянная проблема при перезаходе на сервер именно при админке. Я пробовал перезаходить без админки и всё успешно. Но когда я перезахожу с админкой то у меня не перекидывает на авторизацию и тому подобное а просто стрелочки снизу и "Spawn". Пробовал тыкать и ничего не выходит. Помогите решить проблему