Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Листинг 18.6. Программа, изображающая горизонтальную линию и использующая для этого тип WORD (HLINEF.C).

ТЕХНИКА СОЗДАНИЙ ПАРАЛЛАКСА | Листинг 17.1. Файл заголовка демонстрационной программы циклического скроллинга (PARAL.H). | Листинг 17.2 Демонстрационная программа повторяемого смещения. | Листинг 17.3. Простой двойной параллакс (PARAL1.C). | Листинг 17.4. Оптимизированная подпрограмма (BLIT.ASM). | Листинг 17.6. Демонстрационная программа мозаичного смещающегося слоя (TILES.C). | Листинг 17.7. Проверка вертикальной трассировки. | ТЕХНИКА ОПТИМИЗАЦИИ | Листинг 18.1. Сравнение выполнения программы с использованием справочных таблиц и встроенных функций sin и cos (LOOKNUP.C). | Листинг 18.2. Функции библиотеки системы с фиксированной запятой (FIX.C). |


Читайте также:
  1. Бесспорным лидером в Любви (с большой буквы «Л») и бесспорным инициатором зарождения этого чувства(и в мужчине — тоже)является Женщина (с очень большой буквы «Ж»).
  2. Будьте «совершенным», ибо достаточно для этого благодати Божьей
  3. В основе этого хадиса нет довода, который указывал бы на дозволенность посещения могил женщинами.
  4. В подтверждение этого я ушел домой. Никогда не говорите людям, что им следует делать, и они удивят вас своей изобретательностью[54].
  5. В порядке вещей, если вы решите не решать — но только в том случае, если у вас есть система для этого.
  6. В принципе, Аллах может сделать всех хорошими и покорными, но для этого Он должен отобрать у нас свободу.
  7. В рамках этого направления (реализуя это направление, оно проявилось в следующих делах, событиях, мероприятиях, реформах)

H_Line_Fast(int xl,int x2,int у,unsigned int color)

{

unsigned int first_word, middle_word, last_word,line_offset,

index;

// тестируем 1 бит начальной х-координаты

if ((x1 & 0х0001))

{

first_word = (color << 8);

}

else

{

// заменить цвет в обоих байтах

first_word = ((color<<8) | color);

}

// тестируем первый бит в х2

if((х2 & 0х0001))

{

last_word = ((color<<8) | color);

)

else

{

// поместить цвет только в старший байт

last_word = color;

}

// теперь мы можем рисовать горизонтальную линию,

// выводя сразу по два пикселя

line_offset = ((у<<7) + (у<<5)); // у*160, поскольку в линии 160 слов

// вычислить цвет в середине

middle_word = ((color<<8) | color);

// левая граница

video_buffer_w[line_offset + (x1>>1)]= first_word;

// середина линии

for (index=(x1>>1)+l, index<(x2>>l); index++)

video_buffer_w[line_offset+index] = middle_word;

// правая граница video_buffer_w[line_offset+(х2>>1)] = last_word;

}

В начале работы функция проверяет, находятся ли конечные точки на границе байта (BYTE)? Основываясь на результатах проверки, функция создает два слова (WORD): одно будет началом линии, а другое ~ концом. В зависимости от результатов начального теста эти два слова содержат либо один, либо два байта, представляющих цвет. Затем функция изображает линию. Это выполняется следующим образом:

§ Пишется первый WORD, соответствующий левой границе;

§ Создается цикл FOR, который предназначен для записи в WORD середины линии;

§ Пишется WORD, соответствующий правой границе линии.

Хотя эта функция почти в два раза длиннее, чем первоначальная Н_Line, она почти в два раза быстрее.

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

ИТОГ

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

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


 

ИГРА WARLOCK (КОЛДУН)

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

Я обещал дать готовую трехмерную игру. Но я вас обманул. Чуть-чуть. Если б я написал полную игру, вам ничего не осталось бы делать и вы не смогли бы ничему научиться. Поэтому я составил только скелет, ядро трехмерной игры, выполняющейся в реальном времени. Позже, с помощью этой книги вы и сами сможете написать все недостающие функции, чтобы закончить ее разработку.

Взгляните на рисунок 19.1. На нем показаны несколько кадров игры Warlock.

Постарайтесь превратить эту заготовку в настоящую игру. Может быть, у вас получится какая-нибудь простая игрушка типа «Захвата флага», а может быть, вы создадите нечто подобное DOOM'y. Что бы вы ни решили, мне будет приятно увидеть результат, поэтому в конце главы я сообщу адрес, по которому вы можете прислать любые пожелания или вопросы (я даже мог бы опубликовать вашу игру в какой-нибудь подходящей книге или журнале).

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

§ Сюжет игры Warlock;

§ Компоненты игры;

§ Новый отсекатель лучей;

§ Изображение текcтуры;

§ Оттенение;

§ Использование ассемблера;

§ Цикл игры;

§ Игровое поле;

§ Режим демонстрации;

§ Размещение объектов в пространстве;

§ Достижение некоторой скорости;

§ Несколько слов напоследок.


 

Сюжет игры

Первым делом при разработке игры нужно позаботиться о том, чтобы она не повторяла уже существующие. Можно предположить, что Warlock будет трехмерной игрой с поединками на мечах и волшебством. Основная идея будет такой:

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

Игра должна неплохо выглядеть: несколько уровней с красивым графическим оформлением, пара монстров и изящные синтетические звуки. Все это вместе с трехмерным изображением должно поднять нашу игру до уровня Wolfenstein 3-D. Конечно, вы можете делать с ядром игры все, что вам заблагорассудится. Я не навязываю вам сюжетную линию Warlock, а только предлагаю.

Компоненты игры

Чтобы программа игры не показалась слишком запутанной, давайте рассмотрим, из каких частей она состоит. Затем разберемся, что в ней есть, а чего не хватает.

Примечание по звуку

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

§ DMA#1

§ IRQ #5

§ I/O port-220h

Если ваши установки лучше, вы всегда можете заново оттранслировать исполняемый модуль и сделать соответствующие изменения в функции Voc в начале модуля main.

Даже если вы и не имеете звуковой карты, все равно запустите программу, чтобы увидеть ее в действии.

Загрузка и компиляция Warlock

Исполняемый модуль называется WARLOCK.EXE. Для запуска программы достаточно ввести warlock в командной строке DOS.

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

WARLOCK.С исходная программа игрового ядра.

SNDLIB.C исходная программа звуковой системы. Соответствующие функции вы видели раньше, но для Warlock я создал более совершенный интерфейс и разместил его в этом файле.

SNDLIB.H файл заголовков для SNDLIB.C.

GRAPHICS.С окончательная графическая библиотека (почти идентичная GRAPHO.С).

GRAPHICS.H файл заголовков для GRAPHICS.C.

DRAWG.ASM эта функция изображает черное небо и серую поверхность земли, используя 32-битовые команды.

RENDER32.ASM эта функция копирует изображение из дублирующего буфера в видеопамять. Она также использует 32-битовые команды.

SLIVER.ASM эта функция изображает отдельный фрагмент текстуры изображения в двойном буфере. Это способ генерации трехмерного вида (набор вертикальных полосок). Я снова использовал 32-битовые команды, и таким образом вы получаете доступ к регистрам дополнительного сегмента.

После трансляции всех файлов они связываются вместе, используя warlock.с как главный модуль. Я делал вот как: сначала создал общую библиотеку, в которой объединил звуковую и графическую библиотеки, а также дополнительные функции на ассемблере. Затем я откомпилировал ее и скомпоновал с главной программой WARLOCK.С.

Учтите, что компиляция производится с использованием модели памяти MEDIUM. Также не забудьте использовать опцию /G2, позволяющую учитывать специфические особенности команд 286-го процессора. Все необходимое записано в стандартном ВАТ-файле, который я использовал для компиляции программы с помощью Microsoft C/C++ 7.00:

cl -AM -Zi -с -Fc -Gs -G2 %l.c

Эта строка переводится так: «компилировать для модели памяти MEDIUM, с использованием команд 286-го процессора, с отключенным контролем переполнения стека и генерировать листинг программы». Чтобы получить представление, как компонуется программа, взгляните на рисунок 19.2. На нем показана схема, по которой отдельные кусочки объединяются в единое целое.

Режим демонстрации

Игра начинается в демонстрационном режиме, на это указывает надпись DEMO в верхней части экрана. Вы увидите, как демонстрационная программа «прокручивает» примерно минутную пробежку в пространстве. Когда надоест, нажмите клавишу Esc. Это позволит вам самим побегать по лабиринту.

Движение по игровому пространству

В этом режиме используйте клавиши управления курсором для перемещения в пространстве. Чтобы открыть дверь, нажмите клавишу Пробел.

Как видите, окружающая среда Warlock напоминает подземную тюрьму. Вы можете заметить, что в этом пространстве не существует никаких объектов. Также отсутствуют полы, потолки или тени — только стены, да кое-где двери. Мы обсудим все эти темы чуть позже в этой главе.

Когда вдоволь нагуляетесь, вновь нажмите Esc для выхода из игры. Вы пока побродите по закоулкам, а я подожду здесь.

Вернулись? Теперь поговорим немного по поводу каждой части игрового ядра, представляющей для нас хоть какой-нибудь интерес.

Новый отсекатель лучей

Отсекатель; лучей, который вы видели в шестой главе, «Третье измерение», по быстродействию был подобен матричному принтеру, пытающемуся напечатать полутоновую картинку с высоким разрешением! Словом, он был чрезвычайно медлительным. Так получилось потому, что он был написан совершенно прямолинейно и целиком на Си, в нем использовалась математика с плавающей запятой и не применялись справочные таблицы. Отсекатель лучей, который я создал для Warlock, немного другой. Новая программа оптимизирована во многих частях, хотя есть возможность ускорить ее работу еще примерно в два раза. Однако после этого отсекатель лучей мог бы стать таким жутким, что вы не захотели бы иметь с ним дело. (Я сам едва могу вообразить, как он выглядел бы в этом случае, а ведь я его написал!)

В конечном счете, быстродействие отсекателя лучей — не самое узкое место. Таким узким местом в гораздо большей мере является перемещение содержимого двойного буфера в видеопамять. Поэтому будет значительно лучше чередовать отсечение лучей с визуализацией изображения.

Мы поговорим немного больше по этому поводу и о некоторых других вещах немного позже, а сейчас перейдем непосредственно к программе нового отсекателя лучей (Листинг 19-1).


Дата добавления: 2015-07-12; просмотров: 75 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Листинг 18.5. Версия функции рисования пикселя на ассемблере.| Листинг 19.1. Новая программа отсечения лучей.

mybiblioteka.su - 2015-2024 год. (0.013 сек.)