Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 16
  1. #1
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±

    nPawn - обновление Pawn до самой новой версии

    В SA-MP из коробки используется Pawn версии 3.2.*, которая является очень устаревшей: в ней не только нет нового функционала, но и нет необходимых исправлений, некоторые из которых могут крашнуть сервер (valstr или работа с запакованными строками, к примеру). Данный плагин обновляет Pawn до последней версии из официального репозитория CompuPhase (последнее изменение 21 час назад на момент создания темы). Совместим со всеми версиями SA-MP (с CR-MP тоже).

    Известные баги:
    - Возможно использовать только мод, скрипты (filterscripts) использовать нельзя. Это сделано для поддержки всех версий SA-MP, а также для сохранения производительности
    - Возможна некорректная работа с некоторыми плагинами

    Небольшой обзор некоторых новых возможностей:
     Структуры - замена enum

    new msg[.text{30}, .priority];
    msg.priority = 10;
    strpack(msg.text, "update: {30} means [30 char]");
    print(msg.text);

     Новые перечисления

    Пример из file.inc:
    const filemode:
    {
    io_read = 0, /* file must exist */
    io_write, /* creates a new file */
    io_readwrite, /* opens an existing file, or creates a new file */
    io_append, /* appends to file (write-only) */
    }

     Работа с INI из коробки, а также новые функции для файлов

    INI:
    native readcfg(const filename[]=``'', const section[]=``'', const key[], value[], size=sizeof value, const defvalue[]=``'', bool:pack=true);
    native readcfgvalue(const filename[]=``'', const section[]=``'', const key[], defvalue=0);
    native bool: writecfg(const filename[]=``'', const section[]=``'', const key[], const value[]);
    native bool: writecfgvalue(const filename[]=``'', const section[]=``'', const key[], value);
    native bool: deletecfg(const filename[]=``'', const section[]=``'', const key[]=``'');

    Новые функции file.inc:
    native bool: fcopy(const source[], const target[]);
    native bool: frename(const oldname[], const newname[]);
    native bool: fcreatedir(const name[]);
    native bool: fstat(name[], &size = 0, ×tamp = 0, &mode = 0, &inode = 0);
    native bool: fattrib(const name[], timestamp=0, attrib=0x0f);
    native filecrc(const name[]);


    И многое другое, некоторые изменения есть здесь: http://www.compuphase.com/pawn/pawnhistory.htm, также рекомендую посмотреть стандартные примеры https://github.com/g3o0or/npawn-samp.../pawn/examples и поковыряться в обновленных инклудах.

    Изменения в API, не связанные напрямую с обновлением Pawn:
    1. Все строки в аргументах кэллбеков запакованы
    2. Запакованные строки можно использовать со всеми функциями SA-MP
    3. Для функций вроде GetPlayerName (т. е. для тех, которые записывают строку в аргумент) добавлен последний аргумент bool:ispacked. По умолчанию он равен true.
    4. В SA-MP использовалась функция format, взятая из AMXMODX. Она заменена функцией strformat, вся разница в том, что она работает с запакованными строками и добавлен третий аргумент ispacked.
    5. Добавлен инклуд a_vec.inc (по умолчанию включен в a_samp.inc), который включает в себя некоторые (будут добавляться) функции, использующие одну переменную Vector3, а не три float, у них добавлен суффикс Vec. Vector3 является структурой с полями Float:x, Float:y и Float:z. Пример:
    PHP код:
    new pos[Vector3];
    GetPlayerPosVec(playeridpos);
    pos.+= 20.0;
    SetPlayerPosVec(playeridpos); 
    Примеры использования новых фич:


    Автор: g3o0or

    Исходный код: https://github.com/g3o0or/npawn-samp
    Бинарники: https://github.com/g3o0or/npawn-samp/releases
    Инклуды, которые необходимо заменить: https://github.com/g3o0or/npawn-samp...ources/include
    Последний раз редактировалось Desulaid; 13.08.2016 в 21:34.

  2. 2 пользователя(ей) сказали cпасибо:
    Battista (25.09.2016) g3or (16.08.2016)
  3. #2
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    С векторами прикольно, но это все:
      Открыть/закрыть


    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  4. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    С векторами прикольно, но это все:
      Открыть/закрыть


    Да не костыли совсем, с этим плагином даже производительность не теряется, так что можно спокойно использовать.

    Кстати, копирование библиотек лучше заменить на использование git submodule, будет удобнее обновлять.
    Последний раз редактировалось ziggi; 14.08.2016 в 02:43.

  5. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Да не костыли совсем, с этим плагином даже производительность не теряется, так что можно спокойно использовать.
    Производительность заметно теряется в функциях SA-MP, работающих только с неупакованными строками, не говоря уже о дополнительных требованиях к объёму секции стека/кучи для временного размещения распакованных строк.
    К тому же, там ещё есть, что улучшить. Под вендой можно использовать альтернативную ассемблерную реализацию amx_Exec (с последними версиями MASM она не очень дружит, но можно взять версию для NASM), а под пингвином - ещё одно альтернативное ядро, использующее фичи GNU C++. В обеих альтернативных реализациях можно добиться ~2x прироста производительности за счёт использования таблицы переходов вместо switch.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. #5
    Аватар для g3or
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.08.2016
    Сообщений
    4
    Репутация:
    3 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Производительность заметно теряется в функциях SA-MP, работающих только с неупакованными строками, не говоря уже о дополнительных требованиях к объёму секции стека/кучи для временного размещения распакованных строк..
    Речь идет о восьми функциях, которые очень редко используются (чаще всего - один раз в OnPlayerConnect), но большинство из этих функций, как правило, не используются вовсе. И, если бы Kalcor использовал amx_SetString, этого можно бы было избежать.

    upd: производительность этих функций улучшена, при использовании распакованных строк разницы нет



    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    К тому же, там ещё есть, что улучшить. Под вендой можно использовать альтернативную ассемблерную реализацию amx_Exec (с последними версиями MASM она не очень дружит, но можно взять версию для NASM), а под пингвином - ещё одно альтернативное ядро, использующее фичи GNU C++. В обеих альтернативных реализациях можно добиться ~2x прироста производительности за счёт использования таблицы переходов вместо switch.
    Да, вчера я хотел для линуксовой версии использовать оптимизации для GCC и Intel Compiler, но оказался занят другим.

    Цитата Сообщение от $continue$ Посмотреть сообщение
    С векторами прикольно, но это все:
      Открыть/закрыть


    В чем костыльность заключается? В том, что ты совсем ничего опять не осилил?
    Последний раз редактировалось g3or; 14.08.2016 в 22:42.

  7. 2 пользователя(ей) сказали cпасибо:
    Seregamil (14.08.2016) Роуди. (14.08.2016)
  8. #6
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    О, неадекватные люди подлетели =)
    В том, что обновление языка с помощью плагина. Чем не костыль?
    Цитата Сообщение от g3or Посмотреть сообщение
    Речь идет о восьми функциях, которые очень редко используются (чаще всего - один раз в OnPlayerConnect), но большинство из этих функций, как правило, не используются вовсе. И, если бы Kalcor использовал amx_SetString, этого можно бы было избежать.




    Да, вчера я хотел для линуксовой версии использовать оптимизации для GCC и Intel Compiler, но оказался занят другим.


    В чем костыльность заключается? В том, что ты совсем ничего опять не осилил?
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  9. #7
    Аватар для g3or
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.08.2016
    Сообщений
    4
    Репутация:
    3 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    О, неадекватные люди подлетели =)
    В том, что обновление языка с помощью плагина. Чем не костыль?
    Если для тебя любой плагин - костыль, то ок. Даже добавлять ничего не буду. Нормальных аргументов ожидаемо нет.

  10. Пользователь сказал cпасибо:
    VeFriger (15.08.2016)
  11. #8
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от g3or Посмотреть сообщение
    производительность этих функций улучшена, при использовании распакованных строк разницы нет
    Делать вызов функции amx_Swap32 ради каждой ячейки - тоже далеко не самый оптимальный вариант.
    Попробуй вот это:
    PHP код:
    inline static void AlignCell(cell &value)
    {
        (
    void)value;
    #if BYTE_ORDER==LITTLE_ENDIAN
        
    const size_t cellsize sizeof(cell);
        
    unsigned char *bytes = (unsigned char *)(size_t)(&value);
        
    unsigned char t;
    #if PAWN_CELL_SIZE >= 16
        
    bytes[0], bytes[0] = bytes[cellsize 1], bytes[cellsize 1] = t;
    #if PAWN_CELL_SIZE >= 32
        
    bytes[1], bytes[1] = bytes[cellsize 2], bytes[cellsize 2] = t;
    #if PAWN_CELL_SIZE == 64
        
    bytes[2], bytes[2] = bytes[cellsize 3], bytes[cellsize 3] = t;
        
    bytes[3], bytes[3] = bytes[cellsize 4], bytes[cellsize 4] = t;
    #endif // PAWN_CELL_SIZE == 64
    #endif // PAWN_CELL_SIZE == 32
    #endif // PAWN_CELL_SIZE == 16
    #endif // BYTE_ORDER==LITTLE_ENDIAN

    Я сделал эту функцию специально для работы с массивами из байтов в одном из своих проектов.
    На первый взгляд оверкилл, но компилятор делает из неё всего 6-8 инструкций lea/mov (которые ещё и хорошо распараллеливаются) прямо на месте использования.


    Касаемо лицензии в исходниках (GPLv3), она на инклуды тоже распространяется? Если да, то не слишком ли это? Возможно, стоило бы лицензировать их под условиями, не обязывающими раскрывать исходники мода (например, MPL, MIT или Zlib License)?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  12. #9
    Аватар для g3or
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.08.2016
    Сообщений
    4
    Репутация:
    3 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Касаемо лицензии в исходниках (GPLv3), она на инклуды тоже распространяется? Если да, то не слишком ли это? Возможно, стоило бы лицензировать их под условиями, не обязывающими раскрывать исходники мода (например, MPL, MIT или Zlib License)?
    Нет, лицензия распространяется лишь на исходный код плагина (т. е. содержимое /src).

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Попробуй вот это
    Спасибо, попробую.

  13. #10
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Если уж на то пошло, то тогда почему бы не использовать язык PHP? - http://pro-pawn.ru/showthread.php?3032-PHP-for-SA-MP
    Думаю, что не для кого не секрет, что в PHP гораздо больше возможностей и встроенных функций, что делает его гораздо удобнее того же Pawn, хоть и самой новой версии. Жалко конечно, что разработчик бросил проект. Думаю, обновление до PHP 7 добавила бы ему производительности.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •