Введение
В самых передовых компьютерных играх используются различные графические подсистемы — так называемые трёхмерные графические движки. Играм и специалистам этой отрасли хорошо известны Source (Half Life 2), Unreal Engine (Unreal Tournament), idTech 4 (Doom 3), CryENGINE2 (Crysis) и Paradox [прим. пер.: оригинал статьи написан в 2008 году].
Настало время узнать имя нового 3D-движка: Microsoft Excel.
Всем известно, что Excel — распространённый офисный инструмент, но немногие знают, что в нём есть набор функций, превращающий Excel в высококлассный трёхмерный графический движок.
В этой статье я продемонстрирую арифметические возможности Excel, встроенные подсистемы рендеринга (их целых две!) и революционный подход, который может привести к сдвигу парадигмы. Надеюсь, статья позволит вам узнать, что Excel эффективно и оптимально сочетает в себе практичность, кучу возможностей, многоплатформенность и высокую производительность с уникальными и футуристичными функциями 3D-движка.
В разделах статьи даже представлены демо-программы и фильмы, созданные при помощи 3D-движка Excel.
Предупреждение: только для уверенных в себе специалистов!
Арифметические возможности
Возможно, стоит начать хотя бы с демонстрации арифметических функций Excel. Базовые функции для манипуляций с 3D-объектами (т.е. четыре арифметических правила, тригонометрические функции, алгебра матриц) являются сутью Excel, но их стоит изучить из-за их несравненной компактности и величественного изящества, благодаря которым Excel доминирует в отрасли современных 3D-движков.
Компактность
Немногие игровые движки способны решать всю 3D-арифметику в рамках половины экрана. В верхней части Рисунка 1 находится пространственный сдвиг, поворот вокруг осей X, Y, Z и перспективная проекция. Как мы увидим в демо-приложениях, вычисления видимости, Z-буферизации и отражений занимают на экране почти столько же места.
Рисунок 1: фундамент 3D-движка
Жёлтым цветом выделены задаваемые пользователем параметры, а зелёным — вычисляемые движком значения. Пронумерованные области содержат следующие данные:
- Параметры перспективной проекции
- 3D-координаты точек объектов (относительно их центра)
- Матрица сдвига и поворота (подробнее об этом почитать можно, например, здесь)
- Параметры поворота
- Абсолютные 3D-координаты точек после сдвига и поворота
- 2D-координаты точек после вычисления перспективной проекции
- Экранные координаты точек
- Конечные точки граней объектов
- Формула элемента в матрице сдвига и поворота. Здесь чётко видны простота и компактность.
Изящество
Среда разработки Excel не только позволяет программистам редактировать простой код или код с подсветкой синтаксиса, но и предоставляет разработчикам движков свои хорошо известные функции форматирования: можно одновременно использовать несколько шрифтов (разного размера и типа), раскрашивать ячейки и тексты, добавлять всплывающие заметки и (не падайте со стула!) при желании вставлять даже целые фильмы.
Рендеринг
Разработчики могут выбрать одну из двух подсистем рендеринга:
- Нативную Excel Cell Graphics (ECG)
- Office-level Graphics Abstraction Layer (OGAL)
Нативная Excel Cell Graphics
Забудьте на минуту, что после запуска Excel мы видим на экране лист, состоящий из ячеек, и что ячейки содержат наши данные, тексты и формулы. Смотрите на этот лист как на экран движка, а на ячейки — как на пиксели экрана. При таком необычном взгляде:
Лист = экран движка
Ячейки = пиксели
Такой взгляд, без сомнения, впечатляет, остаётся только один вопрос — как эти крупные прямоугольные ячейки можно считать пикселями? Однако мы увидим, что эти прямоугольники просто демонстрируют уникальную особенность ячеечной графики, и что при необходимости можно использовать обычные мелкие олдскульные квадратные пиксели.
Отбросим неприязнь и рассмотрим особенности ECG:
Размер пикселей можно менять, поэтому если кто-то захочет вернуться в прошлое и использовать мелкие квадратные пиксели традиционных 3D-движков, то это легко реализовать (см. Рисунки 2 и 3).
Рисунок 2: стандартный пиксель Excel
Рисунок 3: раскрашенные пиксели с изменённым размером
Стоит заметить — эта инновация является настолько органичной частью системы, что в каждом столбце и строке можно использовать пиксели разного размера, как это показано на Рисунке 4.
Рисунок 4: размер пикселей можно задавать для каждой строки
Наилучшим примером чрезвычайной гибкости настройки размеров являются стандартные параметры Excel, при которых пиксели настолько растянуты и прямоугольны, что очень легко спутать их с полем для ввода данных.
Большинство пользователей даже не осознаёт что это пиксели, и видит только поля для ввода данных!
Рисунок 5: рендеринг без линий сетки
Рисунок 6: рендеринг с линиями сетки
- При необходимости можно использовать линии сетки субпиксельного размера. Это очень полезная функция, если строки и столбцы имеют разные размеры. На Рисунках 5 и 6 показаны разные режимы линий сетки.
- Цвет пикселей можно задавать 24 битами.
- Разрешение экрана 255x65535, что даёт уникально высокое разрешение в 16,7 мегапикселей, которого не найти в других 3D-движках.
- Потрясающее соотношение сторон 1:256, которое при помощи функций «Скрыть»/«Показать» можно изменить на 4:4, 16:9 или любое другое произвольное соотношение.
- 255 экранов в приложении, то есть вместе можно использовать не обычные два, а гораздо больше экранных буферов.
- Встроенная функция зума, позволяющая по желанию увеличивать и уменьшать пиксели.
Можно сказать, что нативная Excel Cell Graphics обгоняет своё время и предоставляет множество уникальных и несравненных возможностей, недостижимых в других 3D-движках: пиксели переменного размера, произвольное изменяемое соотношение сторон, разрешение 16,7 мегапикселя, включаемый субпиксельный размер линий сетки.
На рисунке ниже (Рисунок 7) можно увидеть движок в действии (с отрендеренными линиями сетки). Запустить демо можно, скачав наши файлы примеров движка Excel (при запросе Excel включите макрос), нажав клавиши ALT+F8 и запустив ECG_Demo.
Рисунок 7: движок в действии (с подсистемой рендеринга ECG)
Недостатком ECG является скорость и отсутствие некоторых стандартных графических функций (например, отрисовка линий, наложение текстур и т.д.), которые должны реализовывать сами разработчики.
Office-level Graphics Abstraction Layer
Если вам не нужны продвинутые функции ECG типа пикселей переменного размера и изменяемого соотношения сторон, то можно выбрать ещё одну подсистему рендеринга Excel — Office-level Graphics Abstraction Layer («слой абстракции графики офисного уровня»).
OGAL предоставляет дополнительные возможности (отрисовка полигонов, заливка и т.д.), более высокую производительность и совместимость с другими приложениями из пакета MS Office. Эта совместимость может быть чрезвычайно полезной, если 3D-приложение нужно портировать, например, в Word.
Любопытная особенность процесса рендеринга заключается в том, что рендеринг выполняется на отдельном слое поверх листа, поэтому подсистема способна работать без изменения имеющегося на листе содержимого.
Эта особенность позволяет запускать OGAL и ECG рядом друг с другом или отображать фоновые вычисления и их результаты на одном экране, что помогает процессу отладки. Скриншот запущенной подсистемы OGAL показан ниже (Рисунок 8).
Отдельный слой рендеринга поверх листа легко заметен на изображении: на этом слое рендерится вращающийся куб, в то время как выполняемые движком 3D-вычисления видны на фоне.
Рисунок 8: движок в действии (с Office-level Graphics Abstraction Layer)
Типичным примером превосходства подсистемы OGAL является наличие полигонов: в то время как существующие 3D-движки работают только с треугольниками, OGAL поддерживает и другие виды многоугольников (четырёхугольники, пятиугольники и т.п.).
Отдельный фоновый буфер не требуется, потому что им занимается OGAL. Цвета можно задавать в обычном 24-битном формате, а подсистема также предоставляет дополнительный альфа-канал для прозрачности. Демонстрационный файл тоже можно найти в наших файлах примеров движка Excel. Видео для тех, кто боится выполнения в реальном времени:
Предупреждение: только для очень уверенных в себе специалистов!
Сдвиг парадигмы
Последовательность естественным образом влияет на существующую парадигму программирования. Её можно встретить повсюду: день за днём тысячи программистов пишут свои алгоритмы строка за строкой, создают исполняемые файлы шаг за шагом (в соответствии с makefile), отлаживают исполняемые файлы команда за командой.
При помощи такого последовательного подхода были созданы тысячи различных программ и написаны миллиарды строк кода. Последовательность настолько пропитала нашу современную парадигму программирования, что программисты не подвергают сомнению причин её существования и воспринимают как должное её ограничения.
Примечание: не стоит недооценивать силу привычек! Скорее всего, сейчас вы пользуйтесь клавиатурной раскладкой QWERTY, которая намеренно сделана наиболее неудобной!
И это не шутка: раскладку QWERTY изначально придумали для пищущих машинок в 1860-х годах, когда сложной технологической проблемой было заклинивание механизма. Раскладка QWERTY гарантировала, что последовательные нажатия клавиш будут приходиться на разные части клавиатуры. Эта раскладка позволила решить проблему заклинивания машинок, но создала максимально возможную нагрузку на пальцы и суставы. Ветер перемен уже давно сдул пищущие машинки и их возникшие 150 лет назад технологические проблемы, однако мы пользуемся наиболее неудобной клавиатурной раскладкой и по сей день!
Такова сила привычки.
(Дополнительную информацию можно прочитать здесь)
Excel нарушает эту привычку и превосходит последовательность. Его революционный подход можно увидеть в следующих областях:
- Нетрадиционный исходный код
- Непоследовательная отладка
- Мгновенная обратная связь (без последовательного процесса сборки)
Нетрадиционный исходный код
Традиционно принято, что исходный код (и закодированные им алгоритмы), обрабатываемый современными инструментами разработки, требует последовательного считывания и интерпретации сверху вниз. На рисунке 9 показана последовательная интерпретация сверху вниз.
Рисунок 9: традиционный исходный код с интерпретацией сверху вниз
Мы настолько освоились с этим последовательным образом
Excel поддерживает такой традиционный последовательный подход сверху вниз в кодах VBA (см. пример выше), но в то же время он предоставляет совершенно новую и революционную возможность. Работая с листами, программисты могут пользоваться их двухмерностью и совершенно произвольно выбирать направление.
Это означает, что алгоритмы можно кодировать горизонтально (см. рисунок 1, где этапы 3D-сдвига интерпретируются слева направо), или снизу вверх, или даже в форме Г-образного хода коня. Excel не принуждает вас использовать традиционный последовательный кодинг, а потому обеспечивает программистам дополнительную степень свободы.
Можно сказать, что Excel открывает совершенно новые измерения для представления алгоритмов. Мы даже не можем увидеть границ этих новых возможностей! Скоро мы сможем не измерять не только длину исходного кода (см. SLOC), но и ширину (чем дополнятся значения SLOC?). Более того, это может открыть путь для n-мерного исходного кода, и мы сможем говорить ещё и о глубине или высоте исходного кода.
Excel порывает с последовательностью интерпретации исходного кода благодаря ещё одной особенности: благодаря ссылкам на ячейки программисты проще могут видеть зависимости исходных кодов, не только построчно, но и одновременно, а также быстро просматривать исходный код.
Ссылки на ячейки позволяют программисту проверить, какие ещё данные влияют на выбранную переменную (например, на рисунке 10 показано, что матрица 3D-сдвига определяется косинусом углов поворота X и Y), а также увидеть, на какие ещё переменные влияют выбранные данные (например, выбранная матрица сдвига влияет на все 3D-значения). При необходимости цепочку заданных в алгоритмах воздействий можно показать в обоих направлениях.
Рисунок 10: Ссылки на ячейки позволяют просматривать зависимости
Непоследовательная отладка
Отказ от последовательности можно наблюдать и в процессе отладки. В современных инструментах разработки программисты должны пошагово следить за выполнением, чтобы наблюдать за реальным (а не только за необходимым) поведением программы и алгоритмов.
Они могут использовать полезные инструменты (контрольные точки, step in/step out, и т.п.) для ускорения процесса и повышения его удобства, но в парадигму программирования встроена последовательность, и она замедляет процесс отладки.
И напротив, функция Autocalc («Автовычисление») в Excel демонстрирует «развёрнутое» выполнение алгоритмов, а её воздействие на всех этапах на все переменные можно мгновенно увидеть без пошаговой отладки. Эта функция значительно снижает затраты времени и повышает продуктивность программистов.
Мгновенная обратная связь
Вероятно, все программисты сталкивались с раздражающей и устаревшей особенностью инструментов разработки — результаты изменений невозможно увидеть мгновенно и для их получения нужно выполнить определённые последовательные шаги.
В обычной ситуации программисту приходится…
- Сохранять изменения
- Компилировать сохранённые файлы
- Компоновать скомпилированные файлы
- Запускать исполняемый файл вводом в командную строку, нажатием на иконку или запуском браузера и вводом URL, и т.п.
… и получать результат только после всех этих шагов.
Такие шаги могут занимать огромное количество времени, поэтому большую популярность получили специализированные инструменты, повышающие скорость компиляции (например, Incredibuild). В случае мелких и частых изменений такой процесс может привести к потере большого количества времени относительно времени на содержательную и полезную работу.
Мы настолько привыкли к этому процессу, что даже не ожидаем, что он может быть проще.
Неудивительно, что Excel порывает с этим рабочим процессом и опять-таки использует революционный подход. Благодаря его функции Autocalc редактор, компилятор, компоновщик и среда выполнения интегрированы на столь высоком уровне, что он несравним с остальными инструментами.
После изменения формулы в ячейке результат виден сразу и не требуется выполнять перечисленные выше шаги. Программистам не нужно сохранять, компилировать, компоновать и запускать исполняемый файл, даже не нужно переключаться из активного окна.
Разумеется, здесь нет чудес: «за кулисами» Excel работает последовательно, но скрывает эту последовательность от программистов.
В предыдущих разделах мы показали, как Excel ставит под сомнение обоснованность последовательности и какой революционный ответ он даёт на этот вопрос. Обратите внимание: устранение последовательности — это не просто громкие слова, но и радикально новый подход, способный изменить в будущем нашу парадигму программирования.
Заключение
Объединение компьютерных игр и электронных таблиц в процессе эволюции компьютерных технологий увеличивалось.
На первых этапах эта интеграция между играми и электронными таблицами была комичной, например, они просто устанавливались на один жёсткий диск или в лист Excel вносился список купленных игр. Позже эта интеграция расширилась — в некоторых играх появилась встроенная функция электронной таблицы (доступ к которой осуществлялся при помощи кнопки «пришёл начальник») или в Excel добавляли встроенные 3D-игры в качестве «пасхальных яиц».
Теперь мы добрались до следующего шага в этой интеграции — передовые 3D-функции Excel больше не прячутся внутри «пасхалок», к ним можно получить доступ открыто и легко. Excel возмужал и начал свои завоевания в роли революционного игрового 3D-движка.
Автор: PatientZero