22:27
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: Dima-kun  
Битовое хранение данных (флагов)
toneysixДата: Суббота, 23.04.2011, 12:06 | Сообщение # 1
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
Введение:
Не смотря на то, что на дворе 2011 год, хочу предоставить новый способ, который по-моему мнению здесь ещё никто не представлял, способ хранения в битах. Начнем с того, что такое флаг, флаг по-другому говоря булевое значение, 1 или 0, true или false, на живом примере мы можем это представить в виде того, что игрок купил какую-нибудь вещь, и затем, чтобы проверить есть ли она у него, мы проверяем переменную, если 1, значит есть, иначе 0 - нет, то есть всего для хранения двух значений ноль и один. Многие не используют даже тип bool, создают направленно переменные с целыми числами, где одна ячейка равна 4 байтам, где, если быть точным можно было хранить целых 32 флага, что значительно не экономично, а если создавать огромный мод, то таких переменных, которые хранят только флаги будет множества, а я всегда люблю, когда по-меньше мусора и нудных переменных, которые хранят-лишь флаги. Этот способ имеет только один минус, дело в том, что мы не можем обозначить каждый бит переменной определенным именем, поэтому я взял маску состоящую всего из 8 битов (1 байт) от 0 до 255, то есть в одной переменной мы сможем хранить 8 флагов, конечно же можно было намного больше (4 байта - 32 бита), но тогда легко запутаться, какой бит отвечает за то или иное действие в режиме. Хочу показать пример, как обычно многие делают переменные, для хранения флагов:
new flag[MAX_PLAYERS];
if(flag[playerid] == 1) SendClientMessage(playerid, 0x0, "Ваш флаг включён");

Здесь, помимо битов, можно сделать также оптимизацию, поставив тип bool либо char например:
new bool: flag[MAX_PLAYERS];
if(flag[playerid] == 1) SendClientMessage(playerid, 0x0, "Ваш флаг включён");

Или:
new flag[MAX_PLAYERS char];
if(flag{playerid} == 1) SendClientMessage(playerid, 0x0, "Ваш флаг включён");

С типом char получается даже экономичнее, чем с bool, потому что тип char это 1 байт, соответственно мы можем хранить значение без минуса от 0 до 255 - 8 бит, так как тип char в павн идет, как unsigned.
Итак, синтаксис функций для управления и извлечения битов.
Например создаем переменную для хранения 8 флагов, так как нам совершенно не нужно иметь целых 32 флага, мы будем использовать тип char, чтобы уменьшить их до нужного количество 8 бит, хотя ничего страшного не будет, если вы не будете использовать тип char, просто экономичнее использовать именно его в данном кейсе.

Синтаксис:
фУНКЦИЯ: SetBitState(const bitid, &var, bool: status) (Изменяет бит в переменной):
Аргументы:
1. bitid - айди (номер) бита начиная с нуля, максимально - 7 (всего 8).
2. &var - имя переменной, которой нужно изменить бит.
3. bool: status - новое значение бита (true (1) или false (0)).
Функция ничего не возвращает.

фУНКЦИЯ: bool: GetBitState(const bitid, const var) (Получает значение бита переменной):
Аргументы:
1. bitid - айди (номер) бита начиная с нуля, максимально - 7 (всего 8).
2. var - имя переменной, с которой нужно получить значение бита.
Возвращает true (1) - если бит равен одному, иначе false (0), если бит равен нулю.

Примеры:
Создадим массив для хранения 8 флагов всех игроков сервера, представим, что там находятся флаги вещей, которые имеет игрок.
new items[MAX_PLAYERS char];
Допустим, игрок покупает какую-либо вещь, запишем её под нулевой бит, что она у него есть.
SetBitState(0, items[playerid], true);
А теперь проверим, если у него эта вещь:
if(GetBitState(0, items[playerid])) SendClientMessage(playerid, 0x0, "Вы имеете эту вещь!");

Скорость выполнения:
При 50000 итераций функции SetBitState - 19MS
функции GetBitState - 16MS

Скачать:
http://best.of.by/paste/d1beae2e2

Заключение:
Конечно же этот способ в наши дни неактуален в силу того, что машины стали мощными, память уже давно не проблема, тем не менее я использую этот способ в некоторых местах, чтобы принципиально улучшить ситуацию, нежели создавать целых 8 переменных, которые в целом отвечают за один и тот же тип действия. Также этот способ может подойти для какого-нибудь кодирования данных, но в связи с тем, что в данном способе используется всего 8 бит, кодирование будет слишком простым и подобрать данные для него не составит никакого труда.
P.S: Если кому-то интересно, могу выложить аналог этих функций в макросе, по-быстрее будет.


Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru

Сообщение отредактировал toneysix - Суббота, 23.04.2011, 12:14
ChizaДата: Суббота, 23.04.2011, 12:20 | Сообщение # 2
Постоялец
Группа: Продвинутые
Сообщений: 320
Награды: 35
Город: Салават
Репутация: 287
Замечания: 40%
Статус:
Хорошая статья! + ;)


TELEMONEY - ЗА КАЖДОГО ПРИВЛЕЧЕННОГО 300 РУБЛЕЙ НА БАЗИС-СЧЕТ
SLICKДата: Суббота, 23.04.2011, 12:30 | Сообщение # 3
Местный
Группа: I'm V.I.P.
Сообщений: 603
Награды: 9
Город: Unknown
Репутация: 388
Замечания: 0%
Статус:
Хороший способ и статья, буду пользоваться. +


My works:
[GM] RTDM
Advertising system
Fuel System
Artefacts Search (Динамическая сис-ма артефактов)
Dima-kunДата: Суббота, 23.04.2011, 21:50 | Сообщение # 4
Группа: Разработчики
Сообщений: 6269
Награды: 72
Репутация: 3512
Замечания: 0%
Статус:
toneysix, Статья полезная. Хоть да, щас особо нет проблем с памятью, но все же это не означает, что надо разбрасывать ее направо и налево:)


Мои работы:
[INC] Сборник d_includes [LAST],[FS] New Demage Effect,[FS]Авто-Поворотники,
[FS]mp3player,[FS] Fun Chat Game,[FS] Car Buy Syst,[FS] Anti-AirBrk,[INC] d_setpos,
[GM] Game Move v0.1,[FS+include]Super-Armour [0.3z],[FS + Include] Multi Checkpoints
AirKiteДата: Воскресенье, 01.05.2011, 22:51 | Сообщение # 5
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1671
Награды: 21
Город: Новосибирск
Репутация: 2070
Замечания: 0%
Статус:
Увидел в одном из исходнике [MAX_PLAYERS char], не знал что это такое, решил загуглить, попал сюда. :D
Спасибо за информацию ;)



[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)


Jabber: airkite@qip.ru
[Addon] QuickBinder
[FS] Online Players Record
toneysixДата: Воскресенье, 01.05.2011, 23:16 | Сообщение # 6
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
AirKite спасибо, что апнул тему, а то я забыл выставить дату хранения на пастбине.
Перезалил - http://best.of.by/paste/f37259363



Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
Fus1Дата: Понедельник, 02.05.2011, 05:13 | Сообщение # 7
Группа: Продвинутые
Сообщений: 2704
Награды: 121
Город: Melbourne Australia
Репутация: 3103
Замечания: 0%
Статус:
toneysix, спасибо, первый раз такое вижу.
HawkinsДата: Понедельник, 02.05.2011, 11:56 | Сообщение # 8
Освоившийся
Группа: Продвинутые
Сообщений: 82
Награды: 1
Город: Волжский
Репутация: 169
Замечания: 40%
Статус:
Интересно интересно. Спасибо за тему. Будет нужно


+100500
AirKiteДата: Понедельник, 02.05.2011, 23:53 | Сообщение # 9
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1671
Награды: 21
Город: Новосибирск
Репутация: 2070
Замечания: 0%
Статус:
Кстати, текстовые строки (буквы и символы), разве выходят за пределы 0-255? А то тогда актуально вместо new string[128]; использовать new string[128 char]; ?


[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)


Jabber: airkite@qip.ru
[Addon] QuickBinder
[FS] Online Players Record
toneysixДата: Вторник, 03.05.2011, 00:50 | Сообщение # 10
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
AirKite насколько я помню для юникода требуется 2 байта, поэтому char не выход.


Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
AirKiteДата: Вторник, 03.05.2011, 02:18 | Сообщение # 11
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1671
Награды: 21
Город: Новосибирск
Репутация: 2070
Замечания: 0%
Статус:
toneysix, Ну уж хотя бы для GetPlayerName в самый раз :D


[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)


Jabber: airkite@qip.ru
[Addon] QuickBinder
[FS] Online Players Record
toneysixДата: Вторник, 03.05.2011, 04:39 | Сообщение # 12
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
Ну почему же, можно его использовать, только умножая на два, все равно так или иначе тоже получится экономичнее, ведь всего к примеру для текста "текст" требуется 6x2=12 байтов, так например new string[6*2 char] = "текст"; будет корректным. С INT у нас получается одна ячейка 4 байта, поэтому объявляя таким образом: new string[6] = "текст"; получается 6x4=24, 24-12=12 байтов лишних.


Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
ImperealДата: Среда, 04.05.2011, 17:32 | Сообщение # 13
Мастер джэдай
Группа: I'm V.I.P.
Сообщений: 2677
Награды: 51
Город: Санкт-Петербург
Репутация: 1868
Замечания: 100%
Статус:
Quote (toneysix)
new string[6*2 char] = "текст";

Как это?
Разве так в pawn можно,или я что то не дочитал? OO



Прощай самп-рус =Р
ZiGGiДата: Среда, 04.05.2011, 18:17 | Сообщение # 14
Мастер джэдай
Группа: Продвинутые
Сообщений: 2652
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
Quote (toneysix)
к примеру для текста "текст" требуется 6x2=12 байтов, так например new string[6*2 char] = "текст";

ну 1 байт лишний какбэ :D
итак, исправлю:
для текста "текст" требуется 5*2 = 10 байт (5 - кол-во символов, 2 - сколько байт на один символ(в юникоде нужно 2))
пример: new string[5*2+1 char] = "текст"; // 5*2 - будет создано 5 ячеек размерностью в 2 байта, +1 - ещё одна ячейка в 1 байт на завершающий символ (\n)(такая особенность унаследована у си++ :) )



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]
toneysixДата: Среда, 04.05.2011, 18:35 | Сообщение # 15
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
ZZiGGi завершающий символ вообще-то \0 (нулевой символ), это первое, второе, у меня 6 символов с учетом этого нулевого байта, даже не смотря на то, что для него требуется 1 байт, в чем исправление вопрос?


Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru

Сообщение отредактировал toneysix - Среда, 04.05.2011, 18:47
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua