Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   XML и Embed (http://www.flasher.ru/forum/showthread.php?t=163292)

savva 07.08.2011 21:16

XML и Embed
 
Здравствуйте.

Есть такой код:
Код AS3:

        public class Main extends Sprite        
        {
        [Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class;
        private var sc:Scene;
                public function Main()
                {
                        var file:ByteArray = ((new EmbedModel()) as ByteArray);
                        var str:String = file.readUTFBytes( file.length );
                        var xml:XML = new XML( str );
                        sc = new Scene(xml);
                        stage.addChild(sc);

Хочу перенести этот код:
Код AS3:

var file:ByteArray = ((new EmbedModel()) as ByteArray);
                        var str:String = file.readUTFBytes( file.length );
                        var xml:XML = new XML( str );

В класс Scene.В классе документ будет производится следующее: (а в классе сделать функцию в которой будет исполняться код выше).
Код AS3:

 [Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class; 
        private var sc:Scene;
                public function Main()
                {
                        sc = new Scene(new EmbedModel());
                        stage.addChild(sc);

Можно ли так делать?Если можно,то что нужно в конструкторе прописать (какого типа будет переменная будет передана).

Возможно ли такое?

СлаваRa 07.08.2011 21:21

я же уже говорил конструктор класса Scene принимает XML.
что Вы уже пробовали сделать и что не получается(какие ошибки)?

savva 07.08.2011 21:32

Код:

sc = new Scene(new EmbedModel());
В этом случае принимает XML ?

Вот такая ошибка:
Код:


TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать Main_EmbedModel@86148c9 в XML.
        at Main()

конструктор пока что такой:
Код AS3:

public function Scene (_xml:XML) {
                        myxml = _xml;
                        addEventListener(Event.ADDED_TO_STAGE, Init);
                }

Что мне нужно прописать в параметрах конструктора,чтобы я мог передать
Код:

new Scene(new EmbedModel());
и уже в конструкторе сделать вызов функции:
Код AS3:

        private function GetXml(/*КАКОЙ ТУТ ПАРАМЕТР ДОЛЖЕН БЫТЬ?*/):XML
                {
                        var file:ByteArray = (/*new EmbedModel()*/ as ByteArray);
                        var str:String = file.readUTFBytes( file.length );
                        var xml:XML = new XML( str );
                }

А конструктор должен быть таким получится примерно
Код AS3:

public function Scene (/*какой-то параметр чтобы передать new EmbedModel()*/) {
                        myxml = GetXML(/*new EmbedModel()*/);
                        addEventListener(Event.ADDED_TO_STAGE, Init);
                }


dimarik 07.08.2011 21:46

Вы же знаете, что new EmbedModel() as ByteArray

savva 07.08.2011 22:08

Сделал вот так:
Код AS3:

sc = new Scene(new EmbedModel() as ByteArray);

но хочется чтобы было как можно меньше телодвижений. Чтобы просто прописать
Код AS3:

sc = new Scene(new EmbedModel());


saikspaik 07.08.2011 22:17

Посмотри эту тему, может поможет.

dimarik 07.08.2011 22:17

Код AS3:

public function Scene (xml:ByteArray) {


savva 08.08.2011 02:22

Цитата:

Сообщение от dimarik (Сообщение 1019022)
Код AS3:

public function Scene (xml:ByteArray) {


Спасибо,я так и писал,просто не думал что можно будет сразу делать так :
Код AS3:

sc = new Scene(new EmbedModel());

Вопрос решён,спасибо.

ChuwY 08.08.2011 04:16

Никогда не делал через байтаррей. Решил провести тест.

Код AS3:

public class xmlTest extends Sprite {
    [Embed(source = "example.xml", mimeType="application/octet-stream")] private static const EXAMPLE_XML: Class;
    public function xmlTest() {
 
      var start  : Number;
      var now    : Number;
      var counter : int;
 
      // test 1
      start = getTimer();
      for(counter = 0; counter < 10000; counter++){
        getXML_1()
      }
      now = getTimer();
 
      trace("get xml var 1 time : " + (now - start));
 
      // test 2
      start = getTimer();
      for(counter = 0; counter < 10000; counter++){
        getXML_2()
      }
 
      now = getTimer();
 
      trace("get xml var 2 time : " + (now - start));
    }
 
    private function getXML_1():XML{
      return XML(new String(new EXAMPLE_XML()))
    }
 
    private function getXML_2():XML{
      var file : ByteArray = new EXAMPLE_XML();
      var str  : String = file.readUTFBytes( file.length );
      var xml  : XML = new XML( str );     
      return xml;
    }

Результат:

Код:

get xml var 1 time : 4894
get xml var 2 time : 5091

если поменять тесты местами, то разрыв больше:

Код:

get xml var 2 time : 5696
get xml var 1 time : 5018


Проводил тест раз 20, чтобы быть уверенным.
Ввиду таких результатов по скорости мне кажется излишним возится с вариантом с ByteArray.

i.o. 08.08.2011 09:24

Вложений: 1
Не заметил таких фатальных провалов.
Вот результат:
Код:

[ 1] Player: [WIN 10.3.181.34 RELEASE]
[ 2]
[ 3] Test started..
[ 4] get xml var 1 time : 13494
[ 5] get xml var 2 time : 13634
[ 6] get xml var 3 time : 10530
[ 7] Test finished.
[ 8]
[ 9] Test started..
[10] get xml var 1 time : 13759
[11] get xml var 2 time : 14040
[12] get xml var 3 time : 10593
[13] Test finished.
[14]
[15] Test started..
[16] get xml var 1 time : 13962
[17] get xml var 2 time : 14306
[18] get xml var 3 time : 10889
[19] Test finished.
[20]
[21] Test started..
[22] get xml var 1 time : 13994
[23] get xml var 2 time : 14086
[24] get xml var 3 time : 10624
[25] Test finished.

Вот тест:
Код AS3:

/**                                                                                                                                                
 * File created: '08.08.2011 8:11 AM'                                                               
 *                                                                                                                                       
 * @author i.o.                                                                                                               
 * @version 1.0                                                                                                               
 */

 
package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.system.Capabilities;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.utils.ByteArray;
        import flash.utils.getTimer;
 
        [SWF(width='800', height='600', scriptTimeLimit='300')]
        public class XmlCreationTest extends Sprite
        {
                [Embed(source = "example.xml", mimeType="application/octet-stream")]
                private static const EXAMPLE_XML_ASSET : Class;
                private static const EXAMPLE_XML_STRING : String = ((new EXAMPLE_XML_ASSET() as ByteArray).readUTFBytes((new EXAMPLE_XML_ASSET() as ByteArray).length));
 
 
                public function XmlCreationTest()
                {
                        if (stage)
                                this._init();
                        else
                                this.addEventListener(Event.ADDED_TO_STAGE, this._init);
                }
 
 
                ///
                private var _txtLog : TextField;
                ///
                private var _logMsgCount : uint = 0;
                ///
                private var _logMsgCountCharWidth : uint = 2;
 
 
                ///
                public function log( msg:String="" ) : void
                {
                        this._logMsgCount++;
 
                        var count:String = "    " + this._logMsgCount.toString();
                        count = count.substr(count.length - this._logMsgCountCharWidth, this._logMsgCountCharWidth);
 
                        this._txtLog.appendText((this._logMsgCount > 1 ? "\n" : "") + "[" + count + "] " + msg);
                }
 
                ///
                private function _init( e:Event=null ) : void
                {
                        this.removeEventListener(Event.ADDED_TO_STAGE, this._init);
                        // entry point
 
                        this.stage.addEventListener(MouseEvent.CLICK, this._test);
 
                        var tf:TextFormat = new TextFormat("Courier New", 11);
                        this._txtLog = new TextField();
                        this._txtLog.x = 10.0;
                        this._txtLog.y = 30.0;
                        this._txtLog.width = 800.0 - 20;
                        this._txtLog.height = 600.0 - 40;
                        this._txtLog.border = true;
                        this._txtLog.defaultTextFormat = tf;
                        this._txtLog.setTextFormat( tf );
                        this.addChild( this._txtLog );
 
                        tf = new TextFormat("Arial", 16, 0xFF0000, true, true);
                        var txtHeader:TextField = new TextField();
                        txtHeader.x = 10.0;
                        txtHeader.y = 3.0;
                        txtHeader.width = 800.0 - 20;
                        txtHeader.height = 30;
                        txtHeader.defaultTextFormat = tf;
                        txtHeader.setTextFormat( tf );
                        txtHeader.text = "Click on screen to start a test.";
                        this.addChild( txtHeader );
 
                        var playerVersion:String = Capabilities.version.replace(/,/g, '.');
                        var playerKind:String = Capabilities.isDebugger ? "DEBUG" : "RELEASE";
                        var playerInfo:String = "[" + playerVersion + " " + playerKind + "]";
 
                        txtHeader.appendText("  " + playerInfo);
                        log("Player: " + playerInfo );
 
                        this._test();
                }
 
                ///
                private function _test( ...args ) : void
                {
                        log();
                        log("Test started..");
 
                        var start  : Number;
                        var now    : Number;
                        var counter : int;
                        var targetLoops:int = 10000;
 
                        // test 1
                        start = getTimer();
                        for(counter = 0; counter < targetLoops; counter++)
                                getXML_1();
                        now = getTimer();
                        log("get xml var 1 time : " + (now - start));
 
                        // test 2
                        start = getTimer();
                        for(counter = 0; counter < targetLoops; counter++)
                                getXML_2()
                        now = getTimer();
                        log("get xml var 2 time : " + (now - start));
 
                        // test 3
                        start = getTimer();
                        for(counter = 0; counter < targetLoops; counter++)
                                getXML_3()
                        now = getTimer();
                        log("get xml var 3 time : " + (now - start));
 
                        log("Test finished.");
                }
 
                ///
                private function getXML_1() : XML
                {
                  return XML(new String(new EXAMPLE_XML_ASSET()))
                }
 
                ///
                private function getXML_2() : XML
                {
                  var file : ByteArray = new EXAMPLE_XML_ASSET();
                  var str  : String = file.readUTFBytes( file.length );
                  var xml  : XML = new XML( str );     
                  return xml;
                }
 
                ///
                private function getXML_3() : XML
                {
                  return new XML(EXAMPLE_XML_STRING)
                }
 
        }
 
}

Вот XML:
Вложение 26895


Часовой пояс GMT +4, время: 01:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.