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

    Статус
    Оффлайн
    Регистрация
    09.02.2017
    Сообщений
    18
    Репутация:
    0 ±

    Пвары или переменные?

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

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Быстрее переменные, но пвары можно задать в моде, а получить из фильтрскрипта (т.е. данные можно между скриптами в них хранить). Переменные очевидно лучше использовать в любых часто вызываемых событиях, да и в большинстве случаев в принципе, а пвары же либо в случае синхронизации данных между скриптами, либо где-то, где от их скорости мало что зависит, если при этом тебе их использовать удобнее (какие-нибудь промежуточные данные между ответами на многоэтапные диалоги запоминать, ну или что-нибудь в таком роде).

    А, ну и у пваров есть лимит (насколько помню, в 800), хотя его при их использовании по назначению вряд ли достичь можно.
    Последний раз редактировалось Nexius_Tailer; 18.07.2019 в 15:09.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

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

    Статус
    Оффлайн
    Регистрация
    05.12.2013
    Сообщений
    188
    Репутация:
    116 ±
    Дарю тебе переписанные пвары, скомпиль в плагин и юзай без лимитов и потери скорости

     pvar.cpp
    PHP код:
    #include "pvar.h"

    int CPlayerVar::FindVarID(charvarName)
    {
        
    auto it std::find_if(std::begin(pVars), std::end(pVars), [&](PVAR_DATA &var) { return varName == var.pVarName; });
        if (
    it != pVars.end())
        {
            return 
    std::distance(pVars.begin(), it);
        }
        return -
    1;
    }

    int CPlayerVar::SetIntVar(charvarNameint varValue)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_INT)
                return 
    0;

            
    pVars[id].intValue varValue;
        }
        else
        {
            
    PVAR_DATA var;
            var.
    pVarName varName;
            var.
    pVarType PVAR_TYPE_INT;
            var.
    intValue varValue;
            
    pVars.push_back(var);
        }
        return 
    1;
    }

    int CPlayerVar::SetStringVar(charvarNamecharvarString)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_STRING)
                return 
    0;

            
    pVars[id].stringValue varString;
        }
        else
        {
            
    PVAR_DATA var;
            var.
    pVarName varName;
            var.
    pVarType PVAR_TYPE_STRING;
            var.
    stringValue varString;
            
    pVars.push_back(var);
        }
        return 
    1;
    }

    int CPlayerVar::SetFloatVar(charvarNamefloat varValue)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_FLOAT)
                return 
    0;

            
    pVars[id].floatValue varValue;
        }
        else
        {
            
    PVAR_DATA var;
            var.
    pVarName varName;
            var.
    pVarType PVAR_TYPE_FLOAT;
            var.
    floatValue varValue;
            
    pVars.push_back(var);
        }
        return 
    1;
    }

    int CPlayerVar::GetIntVar(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_INT)
                return 
    0;

            return 
    pVars[id].intValue;
        }
        return 
    0;
    }

    charCPlayerVar::GetStringVar(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_STRING)
                return 
    0;

            return &
    pVars[id].stringValue[0];
        }
        return 
    0;
    }

    float CPlayerVar::GetFloatVar(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_FLOAT)
                return 
    0;

            return 
    pVars[id].floatValue;
        }
        return 
    0;
    }

    int CPlayerVar::DeleteVar(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            
    pVars.erase(std::remove_if(pVars.begin(), pVars.end(), [&](const PVAR_DATAe) { return varName == e.pVarName; }), pVars.end());
            return 
    1;
        }
        return 
    0;
    }

    int    CPlayerVar::GetVarType(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            return 
    pVars[id].pVarType;
        }
        return 
    PVAR_TYPE_NONE;



     pvar.h
    PHP код:
    #ifndef __CPVAR_H__
    #define __CPVAR_H__

    #include <string>
    #include <vector>
    #include <iostream>
    #include <algorithm>

    enum PVAR_TYPE
    {
        
    PVAR_TYPE_NONE,
        
    PVAR_TYPE_INT,
        
    PVAR_TYPE_STRING,
        
    PVAR_TYPE_FLOAT
    };

    typedef struct PVAR_DATA_t
    {
        
    std::string pVarName;
        
    PVAR_TYPE pVarType;
        
    int intValue;
        
    float floatValue;
        
    std::string stringValue;
    PVAR_DATA;

    class 
    CPlayerVar
    {
    public:
        
    std::vector<PVAR_DATApVars;

        
    int            DeleteVar(charvarName);

        
    int            SetIntVar(charvarNameint varValue);
        
    int            SetStringVar(charvarNamecharvarString);
        
    int            SetFloatVar(charvarNamefloat varValue);

        
    int            GetIntVar(charvarName);
        
    char*        GetStringVar(charvarName);
        
    float        GetFloatVar(charvarName);
        
    int            GetVarType(charvarName);
        
    int            FindVarID(charvarName);
    };

    #endif 


    Не помню тесты, но если не ошибаюсь +- что и переменные, не знаю какой тут онлайн на форуме, но если нужно кому-то кроме тебя, переделаю в SIMD
    Последний раз редактировалось Пельмень; 01.08.2019 в 19:02.

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от Пельмень Посмотреть сообщение
    Дарю тебе переписанные пвары, скомпиль в плагин и юзай без лимитов и потери скорости

     pvar.cpp
    PHP код:
    #include "pvar.h"

    int CPlayerVar::FindVarID(charvarName)
    {
        
    auto it std::find_if(std::begin(pVars), std::end(pVars), [&](PVAR_DATA &var) { return varName == var.pVarName; });
        if (
    it != pVars.end())
        {
            return 
    std::distance(pVars.begin(), it);
        }
        return -
    1;
    }

    int CPlayerVar::SetIntVar(charvarNameint varValue)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_INT)
                return 
    0;

            
    pVars[id].intValue varValue;
        }
        else
        {
            
    PVAR_DATA var;
            var.
    pVarName varName;
            var.
    pVarType PVAR_TYPE_INT;
            var.
    intValue varValue;
            
    pVars.push_back(var);
        }
        return 
    1;
    }

    int CPlayerVar::SetStringVar(charvarNamecharvarString)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_STRING)
                return 
    0;

            
    pVars[id].stringValue varString;
        }
        else
        {
            
    PVAR_DATA var;
            var.
    pVarName varName;
            var.
    pVarType PVAR_TYPE_STRING;
            var.
    stringValue varString;
            
    pVars.push_back(var);
        }
        return 
    1;
    }

    int CPlayerVar::SetFloatVar(charvarNamefloat varValue)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_FLOAT)
                return 
    0;

            
    pVars[id].floatValue varValue;
        }
        else
        {
            
    PVAR_DATA var;
            var.
    pVarName varName;
            var.
    pVarType PVAR_TYPE_FLOAT;
            var.
    floatValue varValue;
            
    pVars.push_back(var);
        }
        return 
    1;
    }

    int CPlayerVar::GetIntVar(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_INT)
                return 
    0;

            return 
    pVars[id].intValue;
        }
        return 
    0;
    }

    charCPlayerVar::GetStringVar(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_STRING)
                return 
    0;

            return &
    pVars[id].stringValue[0];
        }
        return 
    0;
    }

    float CPlayerVar::GetFloatVar(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            if (
    pVars[id].pVarType != PVAR_TYPE_FLOAT)
                return 
    0;

            return 
    pVars[id].floatValue;
        }
        return 
    0;
    }

    int CPlayerVar::DeleteVar(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            
    pVars.erase(std::remove_if(pVars.begin(), pVars.end(), [&](const PVAR_DATAe) { return varName == e.pVarName; }), pVars.end());
            return 
    1;
        }
        return 
    0;
    }

    int    CPlayerVar::GetVarType(charvarName)
    {
        const 
    int id FindVarID(varName);
        if (
    id != -1)
        {
            return 
    pVars[id].pVarType;
        }
        return 
    PVAR_TYPE_NONE;



     pvar.h
    PHP код:
    #ifndef __CPVAR_H__
    #define __CPVAR_H__

    #include <string>
    #include <vector>
    #include <iostream>
    #include <algorithm>

    enum PVAR_TYPE
    {
        
    PVAR_TYPE_NONE,
        
    PVAR_TYPE_INT,
        
    PVAR_TYPE_STRING,
        
    PVAR_TYPE_FLOAT
    };

    typedef struct PVAR_DATA_t
    {
        
    std::string pVarName;
        
    PVAR_TYPE pVarType;
        
    int intValue;
        
    float floatValue;
        
    std::string stringValue;
    PVAR_DATA;

    class 
    CPlayerVar
    {
    public:
        
    std::vector<PVAR_DATApVars;

        
    int            DeleteVar(charvarName);

        
    int            SetIntVar(charvarNameint varValue);
        
    int            SetStringVar(charvarNamecharvarString);
        
    int            SetFloatVar(charvarNamefloat varValue);

        
    int            GetIntVar(charvarName);
        
    char*        GetStringVar(charvarName);
        
    float        GetFloatVar(charvarName);
        
    int            GetVarType(charvarName);
        
    int            FindVarID(charvarName);
    };

    #endif 


    Не помню тесты, но если не ошибаюсь +- что и переменные, не знаю какой тут онлайн на форуме, но если нужно кому-то кроме тебя, переделаю в SIMD
    По скорости в любом случае проигрывать должно.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

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

    Статус
    Оффлайн
    Регистрация
    05.12.2013
    Сообщений
    188
    Репутация:
    116 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    По скорости в любом случае проигрывать должно.
    Проверь, заодно напишешь разницу. В любом случае я не понимаю смысла гнаться за скоростью и вашими "тестами" в 10000000 итераций, чтобы помериться "хто быстрее". Ты никогда не будешь использовать в таком количестве операции (никакие) хотя-бы потому-что лимит твой будет максимум в 1к игроков (и то вряд-ли) захотят сделать что-то одновременно.
    Ну а код кенгурушника (Kye) можно и привести в нормальный вид, захочешь еще скорости - можешь в моем коде изменить названия пваров из строк в хэш.

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от Пельмень Посмотреть сообщение
    Проверь, заодно напишешь разницу. В любом случае я не понимаю смысла гнаться за скоростью и вашими "тестами" в 10000000 итераций, чтобы помериться "хто быстрее". Ты никогда не будешь использовать в таком количестве операции (никакие) хотя-бы потому-что лимит твой будет максимум в 1к игроков (и то вряд-ли) захотят сделать что-то одновременно
    Ты это выложил, потому как от автора сего логичнее было бы их видеть от тебя, в любом случае мне пока лень.
    Касаемо скорости - OnPlayerUpdate вызывается при любом типе синхронизации несколько десятков раз в секунду, потому при использовании в таких и подобных местах игрокам ничего не нужно делать одновременно - достаточно просто синхронизироваться с сервером. А вот теперь и умножь эти десятки вызовов в секунду на максимальное количество игроков, и цифры уже будут более значительными. Если сразу возникает логичный аргумент - нафига их юзать в OnPlayerUpdate - значит это и нужно уточнять как с обычными пварами, чтобы люди в таких местах их как раз не юзали из-за проигрывания в производительности хотя бы на некоторые проценты.
    Последний раз редактировалось Nexius_Tailer; 01.08.2019 в 19:15.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  8. #7
    Аватар для Пельмень
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.12.2013
    Сообщений
    188
    Репутация:
    116 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Ты это выложил, потому как от автора сего логичнее было бы их видеть от тебя, в любом случае мне пока лень.
    Касаемо скорости - OnPlayerUpdate вызывается при любом типе синхронизации несколько десятков раз в секунду, потому при использовании в таких и подобных местах игрокам ничего не нужно делать одновременно - достаточно просто синхронизироваться с сервером. А вот теперь и умножь эти десятки вызовов в секунду на максимальное количество игроков, и цифры уже будут более значительными. Если сразу возникает логичный аргумент - нафига их юзать в OnPlayerUpdate - значит это и нужно уточнять как с обычными пварами, чтобы люди в таких местах их как раз не юзали из-за проигрывания в производительности хотя бы на некоторые проценты.
    Мне не нужны замеры скорости, пойми, я на форуме 1 раз в год, чтобы ты понимал, свомп не умеет асинхрон, поэтому все операции идут друг за другом, значит больше чем 1 операцию в такт ты не сможешь

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от Пельмень Посмотреть сообщение
    Мне не нужны замеры скорости, пойми, я на форуме 1 раз в год, чтобы ты понимал, свомп не умеет асинхрон, поэтому все операции идут друг за другом, значит больше чем 1 операцию в такт ты не сможешь
    И как это связано с тем, что что-то одно быстрее, а что-то другое медленнее? Ты утверждаешь, что у них нет потери скорости, и как минимум это очень спорно и требует подтверждения тестами от тебя же.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  10. #9
    Аватар для Пельмень
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.12.2013
    Сообщений
    188
    Репутация:
    116 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    И как это связано с тем, что что-то одно быстрее, а что-то другое медленнее? Ты утверждаешь, что у них нет потери скорости, и как минимум это очень спорно и требует подтверждения тестами от тебя же.
    Я не буду делать тесты, я забил на свомп еще когда ты экзамены в школе сдавал, если тебе нужны замеры - делай, не хочешь - не используй, просто я знаю свой код, и свомповский высер пваров далёк от моего кода, хочешь сделать лучше, сделай, можешь даже мой код выложить как за свой, я не расстроюсь

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от Пельмень Посмотреть сообщение
    Я не буду делать тесты, я забил на свомп еще когда ты экзамены в школе сдавал, если тебе нужны замеры - делай, не хочешь - не используй, просто я знаю свой код, и свомповский высер пваров далёк от моего кода, хочешь сделать лучше, сделай, можешь даже мой код выложить как за свой, я не расстроюсь
    Довольно забавные формулировки, такими обычно и пишут те, кому ещё в школе экзамены сдавать. Насчёт тестов - я уже откажусь от этого чисто из принципов, потому что первым про производительность написал ты, и при этом как автор того, что якобы "не теряет в скорости", ты это ничем подкреплять не решаешься.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

 

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

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

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

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

Ваши права

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