Весь код, который я пишу (C++ или AS3), написан в значительной степени (JSON или XML). Моя проблема в том, что синтаксический анализ может быть очень медленным время от времени, особенно с менее мощными устройствами, такими как мобильные телефоны.Сценарий для двоичного преобразования и сериализации объектов
Вот пример Flash-скрипт шахты:
<players class="fanlib.gfx.TSprite" vars="x=0|y=-50|visible=Bool:true">
<player0 class="fanlib.gfx.TSprite" vars="x=131|y=138">
<name class="fanlib.text.TTextField" format="Myriad Pro,18,0xffffff,true,,,,,center,,,,0" alignX="center" alignY="bottom" filters="DropShadow,2" vars="background=Bool:false|backgroundColor=0|embedFonts=Bool:true|multiline=Bool:false|mouseEnabled=Bool:false|autoSize=center|text=fae skata|y=-40"/>
<avatar class="fanlib.gfx.FBitmap" alignX="center" alignY="center" image="userDefault.png"/>
<chip class="fanlib.gfx.FBitmap" alignX="center" alignY="center" image="chip1.png" vars="x=87|y=68"/>
<info class="fanlib.text.TTextField" format="Myriad Pro,18,0xffffff,true,,,,,center,,,,0" alignX="center" alignY="top" filters="DropShadow,2" css=".win {color: #40ff40}" vars="y=40|background=Bool:false|backgroundColor=0|embedFonts=Bool:true|multiline=Bool:false|mouseEnabled=Bool:false|autoSize=center"/>
</player0>
<player1 class="Copy:player0" vars="x=430|y=70">
<chip class="Child:chip" image="chip2.png" vars="x=-82|y=102"/>
</player1>
<player2 class="Copy:player0" vars="x=778|y=70">
<chip class="Child:chip" image="chip3.png" vars="x=88|y=103"/>
</player2>
<player3 class="Copy:player0" vars="x=1088|y=137">
<chip class="Child:chip" image="chip4.png" vars="x=-111|y=65"/>
</player3>
<player4 class="Copy:player0" vars="x=1088|y=533">
<chip class="Child:chip" image="chip5.png" vars="x=-88|y=-23"/>
</player4>
<player5 class="Copy:player0" vars="x=585|y=585">
<chip class="Child:chip" image="chip6.png" vars="x=82|y=-54"/>
</player5>
<player6 class="Copy:player0" vars="x=117|y=533">
<chip class="Child:chip" image="chip7.png" vars="x=85|y=-26"/>
</player6>
</players>
Сценарий выше создает «родной» (как в «нединамических») объектов флэш. TSprite является потомком Sprite, FBitmap наследуется от Bitmap и т. Д. При 71 КБ, для анализа на Sony XPeria требуется несколько десятков секунд.
Вместо того, чтобы оптимизировать синтаксический анализатор (который, вероятно, не будет слишком сильно увеличиваться), я рассматриваю преобразование своих сценариев в двоичные файлы, так что скрипты будут использоваться для отладки и завершенных двоичных файлов для выпускаемого кода.
Вопрос в том, как обрабатывать указатели с одного объекта на другой при их сериализации? Как переводчики из памяти в формат файла, совместимого с файлом, а затем обратно в память?
Другой вопрос, что относительно «вложенных» объектов? Например, во Flash объект может быть графическим контейнером других объектов. Может ли такое состояние быть сериализовано? Или объекты должны сохраняться отдельно и при загрузке с диска добавляются родителям через функции вложенности (т. Е. AddChild и т. Д.)?
Если возможно, я бы предпочел общие рекомендации, которые могут применяться к языкам, отличным от C++ или AS3.
«Разбор занимает десятки секунд» означает буквально просто синтаксический анализ? Или включая создание объекта, как оно идет? Мы анализируем аналогичную сумму (возможно, немного больше) на мобильных устройствах, а время разбора на порядок быстрее. Это делает меня подозрительным в том, что делает ваш парсер. – AndySavage
Вы правы, я имею в виду время, потраченное на всю судьбу. Плюс это быстрее, чем я изначально рассчитывал, но мой вопрос все еще остается. В конце концов, сериализация также должна ускорить создание объекта, поскольку они предварительно созданы ... или что-то в этом роде. –
Я не согласен с вашим последним заявлением. Сериализация не имеет ничего общего со скоростью. Обычно это медленнее, чем создание объектов изначально, поскольку оно не должно обрабатывать служебные данные и (как правило) затраты на отражение. Единственным исключением из этого было бы создание объектов, которые были бы интенсивно вычислялись после вычисления, но это очевидно. Сколько объектов создается ваш скрипт 10s? Знаете ли вы, какие из них медленнее других? Я бы начал здесь. Либо посмотрите, как это исправить, либо, может быть, посмотрите на ленивый init некоторых из этих объектов, если это подходит. – AndySavage