08.12.2007

Taboo Smart Reborn

Здесь я напишу о том что такое Taboo Smart Reborn (TSR).

TSR на данный момент это фреймворк для 2d игр. Зачем писать свой движок когда уже есть масса готовых для 2d casual и инди игр, действительно работающих и используемых? Во-первых выбор использовать тот ли иной подход ложится только на команду, обсуждается внутри команды и реализуется только для команды. Во-вторых надоело писать 10 строчек кода вместо одной. Как вы уже наверное поняли TSR я пишу прежде всего для своей группы разработчиков, работаем мы на платформе PC под все версии WIndows, для наших casual этого пока достаточно.

Наша группа разработчиков называется tab00 games или как-то так. Вот собрались мы и решили писать игру. В качестве фреймворка решили взять старый код(написанный мной ещё за годы школьные). Дальше я его немного собрал, отрефакторил кое-что, и почему-то засунул это всё в namespace smart. Понятно что фреймворк был далеко не smart. Далее по мере надобности добавлялись какая-то дополнительная функциональность. gui отсутствовал, поэтому этим тоже занимался я. Проект успешно довели до конца. После, в свободное время летних каникул(как обычно на каникулах куда меньше свободного времени) я писал с нуля новый фреймворк. Все классы собраны в пространство имён taboo. Фреймворк не хочется называть именем команды, поэтому taboo(наша команда) smart(старый двиг) reborn(переписывается с нуля).

На данный момент на нём уже можно собирать игры.

Вывод графики полностью hw accelerated и реализован при помощи Direct3D 8. Графическая часть включает в себя вывод различных настраиваемых квадов(quads) и несколько полезных вспомогательных примитивов. Возможность просто и безболезненно добавлять свои графические примитивы. Всё это сортируется по z координате, по текстурам, по шейдерам внутри каждого слоя(layer). Каждый такой слой можно поворачивать, масштабировать и перемещать. Атласы(создание библиотек картинок или кадров из одной или нескольких текстур), анимация, мультитекстурирование. Картинки можно загружать любого размера, но максимальный размер определяется размером максимальной текстуры на текущем device. Картинки держат много форматов, в том числе и jng(JPEG Network Graphics), который имеет разные варианты хранения картинки png24+png8, jpeg+png8 и т.д. Очень хорош потому что не нужно теперь отделять маску от картинки(например mypanel.jpg и mypanel_mask.jpg).

Реализация безопасного тайминга выбирается при запуске приложения в таком порядке учитывая совместимость: TSC(инструкция rdtsc процессора), QPC(QueryPerformanceCounter), TGT(timeGetTime).

Генерация случайных чисел разделена на 2 объекта. Через первый генерируются значения для игровой логики, через второй всё остальное(частицы, эффекты и т.д.) Внутри реализовано через SFMT(SIMD Fast Mersenne Twister).

Система ресурсов обеспечивает загрузку всех ресурсов, загрузку по цепочке, выгрузку unref ресурсов. Поиск ресурсов и автоматическая генерация маленьких строковых id для них. Возможно описать xml-based ресурс прямо внутри описания группы ресурсов. И всякое такое облегчающее жизнь.

Вся XML рутина использует очень шуструю библиотеку pugixml.

Шрифты могут грузится из картинки и файла разметки, могут прямо из ttf шрифта который лежит где-нибудь в папке с игрой. Генерация ttf через freetype2.

Пиккинг(Picking) по альфа маске изображения. Верлет интеграция(физика связанных частиц). Интерполяция позиции, цвета, float параметров. Таблица строк для локализации и не только.

Работа с файлами, поддержка zip. Если вы упакуете все ресурсы в zip, вам нужно будет либо написать одну строку кода или в группе ресурсов ядра указать имя zip архива, или сделать поиск и добавление всех *.zip. всё очень просто. Также возможно добавлять свои форматы архивов и их файловые потоки.

Файлы опций, лога, base classes для работы с профилями игроков.

И собственно GUI. Загрузка, правка, сохранение. Свойства и стили. Просто добавлять свои контролы в фактор.

07.12.2007

LCG

О псевдослучайных числах, о простейшем и старейшем методе их генерации. Поэтому сегодня разбирался с LCG - Linear Congruential Generator. Перевод на русский с толчка википедии звучит так: линейный конгруэнтный метод. Если вы используете rand() - это значит вы используете LCG. Что там есть.. там есть по одной операции умножения, сложения, деления и остатка. При большом кол-ве вызовов(например в цикле) производительность будет резать call. И никак мы этот rand() не сделаем inline, crt шняга. Для этого можно написать свою реализацию.
Ещё одна особенность в crt реализации: видели чему равна RAND_MAX? Даже если не видели - 0x7fff, равное 32767. Значит диапазон чисел от 0 до 32767. Знаете почему так? Число у них бегает 32битное. Они режут часть младших бит, т.к. их поведение далеко от случайного. А вот в старших битах типо всё отл. Получаем генерацию типо нормальных псевдослучайных чисел в диапазоне 0..32767. При этом период равен 2 в степени 32.
Сейчас использование LCG не очень оправдано, потому что всегда на смену всему старому приходит что-то новое. Почитайте об Mersenne Twister, если вы ещё не знаете что такое.