Java → Графическое будущее мидлетов

Графическое будущее мидлетов
Автор: Mank
Дата публикации: 09.09.2003 13:29


J2ME



Несмотря на бурное внедрение различных технологий в контекст J2ME, пользователь, как бы его не обманывали разговорами о необходимости таких технологий в его жизни, встречает мидлет “по одежке”. И если “одежка” ему не по нраву, вызывает у него головную боль и нехорошие слова, то будьте, уверены, что вы просто не дождетесь “проводов по уму”. Пользователь нажмет красную кнопку телефона, проклянет создателя мидлета и пополнит свой черный список еще одним софтверным производителем. И не ругайте пользователя: он хороший, он вам деньги платит. Любите пользователя, иначе вы не сможете обмануть его в следующий раз (Хоть последняя фраза и является шуткой, доли истины в ней хоть отбавляй).

Вам нравится такой сценарий? Думаю, что нет. Как же решить эту проблему? Необходимо создавать удобный пользовательский интерфейс – вот, к чему я клоню. Хотите спросить: "А как?" – А как умеете, средства у вас для этого есть. MIDP 1.0 предоставляет для этого пакет javax.microedition.lcdui. MIDP 2.0 расширяет его и добавляет пакет javax.microedition.lcdui.game. Вам этого мало? Хотелось бы большего? Да еще за ту же цену и сейчас? Это вряд ли. Но заглянуть в будущее, я думаю, стоит. Ну и заглянем.

Ну и куда двинем? Я предлагаю на www.jcp.org. Что это такое? В двух словах можно сказать так: умные мужики из больших корпораций придумывают будущее для землян. Они общаются друг с другом, пишут письма, голосуют за и против, ну, или воздерживаются, и в результате этого появляется на свет финальная версия Java Specification Requests (JSR). Каждый JSR имеет свой номер, на который потом все тыкают пальцем, читают его и делают все так, как там написано. Ну, или почти так.

В данный момент нам хватит всего лишь трех пальцев, чтобы "тыкнуть" в три JSR, которые затрагивают наши интересы. Соответственно: JSR 209, JSR 226, JSR 184.


Advanced Graphics and User Interface Optional Package for the J2ME Platform
(JSR 209)
Advanced Graphics and User Interface (AGUI) является опциональным пакетом, цель которого – обеспечить разработчиков J2ME гибким механизмом для работы с графикой и пользовательским интерфейсом, как это позволяет сделать J2SE. Основной упор делается на следующие компоненты:
Swing
Java2D Graphics and Imaging
Image I/O
Input Method Framework.



В связи с этим, следующие пакеты из J2SE 1.4.1 будут включены в опциональный пакет AGUI .
javax.swing (and subpackages)
java.awt.color
java.awt.font
java.awt.geom
java.awt.im (and subpackages)
java.awt.image (and subpackages)
javax.imageio (and subpackages)



Так как JSR 209 еще не дорос до финальной версии (его текущий статус – Expert Group Formation), то это все, что известно о нем на данный момент.

Что же даст JSR 209? Откроются огромные возможности для работы с пользовательским интерфейсом. Работать в J2ME можно будет так же, как и в J2SE. Таким образом, будет стерта грань, разделяющая J2ME и J2SE (имеется в виду пользовательский интерфейс). Но это будет еще не скоро, и, конечно же, требования к аппаратным возможностям устройств будут более значительными для того, чтобы можно было обеспечить поддержку данного API.

Scalable 2D Vector Graphics API for J2ME
(JSR 226)
Scalable 2D Vector Graphics API является опциональным пакетом для работы с двумерной векторной графикой, который будет поддерживать формат Scalable Vector Graphics (SVG). SVG – это открытый формат двумерной векторной графики, определенный W3C консорциумом. SVG является XML – подобным языком с тремя типами графических объектов: "формы" векторной графики (vector graphics shapes), изображений и текста. Графический объект может быть трансформирован, сгруппирован, "анимирован". Так как SVG – спецификация включает Document Object Model (DOM) API, она позволяет легко обрабатывать с графические объекты.

Scalable 2D Vector Graphics API должен позволять загружать векторную графику, сохраненную в формате SVG, и предоставлять удобный интерфейс для работы с ней. Также он должен иметь возможность в будущем работать с другими форматами. Другое важное требование, выдвигаемое к этому API, состоит в том, чтобы оно функционировало на устройствах с различным характеристиками.

Scalable 2D Vector Graphics API будет использовать числа с плавающей точкой. И вот здесь существует один непонятный момент. С одной стороны, из этого вытекает то, что минимальной конфигурацией для него, будет Connected Limited Device Configuration 1.1 (CLDC). Так как в CLDC 1.1 была добавлена поддержка floating point. Но с другой стороны, как можно понять из спецификации, floating point может быть реализована fixed – point arithmetic нижележащего слоя. Таким образом, получается, что требование CLDC 1.1 не обязательно.

Что же даст JSR 226? Также как и предыдущий JSR, JSR 226 находится на ранней стадии своего развития. И до его реализации ещё далеко (его текущий статус – JSR Review Ballot), но уже сейчас понятно, что он предоставит большие возможности для решения различного рода задач, позволяющие насытить пользовательский интерфейс великолепными графическими функциональностями.


Mobile 3D Graphics API for J2ME
(JSR 184)
Mobile 3D Graphics API – представляет собой масштабируемый интерактивный 3D API для мобильных устройств. API будет достаточно гибким, легко позволяющим использовать 3D графику в играх, анимированных сообщениях, клиентском пользовательском интерфейсе и т.д.. Как и предыдущие JSR'ы, Mobile 3D Graphics API опциональный пакет. Свойство microedition.m3d.version, возвращаемое методом getProperty класса System, содержит номер версии данного API, если он досупен, иначе – null. Таким образом, в отличие от уже рассмотренных выше API, в этом – уже специфицирован способ определения его присутсвия.

API представляет собой абстрактный слой, позволяющий строить 3D иерархию, создавать анимированные объекты и т.д.. Ожидается, что производители будут реализовывать данный API, используя native слой и аппаратную акселерацию, где это возможно. Также не исключена реализация на "чистой Java", но так скажем, она не приветствуется.

Требования, выдвигаемые к Mobile 3D Graphics API:

Позволять использовать 3D графику в различных приложениях
API не должен знать о существовании высоких аппаратных возможностей устройства (Звучит смешно, но так написано).
API не должен устанавливать каких-либо ограничений на размер и сложность 3D графики.
API должен эффективно работать на устройствах с малым объемом ROM и RAM.
Реализация не должна превышать 100kb
API должен легко взаимодействовать с другими Java API
API должен использовать числа с плавающей точкой из CLDC 1.1 (native float data type of CLDC 1.1).
Последнее требование важно еще и тем, что оно запрещает вводить какой – либо свой тип данный взамен float data type. Но API, должен способен быть эффективно реализован и без аппаратной поддержки floating point.

Ну вот, это небольшой рассказ о Mobile 3D Graphics API, и здесь я могу с радостью сказать, что то, о чем мы говорим, уже практически готово (текущий статус – Proposed Final Draft). Есть полноценная спецификация, в которой все разложено по полочкам. Я не хочу сейчас начинать большое повествование о Mobile 3D Graphics API, так как, во первых, это займет много времени, а во вторых, я не специалист по 3D. Просто, я слегка обмолвлюсь о Mobile 3D Graphics API.

Первое. Очень важно иметь представление о том, как можно использовать Mobile 3D Graphics API в мидлете. Для этих целей существует класс Graphics3D, с помощью которого можно легко отрисовать 3D графику в мидлете. Для этого необходимо, сначала получить объект Graphics3D, вызвав статический метод Graphics3D.createGraphics3D(). Graphics3D это синглтон. Таким образом, данный метод может быть вызван только один раз, при следущем вызове вы получите IllegalStateException. После того как, вы имеете объект Graphics3D, его можно связать с Graphics или Image2D, вызвав метод, bindTarget (Object obj). Только после этого, 3D изображение может стать видимым. Метод releaseTarget() имеет обратное действие (заметьте, что он без параметров). Связав Graphics или Image2D c Graphics3D, теперь можно заняться отрисовкой 3D. Существует только один метод для этого у Graphics3D – render. И никакого другого способа нет. Ниже приведен небольшой гипотетический пример, иллюстрирующий вышесказанное.


class MyCanvas extends Canvas
{
Graphics3D g3D;
void init()
{
g3D = Graphics3D.createGraphics3D();
}

protected void paint (Graphics g)
{
g3D.bindTarget (g);

g3D.render (...);

g3D.releaseTarget (g);
}
...
}




Далее, опять таки не углубляясь далеко, приведу лишь некоторые методы, которые есть у Graphics3D:
clear (int buffers, javax.microedition.m3d.Background background)
setAmbientLight (int RGB)
setAntialiasingEnable (boolean enable)
setCamera (javax.microedition.m3d.Camera, javax.microedition.m3d.Transform)
setLight (int index, javax.microedition.m3d.Light, javax.microedition.m3d.Transform)
setViewport (int x, int y, int width, int height)
setDepthBufferEnable (boolean enable)



Второе, о чем еще хочется сказать, это о классе Loader. Этот класс позволяет загружать и десериализовывать объекты, производные от класса Object3D. Это могут быть такие классы, как:
World, Group, Camera, Light – классы описания графической сцены
Material, Appearance, Texture2D – классы атрибуты
AnimationTrack и AnimationController – анимационные классы.



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


public static javax.microedition.m3d.Object3D[]
load (byte[] data, int offset) throws IOException
public static javax.microedition.m3d.Object3D[]
load (java.lang.String name) throws IOException







class MyCanvas extends Canvas
{
Graphics3D g3D;
World world;
void init()
{
try
{
g3D = Graphics3D.createGraphics3D();
Object3D [] objs =
Loader.load ("http://domain.com/8498ujgkduy.m3d")
world = (World)objs[0];
}
catch (Exception ex){//todo}
}

protected void paint (Graphics g)
{
g3D.bindTarget (g);
g3D.render (world);
g3D.releaseTarget (g);
}
...
}




Ну и напоследок, просто приведу названия всех 29 классов пакета javax.microedition.m3d. Те, кто знаком с 3D, уже только по названиям классов поймут всю мощь Mobile 3D Graphics API.
AnimationController
AnimationTrack
Appearance
Background
Camera
CompositingMode
Fog
GeometryMode
Graphics3D
Group
Image2D
IndexBuffer
KeyframeSequence
Light
Loader
Material
Mesh
MorphingMesh
Node
Object3D
RayIntersection
SkinnedMesh
Sprite
Texture2D
Transform
TriangleStripArray
VertexArray
VertexBuffer
World




Выводы
Возможности предоставляемые, MIDP 1.0 (пакет javax.microedition.lcdui) уже не удовлетворяют запросам, выдвигаемым сообществом J2ME к мидлетам. Недавно пришедший на смену ему MIDP 2.0 дополняет пакет javax.microedition.lcdui новыми возможностями. Но стоит все же признать, что он не вносит много нового, к примеру, в класс Graphics. А что касается пакета javax.microedition.lcdui.game, то стоит признать, что пакет com.siemens.mp.game от фирмы Siemens, реализованный уже более двух лет тому назад, позволяет делать примерно то же самое.

Все три JSR, представленные в этой статье, позволят восполнить этот пробел и обрадовать J2ME программистов. Великолепный пользовательский интерфейс, двумерная и трехмерная графика. Дерзайте, рвите, пишите, реализуйте, радуйтесь, восторгайтесь, плачьте, вводите в исступление и выходите из штопора! Ой, я сказал "штопор"? Ну тогда наливайте и пейте, пейте и пойте, тостуйте и будьте тостуемыми, а потом, опять пейте и пойте, за здравие Sun и за упокой msoft.

Ho! Как всегда есть одно "но". Учитывая нынешние тенденции рынка и памятуя о том, что две из трех спецификаций практически только что родились, можно спрогнозировать следующее. Первый телефон, который будет иметь в своем наличие хоть один реализованный API из выше представленных, скорей всего, появится через 1.5 – 3 года. И это будет маленький мобильный аппарат, стоящий больших денег. А его удешевление, и как следствие, массовое распространение займут время, по крайне мере, в 2 раза большее. А может и больше, если следовать программистской традиции: сделал "эстимайшен" – умножь его на число "пи". А пока в данном направлении будет существовать "недостача".
Добавил: javavirys ( 2022-02-22 12:20:44 )
Теги:J2ME JAVA
Рейтинг: + 1 -
Просмотров: 198

Специальные предложения