Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 7 из 7
  1. #1
    Аватар для TheOrsini
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2015
    Сообщений
    36
    Репутация:
    3 ±

    Хранение чатовых сообщений в PVar'ах

    Решил сделать систему хранения последних пяти сообщений игрока в чате для администраторов (чтобы администратор мог смотреть их). Если записывать эти сообщения в PVar'ы, то сервер не начнёт тормозить от хранения такого большого количества текстовых данных?

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Нет, но смысл? Данные эти:
    Во-первых, будут часто перезаписываться, а обращение к pVar несколько медленнее, нежели к массивами (в OnPlayerText, при большом онлайне и частых сообщениях в чат, эта разница, в совокупности с другим кодом, может быть ощутимой)
    Во-вторых, данные будут записываться и использоваться на протяжении всего нахождения игрока на сервере, а pVar больше хороши для временного хранения какой-то информации (записал - использовал - удалил и долгое время не используешь), ибо это, по-сути, некий аналог динамической памяти, только в ограниченном варианте, который глупо использовать для информации, которая может спокойно хранится в массиве
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    29.09.2015
    Сообщений
    36
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Нет, но смысл? Данные эти:
    Во-первых, будут часто перезаписываться, а обращение к pVar несколько медленнее, нежели к массивами
    Во-вторых, данные будут записываться и использоваться на протяжении всего нахождения игрока на сервере, а pVar больше хороши для временного хранения какой-то информации (записал - использовал - удалил и долгое время не используешь), ибо это, по-сути, некий аналог динамической памяти, только в ограниченном варианте, который глупо использовать для информации, которая может спокойно хранится в массиве
    Ну как-то жалко тратить столько памяти 128*5*1000 (5 - количество последних сообщений)

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

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±
    Мои глаза от твоего кода лезут на гавно-инфо и создают тему о расстановке пикапов.

  6. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от TheOrsini Посмотреть сообщение
    Ну как-то жалко тратить столько памяти 128(145)*5*1000 (5 - количество последних сообщений)
    Эмм, а так эта память тратиться не будет? Да и в наш век глупо переживать о 725000 байтах (725 кб), когда сервера запускаются не на калькуляторах и хостинги выделяют десятки (сотни) гигабайт оперативной памяти.

    В одной своей теме я уже рассказывал о том, в каких ситуациях лучше использовать pVar, но, как показывает практика, лучше написать отдельный урок на эту тему. Ну это потом, а пока просто скопирую то своё объяснение:
      Почему именно массив, а не pVar
    Причина одна - данные будут хранится и использоваться на протяжении всего времени, что игрок находится на сервере.
    Те же, кто использует pVar в подобных случаях, не очень понимает их предназначения. А логичнее всего их использовать для хранения временной информации, и вот почему:
    1) Многие считают, что при удалении pVar, память на сервере освобождается. Отнюдь, это не так. Скажу даже больше, если Вы не используете pVar, на сервере всё равно выделяется память под них. Ведь принцип работы pVar схож с принципами работы оперативной памяти. То есть, при запуске сервера резервируется определённое количество памяти. Теперь, когда вы создаёте pVar, часть этой памяти отдаётся под хранение записанных туда данных. Вот Вы попользовались этими данными и удалили pVar. Память, что требовалась для хранения Ваших данных, не стала вдруг свободной для всего. Она освободилась исключительно для нового pVar. Вы не сможете отдать участок памяти, где хранилась информация о pVar, под массив или что-то ещё. Нет. Она предназначена исключительно для pVar. Поэтому надеяться на какую-то оптимизацию в этом случае не стоит.

    2) Исходя из первого пункта следует, что глупо в pVar хранить информацию, которая будет востребована на протяжении всего нахождения игрока на сервере. Вот для временной информации pVar прекрасно подойдёт! Допустим, Вам нужно сохранить число, которое игрок ввёл как параметр для команды и вы сохранили его в pVar. Этот pVar занял свою ячейку в памяти (пусть это будет ячейка под номером 1). Далее Вы сохранили в pVar деньги игрока, дабы игрок смог через пол часа посмотреть то, насколько он смог разбогатеть (это уже будет pVar, который поместится в ячейку 2). Теперь Вы совершили все манипуляции с числом, что записывали в первый pVar и удалили его с помощью специальной функции DeletePVar. Пол часа ещё не прошло и второй pVar не задействован, поэтому удалять его мы не будем. Теперь нам понадобилось сохранить текущий уровень здоровья игрока. Мы создаём новый pVar и, по-идее, он должен занять ячейку под номером 3, ведь это совершенно новый pVar, который мы ещё не использовали ранее. Но нет, он займёт ячейку под номером 1, ведь до этого Вы удалили из неё pVar с числом.
    "Так всё равно же выделяется память, как и в случае с массивами!" - скажете Вы. Но вот Вам простой пример
    Пример

    PHP код:
    /* Ситуация: 
    Нам нужно временно хранить данные для дальнейшего использования. Всего пусть будет 2 разных случая.*/ 
    //Вариант решения №1 
    new array_1[MAX_PLAYERS]; 
    new 
    array_2[MAX_PLAYERS]; 
    //... 
    array_2[playerid] = 1
    if(
    array_2[playerid] == 1)... 
    //... 
    array_1[playerid] = 98
    if(
    array_1[playerid] == 65)... 

    //Вариант решения №2 
    new array_1[MAX_PLAYERS]; 
    //... 
    array_1[playerid] = 1
    if(
    array_1[playerid] == 1)... 
    //... 
    array_1[playerid] = 98
    if(
    array_1[playerid] == 65)... 

    //Вариант решения №3 
    SetPVarInt(playerid"Array_1"1); 
    if(
    GetPVarInt(playerid"Array_1") == 1DeletePVar(playerid"Array_1"); 
    //... 
    SetPVarInt(playerid"Array_2"98); 
    if(
    GetPVarInt(playerid"Array_2") == 65DeletePVar(playerid"Array_2"); 
    В первом случае мы создаём 2 массива по 500 ячеек и они хранятся в памяти сервера всегда.
    Во втором случае мы создаём один массив на 500 ячеек и уже с ним работаем всё время. Это уже более похоже на pVar, но есть одно НО. Мы не сможем хранить в массиве одновременно несколько данных.
    В третьем случае мы используем pVar, где каждый pVar имеет своё уникальное имя и использует ту память, что уже и так была зарезервирована сервером. Если бы мы имели возможность сохранять в одном массиве несколько данных одновременно, то это было бы похоже именно на второй вариант.
    В общем, pVar хороши там, где данные не будут использоваться при каждом написании в чат или использовании команды (как это будет в случае с проверкой на авторизацию). Поэтому использовать их надо с умом.
    Постскриптум
    pVar можно представить следующим образом:

    PHP код:
    new player_variables_int[MAX_PLAYERS][30]; 
    new 
    player_variables_string[MAX_PLAYERS][30][500]; 
    new 
    Floatplayer_variables_float[MAX_PLAYERS][30]; 
    И уже имена pVar давать в виде макросов. То есть:

    PHP код:
    #define player_health 0 
    player_variables_float[playerid][player_health] = 100.0
    Только вся разница в том, что в случае с pVar машина сама подсчитает для Вас то число ячеек, которое потребуется для хранения данных и выделить нужное количество данных из зарезервированного участка памяти, а не Вы это будете делать. Ну и зачем выделять столько памяти, когда это уже давно сделали за Вас? :)
    Надеюсь теперь люди осознают всю прелесть pVar и перестанут использовать их где ни попадя.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    29.09.2015
    Сообщений
    36
    Репутация:
    3 ±
    Я знаю, как это реализовать. Суть вопроса заключалась во влиянии работы системы на производительность сервера.

  8. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от TheOrsini Посмотреть сообщение
    Я знаю, как это реализовать. Суть вопроса заключалась во влиянии работы системы на производительность сервера.
    Ну если вопрос ставить так, то влияние будет незначительным, если реализовать всё правильно.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

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

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

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

Ваши права

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