Приложение под версии плеера 9 и 10 => проблемы с Vector'ом

1 view
Skip to first unread message

gotoan...@googlemail.com

unread,
Jun 2, 2009, 4:58:07 AM6/2/09
to ruFlash
Приветствую участников.

Пишу flash-приложение, которое должно работать минимум в девятке. В
приложении испульзуются анимация простых 3D моделей. Так как
производительность имеет большое значение, то для 9 пользуюсь
библиотекой Sandy, а для последующих версий написал с использованием
новых функций, которые нам дарит десятка.

Думаю, мне не стоит здесь рассказывать о том, как во флеше определять
версию, и соответственно включать в программу тот или иной функционал.
Проблема в другом: для десятки я пользуюсь новым типом данных
Vector.<>, и именно из-за него возникают траблы сразу при старте в
FP9.

VerifyError: Error #1033 Cpool-Entry XXX has an incorrect type.

Выглядит так, что все используемые нативные типы данных описываются
где-то экстра, и плеер это проверяет во время загрузки. Беглый взгляд
по докам к формату swf пока никакого просветления не дал. Пока-что
единственным вариантом было отказаться от использования Vector'а, но
как-то это совсем не весело.

Сразу оговорюсь, все должно находиться в --одном-- файле,
соответсвенно вариант с подзагрузкой никак не катит. Может у кого
какие Идеи?

Vadim

unread,
Jun 2, 2009, 5:14:13 AM6/2/09
to ruF...@googlegroups.com
класс Vector поддерживается только с 10 версии плейера


Проблема в другом: для десятки я пользуюсь новым типом данных
Vector.<>, и именно из-за него возникают траблы сразу при старте в
FP9.

VerifyError: Error #1033 Cpool-Entry XXX has an incorrect type.



--
Vadim Nikolaev
Flash Senior Developer
Sibers Company
ICQ: 274348576
Gmail: Cema...@gmail.com
Skype: CemaprJl
Cell Phone: +7 923 186 6633

Sergey Kruk

unread,
Jun 2, 2009, 5:56:13 AM6/2/09
to ruF...@googlegroups.com
> Может у кого какие Идеи?

У меня похожая была задача на флексе. Я делал так:

Получить версию плеера внутри флекса можно через
flash.system.Capabilities.version (распарсить строку). Потом писал два
функционала: один с использованием 10, а другой -- без. И запихивал их
в разные классы (10 может наследоваться от 9 и перегружать функци, но
не наоборот). Потом использовал переменную без типа (var a:*) и после
проверки версии заводил экземпляр одного или другого класса.

Компилируется проект целиком под 10 флэш.

Проблемы следующие:
1. Очень трудно отлаживать, т.к. если вызвал, например, несуществующий
метод, то компиляция проходит нормально, т.к. тип не задан и имеешь
дело только с runtime error.
2. Если используется хотя бы один класс, в который был добавлен
значительный функционал в 10 плеере, которого не было в 9 (например
UIComponent и любой его наследник), то весь проект перестает работать.

Всё работало, пока я не уперся в пункт 2. Подправил проект, чтобы было
две swf-ки, каждая скомпилирована под свой плеер и подставляет нужную
уже джаваскрипт.

Сергей Крук
========================================
2009/6/2 gotoan...@googlemail.com <gotoan...@googlemail.com>:

gotoandscript

unread,
Jun 2, 2009, 6:16:13 AM6/2/09
to ruFlash

On Jun 2, 11:56 am, Sergey Kruk <sergey.k...@gmail.com> wrote:
> У меня похожая была задача на флексе. Я делал так:

Благодарю Вас, Сергей, но пока что вы подробнее рассписали мою фразу:

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

Поймите, проблема именно (и только) в новом top-level классе Vector.

Aziz Zaynutdinoff

unread,
Jun 2, 2009, 6:24:02 AM6/2/09
to ruF...@googlegroups.com
> Проблема в другом: для десятки я
> пользуюсь новым типом данных
> Vector.<>, и именно из-за него возникают
> траблы сразу при старте в
> FP9.
> VerifyError: Error #1033 Cpool-Entry XXX has an incorrect type.
извините, а как вы хотите иначе? Если в 9-
ке нет этого функционала, то ему просто
положено ругаться.
И отчего решение, предложенное Сергеем
Круком вас не устраивает?

quote:
Потом использовал переменную без типа
(var a:*) и после
проверки версии заводил экземпляр
одного или другого класса.

--
Aziz Zaynutdinoff
actionsmile 3.0 Developer
______________________________________________________________________
aziz.zay...@gmail.com

gotoandscript

unread,
Jun 2, 2009, 6:34:30 AM6/2/09
to ruFlash
On Jun 2, 12:24 pm, Aziz Zaynutdinoff <aziz.zaynutdin...@gmail.com>
wrote:

> извините, а как вы хотите иначе? Если в 9-
> ке нет этого функционала, то ему просто  
> положено ругаться.
> И отчего решение, предложенное Сергеем  
> Круком вас не устраивает?

а разве я написал, что меня это не устраивает???

еще раз: если --- где-либо --- в программе проскакивает Vector,
независимо от того, выполняется этот код или нет => error.

Flop Serg

unread,
Jun 2, 2009, 6:58:43 AM6/2/09
to ruF...@googlegroups.com
По моему одной флешкой реализовать это не возможно...
Да и думаю не стоит усложнять себе жизнь делайте одну версию под 10, а юзера попросите обновится
яваскриптом или просто текстом

Sergey Kruk

unread,
Jun 2, 2009, 7:11:26 AM6/2/09
to ruF...@googlegroups.com
Ммм... Странно. Я описал полностью рабочий случай. И там действительно
использовался именно класс Vector потому что задача была в области 3d
проекций.

Я понимаю, мы все тут профессионалы, не стоит об очевидных вещах. Но
ActionScript это же не интерпретатор. :)

Стоит ли упоминать, что в ActionScript нужно не только чтобы код не
выполнялся, но даже не заводился объект класса, в котором есть код,
который не подходит к плееру? Даже чтобы не объявлялась переменная
этого типа?

var a:*;

if getMagicVersion() >= 10 {
a = new BrandNewUsingVector();
} else {
a = new OldSchoolNoVectorNever();
}

Стоит ли говорить, что в определении класса OldSchoolNoVectorNever не
должно быть никаких новых классов. Как и в описании его предков?

Сергей Крук
=========================================
2009/6/2 gotoandscript <gotoan...@googlemail.com>:

Ivan Dembicki

unread,
Jun 2, 2009, 7:21:30 AM6/2/09
to ruF...@googlegroups.com
Hello Sergey,

- если вы можете полностью реализовать приложение на 9-м плеере, то
зачем вам еще и 10-я версия?
Это мазохизм какой-то.
Класс Vector сделан для того, чтобы облегчить программирование. Но,
если вы уже реализовали или обязательно должны реализовать требуемый
функционал под 9-й плеер, то какой смысл туда докидывать варианты
10-го?
Прекратите ерундой заниматься.

--
iv
http://www.bezier.ru
http://bezier.googlecode.com

Daniil Tutubalin

unread,
Jun 2, 2009, 7:21:43 AM6/2/09
to ruF...@googlegroups.com
Cpool - это Constant Pool, но содержит он не только константы в
буквальном смысле (числое, строковые и т.д.), но и имена методов,
типов, неймспейсы и т.д.
Видимо для типа Vector сделали новый тип константы, который 9-му
плееру неизвестен.
Каждый скрипт (тег DoABC или DoABC2) содержит один Cpool.
Обычно скрипт в sfw только один и содержит все классы. Т.е. сколько бы
мы классов не создавали, как бы их не наследовали, всё равно "плохая"
запись попадёт в Cpool.

В принципе, одна SWF может содержать и несколько скриптов (правда, как
это сделать стандартными средствами, я не знаю), у каждого из которых
свой Cpool. Однако, боюсь, верификатор всё равно будет проверять их
все, так что такой способ может и не помочь.

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

1. Всё, что касается FP10 и использует Vector сперва компилируется в
отдельную SWF.
2. Полученная SWF в виде ByteArray ембедиться в основную SWF.
3. При необходимости загружается с помощью URLLoader.loadBytes().

gotoandscript

unread,
Jun 2, 2009, 7:23:08 AM6/2/09
to ruFlash
On Jun 2, 12:58 pm, Flop Serg <serg.f...@gmail.com> wrote:
> Да и думаю не стоит усложнять себе жизнь делайте одну версию под 10
"мы легких путей не исчем" ;)

>, а юзера попросите обновится яваскриптом или просто текстом

в том-то и дело, что юзер "очень вредный", т.к. корпоративный, где на
новые технологии переходят года так через два, а Админ считает себя
первой шишкой после директора. К тому же flash выполняется не в
браузере, а embed.

> По моему одной флешкой реализовать это не возможно...

просто надеюсь по схеме:
"на каждую хитрую ж..."

Flop Serg

unread,
Jun 2, 2009, 7:29:07 AM6/2/09
to ruF...@googlegroups.com



3. При необходимости загружается с помощью URLLoader.loadBytes().

Если в 9ке была эта самая преславутая функция loadBytes (не помню)
то этот вариант очень даже прост и проканает без вопросов

Daniil Tutubalin

unread,
Jun 2, 2009, 7:32:28 AM6/2/09
to ruF...@googlegroups.com
В девяткке она точно есть.
Геморрой, на мой взгляд:
1. скомпилять SWF, который содержит только то, что надо и не содержит
ничего лишнего (как бы плагин).
2. заембедить его в виде ByteArray.

gotoandscript

unread,
Jun 2, 2009, 7:37:04 AM6/2/09
to ruFlash
On Jun 2, 1:21 pm, Daniil Tutubalin <tutuba...@gmail.com> wrote:
> Cpool - это Constant Pool, но содержит он не только константы в
> буквальном смысле (числое, строковые и т.д.), но и имена методов,
> типов, неймспейсы и т.д.
> Видимо для типа Vector сделали новый тип константы, который 9-му
> плееру неизвестен.
> Каждый скрипт (тег DoABC или DoABC2) содержит один Cpool.
> Обычно скрипт в sfw только один и содержит все классы. Т.е. сколько бы
> мы классов не создавали, как бы их не наследовали, всё равно "плохая"
> запись попадёт в Cpool.

спасибо за конструктивный ответ. Может Вам известно где найти подробую
тех-информацию, или я пропустил это в доках к swf-формату?

> Однако могу предложить такой вариант. Очень геморройный...
это точно! :) но, в принципе, действительно реальный (как-то совсем не
вспомнил про это). Буду мозговать по поводу.

Flop Serg

unread,
Jun 2, 2009, 7:46:55 AM6/2/09
to ruF...@googlegroups.com
1. скомпилять SWF, который содержит только то, что надо и не содержит
ничего лишнего (как бы плагин).

Компилим две SWC либы с нужными классами юзаем при разработке одну либо другую
достаем из этой swc скомпиленные swf и эмбедим
 

2. заембедить его в виде ByteArray.

[Embed("lib1.swf", mimeType="application/octet-stream")]
      private static const Lib1:Class;

[Embed("lib2.swf", mimeType="application/octet-stream")]
      private static const Lib2:Class;

      public static function LoadLib1() :void
      {
         var ba:ByteArray = ByteArray( new Lib1() );
         var loader:Loader = new Loader();
         loader.loadBytes(ba, new LoaderContext(false,ApplicationDomain.currentDomain))
         }
...

Daniil Tutubalin

unread,
Jun 2, 2009, 7:47:22 AM6/2/09
to ruF...@googlegroups.com
> Может Вам известно где найти подробую тех-информацию, или я пропустил это в доках к swf-формату?

http://www.adobe.com/devnet/actionscript/articles/avm2overview.pdf
(правда уже старый документик)

Про Cpool рассказывается в главах 4.3 и 4.4

Reply all
Reply to author
Forward
0 new messages