Введение

Битборд — это специализированная структура данных в виде битового массива, широко используемая в компьютерных системах, играющих в настольные игры, где каждый бит соответствует полю или фигуре на игровом поле. Это позволяет выполнять параллельные побитовые операции для установки или запроса состояния игры, а также для определения возможных ходов. Биты в одном битборде связаны между собой правилами игры и часто, при совместном рассмотрении, формируют игровую позицию. Другие битборды обычно используются в качестве масок для преобразования или анализа позиций. Битборды применимы к любой игре, прогресс которой определяется состоянием или наличием фигур на дискретных полях игрового поля, посредством сопоставления состояний полей битам в структуре данных. Битборд является более эффективной альтернативой традиционному представлению в виде "почтового ящика", где каждая фигура или поле на доске является элементом массива. Битборды особенно эффективны, когда связанные биты различных состояний на доске помещаются в одно машинное слово или двойное слово, позволяя использовать одиночные побитовые операторы, такие как AND и OR, для построения или запроса игровых состояний. Среди компьютерных игр, использующих битборды, — шахматы, шашки, отелло и словесные игры. Эта схема впервые была применена в программах для шашек в 1950-х годах, а с середины 1970-х годов стала де-факто стандартом для представления игрового поля в компьютерных программах-автоматах.

Описание

Битборд, специализированное битовое поле, – это формат, который упаковывает несколько связанных булевых переменных в одно машинное слово, обычно представляя позицию в настольной игре или состояние игры. Каждый бит представляет собой поле; если бит установлен, свойство этого поля истинно. Битборды позволяют компьютеру отвечать на некоторые вопросы о состоянии игры с помощью одной битовой операции. Например, если шахматная программа хочет узнать, есть ли у белых пешки в центре доски (в центральных четырех полях), она может просто сравнить битборд пешек белых с битбордом центра доски, используя побитовое И (AND). Если в центре нет пешек, результат будет равен нулю. Несколько битбордов могут представлять различные свойства полей на доске, а специальные или временные битборды (например, временные переменные) могут представлять локальные свойства или хранить промежуточные агрегированные результаты. Эффективность битбордов усиливается двумя другими особенностями реализации. Во-первых, битборды быстро обновляются, например, при перемещении фигуры можно быстро изменить биты в исходном и целевом положениях в битборде, отражающем расположение фигур. Во-вторых, битовые карты, представляющие статические свойства, такие как все поля, атакуемые каждым типом фигуры в каждой позиции на шахматной доске, могут быть предварительно вычислены и сохранены в таблице, чтобы на вопрос, например, «какие допустимые ходы коня на поле e4?», можно было ответить одним обращением к памяти. Реализации битбордов используют преимущества наличия побитовых логических операций над полными словами (32 или 64 бита), таких как И, ИЛИ, НЕ и другие, на современных архитектурах процессоров для обеспечения эффективности. Битборды могут быть неэффективны на более ранних 8- и 16-битных миникомпьютерах и микропроцессорных архитектурах.

Вопросы внедрения

В результате необходимого сжатия и кодирования содержимого больших таблиц, а также из-за вероятности ошибок при транскрипции или кодировании, программы, использующие битборды, сложны и трудоемки в написании и отладке для разработчиков программного обеспечения. Для построения этих таблиц обычно требуются вспомогательные генеративные методы, не входящие в состав приложения.

Плюсы

Битбордные представления используют параллельные битовые операции, доступные на большинстве современных процессоров, которые выполняются за один цикл и полностью конвейеризуются и кэшируются. Почти все процессоры поддерживают операции AND, OR, NOR и XOR. Более того, современные процессоры оснащены конвейерами инструкций, которые ставят инструкции в очередь для выполнения. Процессор с несколькими вычислительными устройствами может выполнять более одной инструкции за цикл, если в конвейере доступно несколько инструкций. Обычные последовательности инструкций с ветвлениями могут приводить к очистке конвейера в случае неверного предсказания ветвления. Многие операции с битбордами требуют меньше условных переходов и, следовательно, повышают эффективность конвейера и позволяют эффективно использовать несколько вычислительных устройств на многих процессорах. Процессоры имеют разрядность, для которой они оптимизированы, и могут выполнять битовые операции за один цикл в пределах этой разрядности. Таким образом, на 64-битном или более процессоре 64-битные операции могут выполняться одной инструкцией. Может поддерживаться работа с инструкциями различной разрядности. Многие 32-битные процессоры могут иметь некоторые 64-битные инструкции, но их выполнение может занимать больше одного цикла или быть менее эффективным по сравнению с 32-битными инструкциями. Если битборд превышает разрядность набора команд, для выполнения операции над ним потребуется несколько инструкций. Следовательно, программа, использующая 64-битные битборды, будет выполняться быстрее на 64-битном процессоре, чем на 32-битном.

Минусы

Битборды требуют значительно большего объема кода, как исходного, так и объектного. Длинные последовательности битовых операций технически сложны в написании и отладке. Сами битборды обычно разрежены, часто содержа лишь один установленный бит на 64, что делает реализации битбордов ресурсоемкими по памяти. Оба этих фактора могут приводить к увеличению числа промахов кэша или его "переполнению". Если процессор не поддерживает аппаратные инструкции для поиска первого установленного бита (или подсчета ведущих нулей) и подсчета установленных битов (или подсчета нулей), реализация будет существенно замедлена, поскольку реализация этих операций в виде циклов на ассемблере крайне неэффективна.

Плюсы

Битовые доски требуют больше памяти, чем структуры данных доски, основанные на списках фигур, но обеспечивают более высокую скорость выполнения, поскольку многие операции циклов и сравнений сводятся к одной (или небольшому числу) побитовых операций. Например, в представлении "mailbox", чтобы определить, атакует ли фигура определенное поле, необходимо сгенерировать и перебрать все возможные легальные ходы этой фигуры, а затем сравнить конечные поля с целевым полем. При использовании битовых досок легальные ходы фигуры хранятся в виде битовой карты, которая побитово И (AND) с битовой картой целевого поля. Ненулевой результат означает, что фигура атакует это поле.

Минусы

Для некоторых игр разработка движка на основе битбордов требует значительного объема исходного кода, включая таблицы данных, которые могут оказаться больше, чем компактная реализация с использованием метода "почтовых ящиков" или перечислений. Это может стать проблемой для мобильных устройств (например, сотовых телефонов) с ограниченным количеством регистров или кэшем инструкций процессора. На полноразмерных компьютерах это может приводить к промахам кэша между кэшем первого и второго уровня. Однако это лишь потенциальная проблема, а не существенный недостаток, поскольку большинство машин обладают достаточным объемом кэша инструкций, чтобы избежать этой ситуации.

Постепенное обновление

Некоторые виды битбордов выводятся из других посредством сложного процесса перекрестной корреляции, как, например, карты атаки в шахматах. Пересчет всех этих карт при каждом изменении состояния игры (например, ходе) может быть непозволительно затратным, поэтому производные битовые карты обновляются инкрементально, что требует сложного и точного кода. Это значительно быстрее, поскольку изменяться должны только битовые карты, связанные с измененными полями, а не все битовые карты на доске. Без инкрементального обновления битовое представление может оказаться не более эффективным, чем более старое представление в виде "почтовых ящиков", где обновление по своей природе локально и инкрементально.

Предварительно вычисленные бит-карты и таблицы

Некоторые виды растровых изображений, не зависящие от расстановки фигур на доске, могут быть вычислены заранее и извлечены из таблицы, а не формироваться после каждого хода или изменения состояния доски, например, поля, атакованные конем или королем, находящимися на каждой из 64 клеток шахматной доски, что иначе потребовало бы перебора.

Шахматные доски

Очевидным и простейшим представлением конфигурации фигур на шахматной доске является список (массив) фигур в удобном для поиска порядке (например, от фигуры наименьшей ценности к фигуре наибольшей ценности), сопоставляющий каждую фигуру с её местоположением на доске. Аналогично, для определения полей, атакуемых каждой фигурой, требуется последовательное перечисление этих полей для данной фигуры. Эта схема называется адресацией "почтовых ящиков". Отдельные списки ведутся для белых и черных фигур, а часто и для белых и черных пешек. Карты обновляются после каждого хода, что требует линейного поиска (или двух, если фигура была взята) по списку фигур. Преимущество адресации "почтовых ящиков" – простота кода; недостаток – линейный поиск выполняется медленно. Более быстрые, но более сложные структуры данных, сопоставляющие фигуры с их позициями, называются битбордами.

Стандарт

В битовых представлениях каждый бит 64-битного слова (или двойного слова на 32-битных архитектурах) связан с полем шахматной доски. Можно использовать любое соответствие между битами и полями, но по общепринятому соглашению биты соответствуют полям слева направо и снизу вверх, так что бит 0 представляет поле a1, бит 7 – поле h1, бит 56 – поле a8 и бит 63 – поле h8. Многие различные конфигурации доски обычно представляются собственными битбордами, включая расположение королей, всех белых пешек, всех черных пешек, а также битбордами для каждого из других типов фигур или комбинаций фигур, например, все белые фигуры. Также универсальны два атакующих битборда: один битборд для каждого поля, показывающий все фигуры, атакующие это поле, и обратный битборд, показывающий все поля, атакуемые фигурой, находящейся на данном поле. Битборды могут также быть константами, например, представляющий первый ранг, который будет иметь единичные биты в позициях 0–7. Другие локальные или временные битборды, такие как "все поля, соседние с королем и атакованные фигурами противника", могут создаваться по мере необходимости или удобства.

Примеры кодов

Автор движка Frenzee опубликовал несколько примеров исходного кода. Программа Connect 4 на Java, состоящая из 155 строк, демонстрирующая использование битбордов.

Отелло

Полное обсуждение движков для игры Отелло (Реверси) с примерами исходного кода, включая реализацию битборда Отелло на C и ассемблере. Edax (вычислительные системы). См. статью об Edax. Движок для игры Отелло (Реверси) с исходным кодом, основанным на битборде.

Слово игры

Обзор применения битовых досок в словесных играх.