PDA

Просмотр полной версии : [Include] eDialog -> Экспериментальный диалоговый процессор



Edwin
14.04.2016, 17:04
Инклуд позволяет использовать вызов диалога в форме:
ShowPlayerDialog(playerid, DIALOG_NAME, response, listitem, inputtext[]);
при этом DIALOG_NAME не требует объявления,
и вызывется напрямую, обходя перебор dialogid.
Все названия диалогов пишутся цифрами, либо буквами без кавычек.


Использование инклуда:

DLG:DIALOG_NAME(playerid, response, listitem, inputtext)
DIALOG:DIALOG_NAME(playerid, response, listitem, inputtext)
E_DLG:DIALOG_NAME()

ShowInfoDialog(playerid, caption[], info[]); // Информационное окно


Коллбэки:

OnDialogResponseError(playerid, dialogid, response, listitem, inputtext[]); // Напишет в консоль данные в случае несовпадения dialogid


Примеры использования:

else if (strcmp("/dlg", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid, D_TEST1, DIALOG_STYLE_MSGBOX, "Тестовый диалог", "{ffffff}Диалог {00ff00}№1 {ffffff}вызвался!", "Второй", "Закрыть");
return 1;
}

В свободном месте мода обозначается сам диалог:

DLG:D_TEST1(playerid, response, listitem, inputtext[])
{
if(!response) return 1;
return ShowPlayerDialog(playerid, D_TEST2, DIALOG_STYLE_MSGBOX, "Тестовый диалог", "{ffffff}Диалог {0000ff}№2 {ffffff}вызвался!", "Первый", "Закрыть");
}

DLG:D_TEST2(playerid, response, listitem, inputtext[])
{
if(!response) return 1;
return ShowPlayerDialog(playerid, D_TEST1, DIALOG_STYLE_MSGBOX, "Тестовый диалог", "{ffffff}Диалог {00ff00}№1 {ffffff}вызвался!", "Второй", "Закрыть");
}


http://i77.fastpic.ru/big/2016/0414/47/76f6d2e45f62bb155bf8ec8732ba1f47.png



Тест реализован на цикле в 100000 итераций, в которых сначала показывается диалог, а после вызывается OnDialogResponse.
Для стандартного движка создано 200 простых диалогов в OnDialogResponse

Сами замеры:


'ShowPlayerDialog' productiveness Test result:
ShowPlayerDialog = 439ms
OnDialogResponse = 303ms

// И ещё раз

'ShowPlayerDialog' productiveness Test result:
ShowPlayerDialog = 416ms
OnDialogResponse = 311ms

//=================

eDialog include productiveness Test result:
ShowPlayerDialog = 533ms
OnDialogResponse = 74ms

// И ещё раз

eDialog include productiveness Test result:
ShowPlayerDialog = 573ms
OnDialogResponse = 65ms


Как мы видим из теста, процессор слегка проигрывает стандартному ShowPlayerDialog при вызове диалога, из-за получения индексирования функций и короткой работы с массивами, но результаты обработки колоссально от него отличаются: они превосходят его по скорости в 4-5 раз.


http://i77.fastpic.ru/big/2016/0505/1f/e0acde433e2a869a641db004293b9e1f.png


Коды файлов, использованных для теста:
PasteBin (http://pastebin.com/qLXanBzZ)





Текущая версия инклуда: 3.0

Скачать инклуд можно по ссылке: eDialog.inc (http://rgho.st/7kNQ4MVrq)
PasteBin (http://pastebin.com/c9SRPGHK)





Автор: Edwin, то есть я. Копирование на других сайтах без подписи автора - подсудное дело

Иван Бубнов
14.04.2016, 17:08
ShowPlayerDialog(playerid, DIALOG_NAME, response, listitem, inputtext[]);

DIALOG_NAME - caption?
Просто написал бы что с использованием этого инклуда, вы избавляетесь от необходимости вводить ИД диалогов.

Однако, как проверять какой диалог был нажат игроком? Нормально опишите инклуд. А то такое чувство, будто вы сын Кличко

Edwin
14.04.2016, 17:23
Что?

Инклуд позволяет использовать вызов диалога в форме:
ShowPlayerDialog(playerid, DIALOG_NAME, response, listitem, inputtext[]);
и вызывать DIALOG_NAME напрямую, обходя перебор dialogid.
Все названия диалогов пишутся буквами, либо цифрами, без кавычек.
Что не понятно?

Нет, не caption

без кавычек.

Seregamil
14.04.2016, 17:57
И в чем прикол? Чем не устроил обычный OnDialogResponce? По мне дак это тупая нагрузка мода и ничего более того.

Edwin
14.04.2016, 18:33
И в чем прикол? Чем не устроил обычный OnDialogResponce? По мне дак это тупая нагрузка мода и ничего более того.

А прикол в том, дорогой Серёгамил, что можно выбирать любой id диалога буквами, как переменные, которые не нужно объявлять. А ещё, вызов диалога идёт напрямую в функцию, обходя именно этот пересчёт dialogid, как в OnDialogResponse. И что результат будет быстрее - это видно невооружённым взглядом, иначе Кортез бы не создал свой DC_CMD. Где там нагрузка - не понятно. Одна нагрузка - в показе диалога, цикл, который чуть что, сразу завершается. А ещё, диалог можно вынести в любую часть мода, и работать с ним там, где тебе только вздумается, для удобства. Вот, как бы..

Чуть позже запилим тест скорости

Desulaid
14.04.2016, 18:34
Но ведь ... бац (http://pro-pawn.ru/showthread.php?12254) и бац (http://pro-pawn.ru/showthread.php?13626). Кстать, у тебя в инклуде есть неиспользуемый код. Да, и моя реализация попроще будет :)

Edwin
14.04.2016, 21:49
Ну блин, это да, я просто писал инклуд для себя, и заметил, что изобрёл велосипед, только уже когда написал и протестил...
Обидно так стало, и реализация в твоей версии хороша, но я просто что бы не выкидывать работу коту под хвост, решил уж выкинуть в паблик..
Кстати, у меня слегка другая реализация, чуть позже сделаю тесты скорости, и может быть что-то из этого и вышло.
Насчёт неиспользуемого кода - да, на то и #pragma unused, но всё это было мне нужно в процессе создания. Так что вы легко можете это удалить, я побоялся пока что.
Ещё буду над ним работать

Desulaid
14.04.2016, 22:50
Ну блин, это да, я просто писал инклуд для себя, и заметил, что изобрёл велосипед, только уже когда написал и протестил...
Обидно так стало, и реализация в твоей версии хороша, но я просто что бы не выкидывать работу коту под хвост, решил уж выкинуть в паблик..
Кстати, у меня слегка другая реализация, чуть позже сделаю тесты скорости, и может быть что-то из этого и вышло.
Насчёт неиспользуемого кода - да, на то и #pragma unused, но всё это было мне нужно в процессе создания. Так что вы легко можете это удалить, я побоялся пока что.
Ещё буду над ним работать

Ага. Подобное было сделано еще в 2011 (http://forum.sa-mp.com/showthread.php?t=281245) :)

Seregamil
15.04.2016, 08:57
А прикол в том, дорогой Серёгамил, что можно выбирать любой id диалога буквами, как переменные, которые не нужно объявлять. А ещё, вызов диалога идёт напрямую в функцию, обходя именно этот пересчёт dialogid, как в OnDialogResponse. И что результат будет быстрее - это видно невооружённым взглядом, иначе Кортез бы не создал свой DC_CMD. Где там нагрузка - не понятно. Одна нагрузка - в показе диалога, цикл, который чуть что, сразу завершается. А ещё, диалог можно вынести в любую часть мода, и работать с ним там, где тебе только вздумается, для удобства. Вот, как бы..

Чуть позже запилим тест скорости

Оптимизация в чем?
Командный процессор dc_cmd идет как плагин и вся обработка данных на нем, а плагины, как известно, быстрее в плане обработки данных.
Использовать вне метода OnDialogResponce проще уж так, и там по сути те же имена - http://pro-pawn.ru/showthread.php?12254-ZL_DLG-v1-1-%D0%94%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA-%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2&p=61189&viewfull=1#post61189

Разница лишь в том, что если ошибиться в вводе названия диалога у тебя, то ничего не выдаст, а у Londlem выдаст ошибку еще на этапе компиляции.

Лично для меня эта работа - бред. И по скорости я сомневаюсь, что она будет быстрее. Сильно сомневаюсь

Edwin
15.04.2016, 10:20
Ну хочешь - не качай
Это мой первый инклуд, с моей точкой видения. Я сказал, что буду дорабатывать, инклуд экспериментальный, чё ты от меня ещё хочешь?
Я выслушал критику, да, спасибо за то, что лишний раз дал мне понять, что я сделал то, что уже есть.
Плагин - есть плагин, это две разные вещи. Я ещё раз тебе повторяю, что делал для себя, для удобства, для красоты.
Мне так хочется
Ты Londlem'а со мной не сравнивай, он давний профессионал, а я написал инклуд впервые в жизни. Что ещё тебе не понятно из того, что я буду его дорабатывать? Можно сделать и вывод ошибки, в чём проблема?

Seregamil
15.04.2016, 12:15
Ну хочешь - не качай
Это мой первый инклуд, с моей точкой видения. Я сказал, что буду дорабатывать, инклуд экспериментальный, чё ты от меня ещё хочешь?
Я выслушал критику, да, спасибо за то, что лишний раз дал мне понять, что я сделал то, что уже есть.
Плагин - есть плагин, это две разные вещи. Я ещё раз тебе повторяю, что делал для себя, для удобства, для красоты.
Мне так хочется
Ты Londlem'а со мной не спрашивай, он давний профессионал, а я написал инклуд впервые в жизни. Что ещё тебе не понятно из того, что я буду его дорабатывать? Можно сделать и вывод ошибки, в чём проблема?

Что в этом инклуде "эксперементального"? Ничего.
В чем разница написание инклуда от обычного скрипта или мода? Нет этой разницы, инклуд есть содержимое мода, правда вырезанное.
Если ты делал для себя, то зачем это показывать?
Я не сравнивал тебя и Londlema, я сравнил твою и его работу, имею право.

vovandolg
15.04.2016, 18:42
Автор кинул бы хоть показатели тестов скорости между твоим и стандартным процессором)

Edwin
15.04.2016, 21:08
Автор кинул бы хоть показатели тестов скорости между твоим и стандартным процессором)

Да нету ещё, скоро сделаю, я ж говорю. Как руки дойдут

vovandolg
15.04.2016, 23:18
Так надо было сперва сделать и проверить, а потом сюда выкладывать..
Я считаю так правильно было бы:mosking:
Просто вдруг это шлак получится, зачем тогда флудить бесполезным мусором..

Edwin
17.04.2016, 18:56
Так надо было сперва сделать и проверить, а потом сюда выкладывать..
Я считаю так правильно было бы:mosking:
Просто вдруг это шлак получится, зачем тогда флудить бесполезным мусором..

Ну а тебе что, жалко пары сотен килобайт на хостинге этого форума?
Выложил на обозрение, и выложил. Я хотя бы постарался.
Никому не полезно? Значит, не буду над ним больше работать и удалю. Что хотел я с него поимел.

Seregamil
18.04.2016, 09:50
Ну а тебе что, жалко пары сотен килобайт на хостинге этого форума?
Выложил на обозрение, и выложил. Я хотя бы постарался.
Никому не полезно? Значит, не буду над ним больше работать и удалю. Что хотел я с него поимел.

Учись воспринимать чужую критику и мнение, а не забиваться в угол от этого.
"НИНРАВИЦА НЕ БУДУ БОЛЬШЕ ДЕЛАТЬ1!!!!!!"

Edwin
19.04.2016, 08:43
А что я такого сказал, что ты меня сразу выставляешь тут плаксивым ребёнком? Как мне по-твоему нужно воспринимать критику, если ты прямо сказал, что считаешь мою работу бредом?
Глянув на отзывы, можно сказать только одно об этом инклуде - ненужное фуфло. Я услышал тебя, Серёгамил, не пытайся теперь позиционировать себя таким добрым гномиком, мол, "учись правильно воспринимать критику, сын мой", ты сказал то, что хотел сказать.

vovandolg
19.04.2016, 09:41
Прежде чем опуститься вот так надо было сперва протестить исходные коды и понять будет ли с них толк(хоть малейший),
а потом уже делать тему, ты сделал наоборот:dntknw:
(я не тестил, но кто то протестил кажется и дал плохой отзыв, а в общем написали что такое уже кто то делал)
1. Подобный код существовал
2. Видимо код не чего на эту планету не принёс с собой
3. 1+2 = получи такую критику

Хочешь что то хорошее услышать?
- Пиши сразу что то хорошее и действительно работающее,
а не копипасту или временно бесполезный шлак.

Edwin
19.04.2016, 11:29
Прежде чем опуститься вот так надо было сперва протестить исходные коды и понять будет ли с них толк(хоть малейший),
а потом уже делать тему, ты сделал наоборот:dntknw:
(я не тестил, но кто то протестил кажется и дал плохой отзыв, а в общем написали что такое уже кто то делал)
1. Подобный код существовал
2. Видимо код не чего на эту планету не принёс с собой
3. 1+2 = получи такую критику

Хочешь что то хорошее услышать?
- Пиши сразу что то хорошее и действительно работающее,
а не копипасту или временно бесполезный шлак.

Чё-то я не видел, что бы ты что-нибудь новое написал. Тебе повторить в третий раз? Держи: сделаю позже тест скорости. Повторить в четвёртый? Я сделаю позже. Ещё кому-нибудь не понятно? Я ещё повторю, обращайтесь.
Это действительно работающее, и писал его я лично, без твоих предположений, что "может быть кто-то когда-то проверил, и вроде бы, кажется, оставил плохой отзыв", и если бы ты мне сказал в лицо, что я где-то это скопипастил, я бы тебе сломал за такое нос. Так что не е*и мне мозги, заслуженный критик, я тебе могу ещё раз повторить и то, что я писал его для себя, а выкинул в паблик что бы не выкидывать в мусорку.
Ещё кому-нибудь что-то объяснить?

DeimoS
19.04.2016, 12:02
Просто советую завести аккаунт на github и лить все свои работы туда. Тогда никто особо критично не будет относится к твоим реализациям, ибо там уже будет твоё личное пространство и ты там творишь то, что пожелаешь нужным. А публиковать на общедоступных форумах работы, которые позиционируются как "сделал для себя и не волнует" - не самая удачная затея.
Тут же тебе просто стоило изначально опубликовать тесты вместе с темой, дабы люди понимали, что это просто одна из реализаций диалогового процессора и она работает так-то.
А ставить крест на работе - полный бред. Может она будет быстрее, нежели уже существующие реализации? Проведи уже тесты, наконец. Как раз, возможно, и придумаешь как её улучшить во время этих самых тестов.

vovandolg
19.04.2016, 12:24
выкинул в паблик что бы не выкидывать в мусорку.
Форум на свалку похож?)

Edwin
19.04.2016, 12:36
И правда, лучше б туда выложил..

Edwin
05.05.2016, 22:07
Обновление до версии 3.0

Проведён новый тест скорости. Старый был составлен неправильно и удалён.
Полностью новый функционал ShowPlayerDialog, улучшение и оптимизация.
Обновление OnDialogResponse.
Код сокращён и оптимизирован.

Desulaid
06.05.2016, 00:12
Максимальная длинна имени функции - 31 символ + 1 на \0 = 32.

VVWVV
06.05.2016, 00:37
1. Зачем использовать ненужные константы, где они не требуются. Как минимум, данный код должен спасать от множественного подключения одного и того же иклюда. К тому же, у вас не будет работать данная проверка, ибо нет определённой константы.

#if defined _Pawn && defined eDialog
#endinput
#endif
2. Как было уже сказано выше, но имена функций не могут быть больше чем 31 символ.
3. Необходимо спрятать данное определение за проверку на подключение инклюда.

#define INCLUDE_VERSION 3.0

Больше, вроде бы, замечаний по коду нет.

Edwin
15.07.2016, 08:13
Насчёт третьего пункта объясните, пожалуйста

DeimoS
15.07.2016, 10:54
Насчёт третьего пункта объясните, пожалуйста

Вот это

#define INCLUDE_VERSION 3.0
После вот этого поставь

#if defined _Pawn && defined eDialog
#endinput
#endif
Если подключить инклюд второй раз, макрос INCLUDE_VERSION попадёт в мод и компилятор начнёт матюкаться