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

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±

    Пару вопросов (опытные сюда пожалуйста :3)

    Всем привет. Я новичок в павн..

    Мне интересно, как лучше использовать стринг? Вот 3 варианта которые я слышал/видел. И что же лучше.

    За любой АДЕКВАТНЫЙ ответ жму - спасибо!

    1 Вопрос:
    1.1. Сейчас я использую так:
    PHP код:
    new mysqlstr                    [512];
    new 
    string                       [255]; 
    Везде где есть mysql, я юзаю mysqlstr (сохранение и прочее).
    Везде где диалоги/форматы/команды я юзаю string.

    1.2. В каждом паблике, например будет OnDialogResponse. Вначале паблика создать стринг например: new dialog_string[255]; и юзать это только в паблике OnDialogResponse.
    Так же и с мускулом.

    1.3. Возьмём например OnDialogReponse. Вначале нечего не создаём, но создаём например в 1-ом диалоге new (dialog_)string[55]; с подсчётом символов и юзать (Как РакНет например).


    // На данный вопрос мне ответил BossArturKA
    Cледующий вопрос читайте под его постом!!!
    Последний раз редактировалось StevenH; 14.11.2015 в 13:21.

  2. #2
    Аватар для BossArturKA
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.01.2014
    Сообщений
    15
    Репутация:
    7 ±
    (если я правильно понял суть вопросов)

    В каждом "кусочке" мода лучше создавать уникальное количество ячеек, а не использовать глобальное.

    На пример команда:
    PHP код:
    CMD:myname(playeridparams[]){
        new 
    uni_str[22], 
        
    GetPlayerName(playeriduni_strsizeof(uni_str));
        
    format(uni_strsizeof(uni_str), "%s."uni_str), SendClientMessageToAll(-1uni_str);
        return 
    true;

    на примере диалог:
    PHP код:
    public OnDialogResponse(playeriddialogidresponselistiteminputtext[]){
        switch(
    dialogid){
        case 
    0:{
                new 
    uni_str[28];
                
    format(uni_str,sizeof(uni_str),"Вы использовали диалог № %d."dialogid), SendClientMessage(playerid, -1uni_str);
            }
        case 
    1:{
                new 
    uni_str[22];
                
    format(uni_str,sizeof(uni_str),"Ты заюзал диалог № %d."dialogid), SendClientMessage(playerid, -1uni_str);
            }
        }
        return 
    false;

    Ну и запросы MySQL...
    Допустим, у нас происходит обновление стоимости дома...
    Представим, что у нас на сервере максимальный ID дома 111 а цена 55555.
    Возможный запрос: UPDATE house SET price = 55555 WHERE id = 111 LIMIT 1
    Соответственно тут использовать глобальные 512 ячеек тоже не разумно.
    Имеем:
    PHP код:
    new uni_str[54];
    format(uni_strsizeof(uni_str), "UPDATE house SET price = %i WHERE id = %i LIMIT 1"hInfo[id][price], id), mysql_function_query(dbuni_strfalse""""); 

  3. Пользователь сказал cпасибо:
    StevenH (14.11.2015)
  4. #3
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от BossArturKA Посмотреть сообщение
    Цитата BossArturKA
    В этом и заключался мой вопрос :). А теперь у меня возникло 3 вопроса.

    1. А сильно ли это влияет на мод/оптимизацию и прочее?

    И да, как правильно посчитать кол-во ячеек. Где то читал, например что в слове: Привет
    не 6 ячеек а 7 (типа в конце пробела нету, но он даёт +1 ячейку).
    И есть ли быстрый способ как то посчитать кол-во ячеек?

    2. Что обозначает вот это в pawn.cfg:
    -d0
    -O1 или -O2

    Влияет ли это как-то на оптимизацию или ещё что?

    3. С помощью ключа -v2 я провёл тест:
    PHP код:
    Header size:           3624 bytes
    Code size
    :            77688 bytes
    Data size
    :           793096 bytes
    Stack
    /heap size:      16384 bytesestimated maxusage=324 cells (1296 bytes)
    Total requirements:  890792 bytes 
    Это хорошо или как? Мод пишу с нуля на MySQL R39-3, в моде ~1100 строк. Есть система авторизации/регистрации, домов и прочего.
    P.S. сейчас когда делал этот тест у меня стринги глобальные!!! Сейчас буду переводить на уникальные стринги.

    Провёл тест с помощью ключа: -v2 и -d0
    PHP код:
    Header size:           3624 bytes
    Code size
    :            70608 bytes
    Data size
    :           793096 bytes
    Stack
    /heap size:      16384 bytesestimated maxusage=324 cells (1296 bytes)
    Total requirements:  883712 bytes 
    Цифры другие стали. Если не сложно, объясните что к чему относится.
    P.S. сейчас когда делал этот тест у меня стринги глобальные!!! Сейчас буду переводить на уникальные стринги.
    Последний раз редактировалось StevenH; 14.11.2015 в 13:08.

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

    Статус
    Оффлайн
    Регистрация
    02.01.2014
    Сообщений
    15
    Репутация:
    7 ±
    1. Конечно лучше использовать локальные ячейки а не глобальные (память не будешь терять).
    1.1 Считается по принципу:
    Имеется текст "StevenH", который состоит из семи символов.
    Значит нужно создать число ячеек: 7+1 = 8.

    1 ячейка: "S".
    2 ячейка: "t".
    3 ячейка: "e".
    4 ячейка: "v".
    5 ячейка: "e".
    6 ячейка: "n".
    7 ячейка: "H".
    8 ячейка: "NULL".

    NULL в качестве "конца строки".

    При формировании текста, %s/%d/%f... не учитываются (Подразумевают дальнейшую прибавку нужного тебе числа от вывода).

    Допустим, нужно вывести Привет Nick_Name.
    Максимальная длина ника в клиенте SA:MP, 20 символов.
    В таком случаи код будет таков:
    PHP код:
    new uni_str[29];
    GetPlayerName(playeriduni_strsizeof(uni_str));
    format(uni_strsizeof(uni_str), "Привет %s."uni_str), SendClientMessageToAll(-1uni_str); 
    Почему-же 29 ячеек?
    8 ячеек на "Привет ." (Слово, пробел и точка). 20 ячеек на ник игрока. И + 1 на NULL.

    Переносы и "визуальная табуляция текста" в диалогах, считается как 1 символ.
    Пример:
    PHP код:
    Привет\nВася 
    или
    PHP код:
    Привет\tВася 
    То есть на это нам нужно 12 ячеек (Текст: ПриветВася + 1 перенос строки/табулирование и + 1 NULL)/

    Для подсчета длинных строк, можно воспользоваться онлайном сервисом по запросу "Online strlen" (Хотя способов много).
    Есть даже определенный софт,специально для PAWN, который автоматически приравнивает %s,%d,... к нулю а \n, \t... к единицы.

    2. Это различного рода "Ключи" для компилирования мода.
    Почитать можно тут: КЛИК Хотя информация не самая полная. Лучше на официальном портале прочесть об этом.

    3. Ключ "-v2" выводит "максимальную детализацию" по компилированию. Сложно что либо сказать от сюда...
    Удали данный ключ (Или, поставь на 1, как по умолчанию).
    Тогда будешь получать предупреждения, на которые стоит реагировать (Типа переполнения стока).

    А по твоим результатм, можно сказать только вот что:
    Размер стека 12208 байт - у тебя используется 1296. Это хорошо.

  6. Пользователь сказал cпасибо:
    StevenH (14.11.2015)
  7. #5
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от BossArturKA Посмотреть сообщение
    Ответ от BossArturKA
    Спасибо за все разъяснения а так же хороший ответ! Теперь я всё понял. Нажал спасибку полюбому).

    UPD: Разве максимальное имя игрока 20 символов? Я читал где-то что 24.
    -------------------------------------

    1. Как стоит сохранять данные игрока. Только при дисконнекте или например сделал действие - сохранил.
    2. Цвет тоже учитывается как ячейки? Например {FF00FF} - прибавлять 8 ячеек?
    Последний раз редактировалось StevenH; 14.11.2015 в 14:47.

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

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Спасибо.
    Последний раз редактировалось StevenH; 14.11.2015 в 16:52.

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

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Я перевёл глобальные стринги на уникальные, однако стек повысился. Это нормально?
    PHP код:
    Stack/heap size:      16384 bytesestimated maxusage=537 cells (2148 bytes
    А был: 1296..

    Что делать?

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от StevenH Посмотреть сообщение
    Я перевёл глобальные стринги на уникальные, однако стек повысился. Это нормально?
    PHP код:
    Stack/heap size:      16384 bytesestimated maxusage=537 cells (2148 bytes
    А был: 1296..

    Что делать?
    Было 1296, а стало 537? Так это ж наоборот хорошо.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Было 1296, а стало 537? Так это ж наоборот хорошо.
    Короче, было:
    PHP код:
    Stack/heap size:      16384 bytesestimated maxusage=324 cells (1296 bytes
    Стало:
    PHP код:
    Stack/heap size:      16384 bytesestimated maxusage=537 cells (2148 bytes
    Получается глобальные стринги лучше, которые создаются вначале или что?
    Последний раз редактировалось StevenH; 14.11.2015 в 20:12.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от StevenH Посмотреть сообщение
    Короче, было:
    PHP код:
    Stack/heap size:      16384 bytesestimated maxusage=324 cells (1296 bytes
    Стало:
    PHP код:
    Stack/heap size:      16384 bytesestimated maxusage=537 cells (2148 bytes
    Если вы думаете, что это плохо, то посмотрите на строку "Data size" до и после. Если убрать те глобальные массивы, размер секции данных уменьшится - этим и должно окупиться повысившееся потребление места в стеке.

    Но я бы не назвал это такой уж значительной оптимизацией. При создании локального массива тратится время на выделение места в стеке и заполнение всех ячеек массива нулями (ими в Pawn инициализируются все локальные переменные и массивы). Правда, это время очень мало и его можно не брать в счёт.
    И всё же глобальные переменные нужны, когда есть необходимость использовать хранимые в них значения в нескольких функциях. Иначе переменную логично будет сделать локальной.
    Поэтому отказ от глобальных массивов для format в пользу локальных нельзя назвать оптимизацией, скорее просто логичным шагом.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

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

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

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

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

Ваши права

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