Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 Простые графические спецэффекты.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
4.68 Mб
Скачать

2.2. Программирование на языках высокого уровня

Основу работы компьютеров составляет выполнение последовательности действий, задаваемых машинным кодом. Машинный код можно непосредственно задавать на языке ассемблера - "языке низкого уровня". Для этого нужно иметь специальные знания об архитектуре компьютера и владеть соответствующими методами. Языками высокого уровня (ЯВУ) называют языки программирования, которые позволяют задавать последовательность действий в более кратком и удобном для человека виде. Процедуры и структуры данных задаются в виде относительно удобочитаемых символических выражений. Программа на таком языке намного короче чем на ассемблере. К таким языкам относятся C/C++, Pascal, Fortran. Сущность этих языков заключается в том, что большие участки кода на ассемблере заменяются на короткие команды, такие как имена функций и описания структур данных. Особенно важным ЯВУ является C/C++, поскольку он традиционно используется там, где ЯВУ нужен для удобства, чтобы не писать на ассемблере. Программа, написанная на ассемблере, имеет максимальное быстродействие. Программа на C/C++ работает почти так же быстро, как и на ассемблере, но некоторые вещи всё же лучше написать именно на ассемблере. Поэтому C/C++ (и другие ЯВУ) позволяет делать ассемблерные вставки - вставлять в программу кусок кода на языке ассемблера. Поскольку задачи компьютерной графики требуют обработки большого числа точек изображения, эти задачи особенно чувствительны к скорости выполнения программ. Рассмотрим алгоритм Брезенхема для рисования отрезка. Реализуем его на C++ с использованием стандартной функции putpixel: Этот код использует процессорное время не эффективно, поскольку сам по себе вызов функции putpixel затрачивает дополнительное процессорное время - на формирование стекового кадра, на передачу и возврат управления. В отрезке много точек, и холостой расход времени становится ощутимым. Чтобы сэкономить время, нужно всюду заменить функцию putpixel на кусок кода на ассемблере, который ставит точку на экран. Теперь мы имеем код, который написан по-настоящему грамотно. Разумеется, в C++ имеется готовый графический пакет, в котором уже есть функция рисования отрезка, которая написана на ассемблере. При сравнительной проверке быстродействия выясняется, эта написанная нами функция рисования отрезка в 3 раза быстрей уже имеющейся. Это обусловлено тем, что мы пропустили некоторые дополнительные действия - например, проверку попадания точки за пределы экрана. Специальная функция putpixel понадобилась нам ради обращения к видеопамяти. Если изображение просто хранится в памяти компьютера в виде массива, изменение его точек можно описать общими средствами языка, такими как обращение к ячейке массива и т.п. Таким образом, нам понадобится всего одна ассемблерная вставка. Всё остальное можно написать быстрым и без ассемблерных вставок, если соблюдать элементарную грамотность написания кода. Наш пример дан для C++ под операционной системой MS-DOS на IBM PC. Код на ассемблере существенно различается для разных аппаратных платформ, и для разных операционных систем. Чтобы найти подходящий образец ассемблерной вставки, нужно иметь специальные знания, или обратиться к специальным источникам, где дан готовый образец кода. Упомянем о таком приёме как работа с "экранными страницами". Изображение, которое отображено на экране, хранится в так называемой видеопамяти. Видеопамять - это участок оперативной памяти, который напрямую совмещён с чипом видеокарты. Такое совмещение позволяет управлять изображением на экране, записывая данные в оперативную память. Видеопамять может быть во много раз (или хотя бы в два раза) больше, чем требуется для хранения изображения экрана. Тогда можно воспользоваться "экранными страницами" - хранить одновременно несколько изображений экрана, и мгновенно "листать" их. При этом просто меняют указатель, который задаёт участок памяти, отображаемый на экране, и кадры сменяются с той скоростью, которая предусмотрена частотой смены кадров видеокарты - например, 85 Герц. Во многих графических библиотеках для этого предусмотрены специальные команды. "Экранные страницы" используются для получения анимации или просто быстро меняющегося изображения на экране монитора. Но они нужны только если вы контролируете весь экран целиком. Если вы работаете в среде с оконным интерфейсом, то для анимации достаточно просто иметь быстродействующие функции вывода изображения на экран.