Cи или не Си?

Королями разработки мультимедиа-приложений всегда были и остаются по сей день языки Си/Си++. Этому способствовали в первую очередь их широкое распространение и достаточно высокая производительность, хотя сначала создатели игр относились и к ним скептически. Однако довольно быстро замешательство программистов прошло, и вместе с Ассемблером начали применять Си/Си++ и даже Delphi. И вот теперь, возможно, наступает следующий переломный этап, этап виртуальных машин и байт-кода.

Стремительный прорыв языка программирования Java был в значительной степени обусловлен тем, что он предлагался как универсальное многоплатформное средство разработки приложений. Кроме того, в него были внедрены передовые объектно-ориентированные решения, развитые инструменты и обширная API- библиотека широкого назначения. По данным компании Evans Data, в США и Европе более половины разработчиков используют в своей работе Java, а в следующем году этот язык может стать популярнее Cи/Cи++ и Visual Basic! Конечно, успех не был бы таким громким без агрессивной маркетинговой политики компании Sun.

Тем не менее этот язык очень редко использовался для создания мультимедиа-приложений вследствие невысокой производительности систем, использующих виртуальную машину. Но в конце концов усилия производителей оборудования, оптимизация JIT-компиляторов и перевод большинства базовых классов языка в машинный код привели к изменению ситуации. Хотя зачем все это нужно, если уже есть Си++?

Одними из важнейших причин перехода на Java можно считать простоту и прозрачность языка, вобравшего в себя все лучшее от предыдущих поколений, включая Си++ и Smalltalk. Поскольку Java — бескомпромиссный объектно-ориентированный язык, то для работы с ним придется мыслить по-новому, что кому-то может показаться серьезным недостатком.

Другой существенный аргумент в пользу Java — реализованная и успешно действующая библиотека Media API Java. Для понимания ее преимуществ нужно лишь увидеть, насколько просто с ее помощью создавать сложнейшие приложения, что ниже и будет показано. Конечно, в качестве ближайшего конкурента можно рассматривать высокоуровневую библиотеку Open Inventor, но она предназначена для Си/Си++ и нуждается в интеграции с другими, поскольку не имеет средств создания интерфейса и обработки растровой графики, а также инструментов работы со звуком. Кроме того, подобные библиотеки значительно снижают быстродействие программ, что сближает их с Java.

Еще одно замечательное свойство Java — возможность передачи данных в Интернет. Для многих Web-мастеров это весьма привычная среда, ведь скриптовый язык Javascript подходит для создания динамических страниц на стороне клиента. А на некоторых Web-серверах, включая самый популярный Apache, можно привлекать Java для написания серверного сценария и создания аплетов, которые в сочетании с Media API будут представлять собой, например, интерактивные виртуальные галереи, загружающиеся на порядок быстрее, чем VRML-сцены, «говорящие головы» ведущих новостей, анимационные ролики и многое другое.

Для просмотра таких сцен, естественно, приходится загружать небольшую специальную библиотеку Java 3D Runtime Environment. Но ведь при применении других новейших технологий все равно нужно самостоятельно копировать подключаемые модули. Разработчикам же не требуется адаптировать свои программы под разные ОС и интерфейсы браузеров, и к тому же большинство аналогичных коммерческих решений стоят весьма дорого.

Хватит ли производительности?

Тест скорости морфинга. Каркас модели кисти (разрешение 9961 вершин). Многократная избыточность не влияет на качество модели

Чтобы оценить реальные возможности Java при воспроизведении трехмерных сцен, был выбран ПК средней производительности (Duron-650, 128-Mбайт ОЗУ, видеоплата GeForce MX), работающий под управлением Windows 2000. Критерием оценки является число вершин у модели объекта, воспроизводимых с допустимой частотой кадров. Можно считать, что задержки незаметны, если демонстрируется 10 — 15 кадров в секунду (правда, иногда наблюдается дискретность движений). А вот темп меньше пяти кадров в секунду малопригоден даже при ровном воспроизведении, поскольку слишком велики задержки между кадрами.

Проанализируем производительность на двух простейших примерах. В первом из них выполнялся морфинг модели кисти. (Вообще-то морфинг бывает полезен для реализации мимики и анимации персонажей, а также для создания объемных спецэффектов.) Во втором просматривались файлы анимации, созданные в программе LightWave. (Да-да, представьте себе, что можно создать сцену в этом пакете, а потом просто демонстрировать ее в реальном времени по Интернету.)

Кстати, замечу, что оба примера — аплеты, и после загрузки через Сеть они способны работать на удаленных машинах.

Морфинг модели кисти выполнялся безупречно, вплоть до 2—3 тыс. вершин в модели объекта. Много это или мало? Например, такие возможности позволяют получить хорошо проработанную голову персонажа со всеми «аксессуарами», включая уши, зубы и даже рот, подготовленную для анимации. О подобной модели, имеющей около 4,5 тыс. вершин, было рассказано в «Мире ПК» № 12/2000, c. 44. «Говорящую голову» столь высокого качества не стыдно использовать на новостном сайте, а ее проработка и мимика могут быть гораздо лучше, чем у недавно прославившейся английской 3D-ведущей госпожи Новы. Но и 2—3 тыс. вершин - это еще не предел. Java справился с морфингом модели, содержащей до 12 тыс. вершин, обеспечив вполне приемлемое качество. Явного замедления не наблюдалось, но дискретность движения уже была заметной. Неприятных ощущений просмотр не вызывал. При большем количестве вершин морфинг происходил вполне равномерно, но с четкими фиксациями положения. Не исключено, что и такое воспроизведение может пригодиться.

Тест скорости воспроизведения анимации, созданной в LightWave

При просмотре сцены, созданной в пакете LightWave, где выполнялся рендеринг объекта, вплоть до 16 тыс. вершин никакого замедления воспроизведения не отмечалось, после чего тестирование было прекращено, так как файл объекта уже с трудом обрабатывался самим графическим редактором. Но все же один неприятный момент был обнаружен: во всех случаях имели место совершенно одинаковые «торможения», вызванные, вероятно, загрузкой других программ или обработкой событий в системе. Но эти проблемы можно отнести к некоторым ограничениям аплетов, и в полноценных приложениях их, скорее всего, удастся избежать.

Результаты тестов свидетельствуют, что технология Java и уровень развития аппаратного обеспечения уже достаточно развиты для того, чтобы с их помощью можно было создавать некоторые виды мультимедийных приложений, в частности обучающие программы, аплеты для демонстрации товаров в Интернет-магазинах, базы данных с визуальным представлением знаний, редакторы изображений, 3D-моделей, сцен и даже игры определенного жанра. Кроме того, можно дополнительно повысить быстродействие программы, используя так называемые Native-компиляторы, преобразующие код Java-программы в машинно зависимый, но при этом их нельзя будет запускать в другой ОС или иной платформе.

Еще в пользу Java

Есть еще несколько немаловажных соображений, которые могут перевесить чашу весов в пользу Java:

  • Доступность. Всегда можно бесплатно переписать последние версии SDK и различных библиотек с сайта компании JavaSoft (www.javasoft.com). Более того, теперь можно копировать одну из лучших и самых популярных в России сред разработки для Java — JavaBuilder фирмы Borland (www.borland.com). Обе компании (Borland и JavaSoft) регулярно выпускают обновления своих продуктов, причем предлагают версии своих пакетов для различных платформ, что позволяет не беспокоиться о совместимости.
  • Удобство разработки. Здесь комментарии излишни. Язык Java гораздо проще многих других, но при этом компания-производитель очень хорошо и своевременно справляется с поддержкой всех технологических достижений в области программирования, включая CORBA, RMI, средства распараллеливания задач, удобный механизм обработки исключительных ситуаций и отслеживания событий, полностью объектно-ориентированная среда и пр. Спустя несколько лет после рождения языка можно с полной уверенностью утверждать, что Java всегда находится на острие технологических достижений.
  • Широта возможностей, и никак иначе. Это становится понятно, стоит лишь заглянуть в раздел Products & APIs на Web-сайте компании JavaSoft. Вряд ли где-то еще найдется столь полное сосредоточение доступных API для одной среды разработки. Там есть все или, вернее, почти все, всего в этой жизни никогда не бывает.
  • Развитость библиотек API для конкретных применений. Для разработки мультимедиа-приложений существуют Java 3D API, Java 2D API, Java Sound API, JAI (Java Advanced Imaging). Этого джентльменского набора вполне достаточно для реализации любых мультимедиа-задач, особенно если учитывать возможности его расширения и перспективы развития, намеченные компанией JavaSoft.

Java 3D API

Окно аплета, где демонстрируется одновременная работа с графикой и звуком

Сейчас поставляется только в виде опции, что несколько смущает, ведь приходится самостоятельно загружать эти библиотеки для работы с 3D-приложениями. Но есть надежда, что этот пакет скоро войдет в комплект JDK, как это периодически происходит с другими Java API.

Компания JavaSoft реализовала возможности 3D в Java, создав собственную библиотеку и привязав ее к стандартным средствам OpenGL и DirectX. Но интерфейс программирования 3D-приложений на Java значительно отличается от того, что у OpenGL, приближаясь к имеющемуся у высокоуровневой библиотеки Open Inventor. Он стал следующим этапом развития средств создания трехмерной графики, причем реально работающим, доступным и многоплатформным.

На нынешнем уровне реализации Java 3D API обеспечивает следующие дополнительные возможности:

  • Работа с файлами 3D-моделей (lwo — модели программы LightWave; obj — стандарт представления моделей компании Alias WaveFront). Такая поддержка позволяет довольно легко включать 3D-модели в проекты, предварительно отредактировав их в популярных пакетах вроде LightWave, Maya. Многие из других 3D-редакторов, в том числе распространяемые бесплатно, также поддерживают эти форматы.
  • Работа с файлами сцен формата lws программы LightWave. Эта уникальная функция позволяет готовить сцены с анимацией в LightWave и представлять их в аплетах или Java-приложениях, концентрируясь на самой идее проекта и разработке дизайна, а не на программировании. Из свободно распространяемых библиотек подобными возможностями обладает, пожалуй, только Genesis 3D, но лишь для формата max программы 3D Studio Max.
  • Морфинг моделей. Это довольно свежее и интересное решение. Достаточно упомянуть, что только в прошлом году появились графические акселераторы, поддерживающие морфинг. Но в Java он вполне успешно реализуется и на программном уровне. Наилучшее применение этой функции — анимация мимики персонажей, к тому же высокого качества, достаточно реалистичная и в реальном времени.
  • Оптимизация файлов и сцен. В Java 3D предусмотрены гибкие механизмы оптимизации представления объекта. Разработчик может выбирать, что и в какой степени оптимизировать — каркас модели, текстуру и пр. Таким образом, удается значительно уменьшить размеры объектов, чтобы ускорить их загрузку через Интернет. Кроме того, можно определять разрешения модели в зависимости от ситуации, что весьма ускоряет работу в реальном времени, например путем сокращения числа полигонов в модели в зависимости от масштаба.

Это лишь несколько штрихов к портрету Java 3D API. Основное ее достоинство - возможность создания объектной модели представления сцен, но это будет рассмотрено в следующий раз в процессе построения 3D-приложения.

Java 2D API

Библиотека уже включена в JDK 1.3. Она представляет собой базовый набор средств для работы с различными графическими примитивами (точка, линия, прямоугольники, разновидности овала и пр.) и растровыми изображениями. В сущности, это вполне стандартное дополнение к среде разработки, подобные имеются почти для всех языков программирования. Однако у Java есть средства, позволяющие значительно улучшить качество отображения благодаря некоторым встроенным алгоритмам (двойная буферизация, задержка перерисовки изображения до завершения передачи файла из Интернета, интеграция с другими библиотеками и пр.)

Java Advanced Imaging (JAI)

Библиотека JAI является дополнением к 2D API. Они тесно интегрированы друг с другом, используя общие ресурсы. На данный момент эта библиотека является опциональной, но начиная с версии JDK 1.4 ее отдельные части уже будут включены в комплект средств разработчика.

Она представляет собой средства чтения-записи графических файлов (bmp, gif, FlashPix, jpeg, png, pnm и tiff), а также многочисленные средства для обработки растровых изображений, аналогичные фильтрам Adobe Photoshop. Чтобы облегчить манипуляции с двумерными картами изображений в трехмерных сценах, начиная с версии JDK 1.1, компания JavaSoft реализовала более тесное взаимодействие JAI с 3D API. Эту библиотеку можно вполне успешно использовать и для постобработки 3D-сцен с последующим их сохранением как видеофайлов. На данный момент продолжается интенсивное расширение функциональности JAI и, скорее всего, самое интересное еще впереди.

Java Sound API

Это довольно мощная библиотека для работы со звуком, и она также включена в JDK 1.3. Компания JavaSoft предлагает ее как средство для создания коммуникационных систем (конференции и телефония), музыкальных проигрывателей, игр, Web-сайтов с динамическим содержанием, а также для различного рода вспомогательных инструментов, работающих со звуком или MIDI-аппаратурой. Sound API предоставляет широкие возможности — от записи-чтения в аппаратные порты компьютера для взаимодействия с внешними устройствами и записи-чтения файлов (au, aiff, wav, midi) до непосредственной обработки аудиоданных и управления встроенным синтезатором. Так что с помощью этой библиотеки можно создавать программы, считывающие аудиоданные с микрофона, записывать их в удобном для вас формате файла, применять к ним алгоритмы обработки, фильтрации, анализа и выводить полученное на внешние устройства воспроизведения и записи. Кстати, предлагаются и такие средства, которые позволят разработчикам значительно расширить функциональность Sound API, например создавать дополнительные модули для работы с другими форматами файлов.

На этом закончим общее знакомство с Java Media API. Следующим шагом станет построение виртуальной студии подготовки анимационных 3D-роликов в Интернете и аплета их просмотра.

Продолжение следует

Об авторе

Виталий Галактионов - независимый эксперт, e-mail: vit3d@mail.ru