"Кеширование" в SourcePawn или последствия хронического недосыпа

Тема в разделе "Программирование / Скриптинг", создана пользователем Danyas, 4 апр 2016.

  1. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.711
    Симпатии:
    451
    Имеет ли смысл такой код?
    PHP:
    new    g_ClientAlive[MAXPLAYERS+1];
    public 
    OnPluginStart()
    {
        
    RegConsoleCmd("sm_isalive",        Command_Check);
     
        
    HookEvent("player_death",        Event_OnPlayerDeath);
        
    HookEvent("player_spawn",        Event_OnPlayerSpawn); 
    }

    public 
    Event_OnPlayerDeath(Handle:event, const String:name[], bool:silent)
        
    g_ClientAlive[GetClientOfUserId(GetEventInt(event"userid"))] = false;

    public 
    Event_OnPlayerSpawn(Handle:event, const String:name[], bool:silent)
        
    g_ClientAlive[GetClientOfUserId(GetEventInt(event"userid"))] = true;

    public 
    OnClientDisconnect(client)    g_ClientAlive[client] = false;

    IsCPlayerAlive(client)
    {
        if (
    g_ClientAlive[client]) return true;
        else return 
    false;
    }

    public 
    Action:Command_Check(clientargs)
    {
        if(
    IsCPlayerAlive(client)) PrintToChat(client"Вы живы");
        else 
    PrintToChat(client"Вы мертвы");
    }
    По сути, таким образом можно половину функций можно заменить, получив офигенный прирост к свободным ресурсам процессора, но в замен храня данные в памяти.
    Если еще Вова (@R1KO) мне расскажет как он в один инт запихивает по 4 була, то будет еще веселее xD
     
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.976
    [QUOTE="Danyas, post: 244994, member: 38940]Если еще Вова (@R1KO) мне расскажет как он в один инт запихивает по 4 була, то будет еще веселее xD[/QUOTE]
    32

    #define F1 1
    #define F2 2
    #define F3 4
    #define F4 8

    if(iVal & F4) // проверка
    iVal |= F3; // добавление

    iVal &= ~F2 // удаление
    --- Добавлено позже ---
    @Danyas, см и так хранит всё это в памяти. Он хранит список живых игроков, список команд игроков и т.д. Тоесть по сути получится хранение тех же данных 2 раза. А плагину по идее без разницы обращатся к см или к другому плагину
     
  3. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.711
    Симпатии:
    451
    Да ну, всегда думал что тот же
    PHP:
    IsPlayerAlive(client)
    можно прировнять к этому
    PHP:
    if(GetEntProp(clientProp_Send"m_lifeState")
     
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.976
    по сути да
    PHP:
    static cell_t smn_IsPlayerAlive(IPluginContext *pContext, const cell_t *params)
    {
        
    CPlayer *player g_Players.GetPlayerByIndex(params[1]);
        if (
    player == NULL)
        {
            return 
    pContext->ThrowNativeError("Invalid client index %d"params[1]);
        }
        else if (!
    player->IsInGame())
        {
            return 
    pContext->ThrowNativeError("Client %d is not in game"params[1]);
        }

        
    unsigned int state player->GetLifeState();

        if (
    state == PLAYER_LIFE_UNKNOWN)
        {
            return 
    pContext->ThrowNativeError("\"IsPlayerAlive\" not supported by this mod");
        }
        else if (
    state == PLAYER_LIFE_ALIVE)
        {
            return 
    1;
        }
        else
        {
            return 
    0;
        }
    }
    int CPlayer::GetLifeState()
    {
        if (
    lifestate_offset == -1)
        {
            if (!
    g_pGameConf->GetOffset("m_lifeState", &lifestate_offset))
            {
                
    lifestate_offset = -2;
            }
        }

        if (
    lifestate_offset 0)
        {
            
    IPlayerInfo *info GetPlayerInfo();
            if (
    info == NULL)
            {
                return 
    PLAYER_LIFE_UNKNOWN;
            }
            return 
    info->IsDead() ? PLAYER_LIFE_DEAD PLAYER_LIFE_ALIVE;
        }

        if (
    m_pEdict == NULL)
        {
            return 
    PLAYER_LIFE_UNKNOWN;
        }

        
    CBaseEntity *pEntity;
        
    IServerUnknown *pUnknown m_pEdict->GetUnknown();
        if (
    pUnknown == NULL || (pEntity pUnknown->GetBaseEntity()) == NULL)
        {
            return 
    PLAYER_LIFE_UNKNOWN;
        }

        if (*((
    uint8_t *)pEntity lifestate_offset) == LIFE_ALIVE)
        {
            return 
    PLAYER_LIFE_ALIVE;
        }
        else
        {
            return 
    PLAYER_LIFE_DEAD;
        }
    }
    Тоесть m_lifeState это свойство игрока. И его значение уже хранится в памяти. А так ты еще раз будешь его хранить
     
    Danyas нравится это.
  5. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Код:
    #define BOOL1	1
    #define BOOL2	2
    #define BOOL3	4
    #define BOOL4	8
    ...
    
    switch (iVal)
    {
    	case 1, 3, 5, 7, 9, 11, 13, 15: //1-ая булевая == true
    	default: // == false
    }
    
    switch (iVal)
    {
    	case 2, 3, 6, 7, 10, 11, 14, 15: //2-ая булевая == true
    	default: // == false
    }
    
    switch (iVal)
    {
    	case 4, 5, 6, 7, 12, 13, 14, 15: //3-я булевая == true
    	default: // == false
    }
    
    switch (iVal)
    {
    	case 8, 9, 10, 11, 12, 13, 14, 15: //4-я булевая == true
    	default: // == false
    }
    
    1/2/4/8/... - только 1/2/3/4/...-ая булевая == true
    15 или ... - все булевые == true
    0 - все булевые == false
    :biggrin:
     
    Danyas нравится это.
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.976
    @AlmazON, зачем так сложно если есть побитовое сравнение

    if(iVal & BOOL3)
     
  7. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Что оптимальней: сравнить & или %? Сразу можно прикинуть, что точно легче процессору сделать простой минус/плюс нужного була, чем отнимать/добавлять биты. К тому же, так
    Превратиться в число с кучей нулей. Экономия памяти the best. Оффтоп
    Я так и не понял, ты это про своё или моё... Оффтоп
    Оффтоп
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.976
    Конечнно &.
    Процессору пофиг сколько там нулей, у него просто задание по такому-то адресу поставить значение 1. Он не понимает это число 8 или 9763. Так же и с побитовым сравнением, ему проще по очереди сравнять нужные биты числа, чем сравнивать число с набором возможных значений
     
  9. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Ты сам уже не так понял) Нули - я про то, что в один int можно так загнать не 32 була максимум, а тысячи, сотни тысяч, если продолжать. Оффтоп Экономия памяти - гигантская. Но и нагрузка на процессор вырастит неимоверно. Оффтоп
     
  10. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.976
    Просто не понимаю смысла твоего кода если он приводит к тому же результату только обходными путями.
     
  11. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Смысл в том, что он не требует специальных знаний (конкретно сам принцип, основа) и @Danyas мог бы без вопросов сам всё пересохранять)
    Нет. int = 4 Байта. 1 Байт = 8 бит. Итого: 4 * 8 = 32 бита. Т.е. больше 32 bool не сохранит, предел, так? У моего же способа предел ограничен лишь максимальным значением числа для int (2 147 483 647).
     
  12. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.976
    @AlmazON, не вижу разницы. У тебя будет такой же результат. в конце своего кода ты придешь к перечислению кучи чисел с комментарием
     
  13. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    В конце?
    //10000-ая булевая == true :acute: Оффтоп
     
  14. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.976
    @AlmazON, да не будет у тебя так работать. Проверь. Там всего 32 независимых друг от друга бита. Если ты попытаешься сделать иначе биты будут зависимыми друг от друга, тоесть изменение числа влечет за собой последствия.
     
  15. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.960
    Работать то будет, только вот геометрическая прогрессия - штука быстрая и до числа 2 147 483 647 быстро всё влезет. :lol:
    Оффтоп
    Кстати, способ то, так сказать, твой или в книжке какой нашёл?
     
    Последнее редактирование: 4 апр 2016
  16. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.970
    Симпатии:
    2.976
    сначала увидел в плагине, но не разобрался. Потом примерно понял но не применял на практике. Потом увидел в книге по c++ и потом еще на сайте по php. То есть достаточно распространенный способ.