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

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Имеет ли смысл такой код?
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(client, args)
{
    if(IsCPlayerAlive(client)) PrintToChat(client, "Вы живы");
    else PrintToChat(client, "Вы мертвы");
}

По сути, таким образом можно половину функций можно заменить, получив офигенный прирост к свободным ресурсам процессора, но в замен храня данные в памяти.
Если еще Вова (@R1KO) мне расскажет как он в один инт запихивает по 4 була, то будет еще веселее xD
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
[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 раза. А плагину по идее без разницы обращатся к см или к другому плагину
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
@Danyas, см и так хранит всё это в памяти. Он хранит список живых игроков, список команд игроков и т.д. Тоесть по сути получится хранение тех же данных 2 раза. А плагину по идее без разницы обращатся к см или к другому плагину
Да ну, всегда думал что тот же
PHP:
IsPlayerAlive(client)
можно прировнять к этому
PHP:
if(GetEntProp(client, Prop_Send, "m_lifeState")
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
Да ну, всегда думал что тот же
PHP:
IsPlayerAlive(client)
можно прировнять к этому
PHP:
if(GetEntProp(client, Prop_Send, "m_lifeState")
по сути да
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 это свойство игрока. И его значение уже хранится в памяти. А так ты еще раз будешь его хранить
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
как он в один инт запихивает по 4 була
C-подобный:
#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:
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6
@AlmazON, зачем так сложно если есть побитовое сравнение

if(iVal & BOOL3)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Да и зачем даже это если есть побитовое сравнение
Что оптимальней: сравнить & или %? Сразу можно прикинуть, что точно легче процессору сделать простой минус/плюс нужного була, чем отнимать/добавлять биты. К тому же, так
Превратиться в число с кучей нулей. Экономия памяти the best. Оффтоп
Я так и не понял, ты это про своё или моё... Оффтоп
Оффтоп
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
Что оптимальней: сравнить & или %? Сразу можно прикинуть, что точно легче процессору сделать простой минус/плюс нужного була, чем отнимать/добавлять биты. К тому же, такПревратиться в число с кучей нулей. Экономия памяти the best. ОффтопЯ так и не понял, ты это про своё или моё... Оффтоп
Конечнно &.
Процессору пофиг сколько там нулей, у него просто задание по такому-то адресу поставить значение 1. Он не понимает это число 8 или 9763. Так же и с побитовым сравнением, ему проще по очереди сравнять нужные биты числа, чем сравнивать число с набором возможных значений
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Процессору пофиг сколько там нулей
Ты сам уже не так понял) Нули - я про то, что в один int можно так загнать не 32 була максимум, а тысячи, сотни тысяч, если продолжать. Оффтоп Экономия памяти - гигантская. Но и нагрузка на процессор вырастит неимоверно. Оффтоп
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10
Ты сам уже не так понял) Нули - я про то, что в один int можно так загнать не 32 була максимум, а тысячи, сотни тысяч, если продолжать. Оффтоп Экономия памяти - гигантская. Но и нагрузка на процессор вырастит неимоверно. Оффтоп
Просто не понимаю смысла твоего кода если он приводит к тому же результату только обходными путями.
 

AlmazON

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #14
@AlmazON, да не будет у тебя так работать. Проверь. Там всего 32 независимых друг от друга бита. Если ты попытаешься сделать иначе биты будут зависимыми друг от друга, тоесть изменение числа влечет за собой последствия.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
да не будет у тебя так работать
Работать то будет, только вот геометрическая прогрессия - штука быстрая и до числа 2 147 483 647 быстро всё влезет. :lol:
Оффтоп
Кстати, способ то, так сказать, твой или в книжке какой нашёл?
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #16
Кстати, способ то, так сказать, твой или в книжке какой нашёл?
сначала увидел в плагине, но не разобрался. Потом примерно понял но не применял на практике. Потом увидел в книге по c++ и потом еще на сайте по php. То есть достаточно распространенный способ.
 
Сверху Снизу