Русское сообщество по скриптингу

[Оптимизация] Переменные

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

[Оптимизация] Переменные

Сообщение nato » 14 авг 2019, 20:18

Автор: Slice
Перевод и редактирование: nato

В оригинальном исходнике Zombie Plague как и во множестве других модов можно встретить множество булевых переменных, которые запоминают то или иное событие в игре и каждая из них по 132 байта:
Код: Выделить всё
// Player vars
new g_zombie[33] // is zombie
new g_nemesis[33] // is nemesis
new g_survivor[33] // is surivor
new g_firstzombie[33] // is the first zombie
new g_lastzombie[33] // is last zombie
new g_lasthuman[33] // is last human
new g_frozen[33] // is frozen (can't move)
new g_nodamage[33] // has spawn protection/zombie madness
new g_respawn_as_zombie[33] // should respawn as zombie
new g_nvision[33] // has night vision
new g_nvisionenabled[33] // has night vision turned on
new g_zombieclass[33] // zombie class
new g_zombieclassnext[33] // zombie class for next infection
new g_flashlight[33] // has custom flashlight turned on                      


Это нерациональное использование памяти. Вместо переменных будем использовать флаги + вдобавок от меня (чего нету в оригинальном уроке) будем использовать упакованные строки.

Примечание: если у Вас более 8 флагов, то используйте распакованные строки.

Итак, приступим.

Для использования флагов, нужно их сначала объявить:

Код: Выделить всё
enum Flags:(<<= 1)
{
    //Не забывайте устанавливать значение первой переменной флага на 1
    LOGGED = 1,
    SPAWNED
};

new Flags:playerFlags[MAX_PLAYERS char];


Не используйте более 32 флагов в одном энуменаторе!

Вот и всё, теперь к махинациям:

[1] Узнать значение флага:

Код: Выделить всё
playerFlags{playerid} & LOGGED; //Вернёт значение флага LOGGED                    


[2] Установить всем флагам значение:

Код: Выделить всё
playerFlags{playerid}  = Flags:0; //Обнулит все флаги игроку                  


[3] Установить значение флага на 1:

Код: Выделить всё
playerFlags{playerid}  |= LOGGED; //Установит значение флага LOGGED на 1                  


[4] Установить значение флага на 0:

Код: Выделить всё
playerFlags{playerid}  &= ~LOGGED; //Установит значение флага LOGGED на 0                  


[5] Сменить значение флага на противоположное:

Код: Выделить всё
playerFlags{playerid}  ^= LOGGED; //Если LOGGED был равен 1, то станет 0 (и наоборот)          


Как видим и без подсчета памяти экономия существенная.
Последний раз редактировалось nato 18 авг 2019, 15:14, всего редактировалось 5 раз(а).
Аватара пользователя
nato
 
Сообщения: 346
Зарегистрирован: 06 июл 2011, 17:45
Благодарил (а): 30 раз.
Поблагодарили: 91 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: [Оптимизация] Переменные

Сообщение Mistrick » 15 авг 2019, 00:51

Это нерациональное использование памяти.

Зато понятнее. Какой смысл экономить на спичках? Откуда такой дефицит ОЗУ.
каждая из них по 33 КБ

1 ячейка занимает 4 байта. 33 ячейки будут занимать 132 байт, что не близко к 32 768 байт.
будем использовать упакованные строки поскольку переменная будет хранить число не более 255 (id игрока)

Используем упакованные строки и не говорим, что теперь можем использовать только 8 бит. Ниже только про 32 бита у обычного массива.
Как видим и без подсчета памяти экономия существенная.

132 байт против 33 байта если упакованный, с потенциалом в 8 бит на ячейку.
А булевый массив нельзя упаковать? Итоговый выигрыш в 8 раз по памяти.
Около 200 байт в мире гигабайтов озу, точно существенная экономия?
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: [Оптимизация] Переменные

Сообщение fl0wer » 15 авг 2019, 01:13

А в чом оптимизация?
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: [Оптимизация] Переменные

Сообщение nato » 15 авг 2019, 11:03

Mistrick писал(а):1 ячейка занимает 4 байта. 33 ячейки будут занимать 132 байт, что не близко к 32 768 байт.

Согласен. Исправил.

Mistrick писал(а):132 байт против 33 байта если упакованный, с потенциалом в 8 бит на ячейку. Итоговый выигрыш в 8 раз по памяти.

Это экономия только на одной переменной.

Mistrick писал(а):Около 200 байт в мире гигабайтов озу, точно существенная экономия?

Я сторонник того чтобы все максимально оптимизировать несмотря на то что сейчас гигабайты ОЗУ.

Mistrick писал(а):Зато понятнее. Какой смысл экономить на спичках? Откуда такой дефицит ОЗУ.

Можете не экономить вас никто не заставляет. Хорошо же когда всего 1 переменная вместо 30.
Аватара пользователя
nato
 
Сообщения: 346
Зарегистрирован: 06 июл 2011, 17:45
Благодарил (а): 30 раз.
Поблагодарили: 91 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: [Оптимизация] Переменные

Сообщение fl0wer » 16 авг 2019, 23:30

nato писал(а):1 переменная вместо 30.

Как ты туда 30 засунешь, если у тебя лимит в 255?
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: [Оптимизация] Переменные

Сообщение nato » 18 авг 2019, 14:53

fl0wer писал(а):
nato писал(а):1 переменная вместо 30.

Как ты туда 30 засунешь, если у тебя лимит в 255?


Забыл про это. Написал примечание когда нужно использовать упакованные и когда распакованные строки.
Аватара пользователя
nato
 
Сообщения: 346
Зарегистрирован: 06 июл 2011, 17:45
Благодарил (а): 30 раз.
Поблагодарили: 91 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6


Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4