Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.05.2010, 19:18
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 1  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Question Интерфейс передачи данных: сервер -> флэш

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

Думаю, почти все скажут, что да, сервер важнее, поэтому приведу конкретный пример: сервер, написанный на си-шарпе, выбирает данные из базы данных, формирует свои классы и делает серриализацию в xml. На выходе получается что-то типа:
Код:
<object>
  <properties>
    <property name="posX" value="10"/>
    <property name="posY" value="20"/>
    <property name="name" value="vasya"/>
  </properties>
</object>
Так вот, парсить такое добро не очень удобно, так-как приходиться делать цикл for each, перебирающий все узлы properties, в котором реализован switch, определяющий, что если имя равно posX, то мы присваиваем координату объекта, если имя равно name, то присваиваем имя и т.д.
Я сколняюсь к варианту:
Код:
<object>
  <properties posX="10" posY="20" name="vasya">
  </properties>
</object>
таким образом проще получить доступ к этим данным:
Код AS3:
pos.x = String(data.@posX);
pos.y = String(data.@posY);
name = String(data.@name);
Но человек, пишущий сервер аргументирует, что если он откажется от стандартной серриализации и будет писать формирования xml вручную, это понизит быстродействие сервера.

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

Старый 26.05.2010, 19:38
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Вопрос небольшой - а зачем вам вообще нужен XML в данном случае? Получается, что сперва сервер у вас "выбирает данные из базы данных", формирует XML, а потом этот XML надо еще парсить, то есть теперь уже разбирать.
Может быть я что-то не понимаю? Разве нельзя данные сразу клиенту отдавать?

Старый 26.05.2010, 21:13
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 3  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
а может компромисс?
Код AS3:
<object>
  <properties>
    <posX value="10"/>
    <posY value="20"/>
    <name value="vasya"/>
  </properties>
</object>
или тогда:
Код AS3:
<object posX="10" posY="20" name="vasya"/>
Кстати что-то ваш серверный программист темнит) вывести данные в виде атрибутов а не отдельных нодов никак нельзя назвать "ручным" выводом и на быстродействие никак не скажется.
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 26.05.2010 в 21:17.
Старый 27.05.2010, 00:05
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 4  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
+1 )))
темнит серверный программер
либо лень 20 строчек кода подправить, либо написано так, что он боится это трогать

но с философской точки зрения лишними расчетами сервер лучше не загружать
(например, если игровое время хранится как целое в секундах, то переводить его в удобоваримый вид для выдачи пользователю лучше на клиенте, а не на сервере)

но это не рассматриваемый случай

Старый 27.05.2010, 13:18
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 5  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Цитата:
Сообщение от mooncar Посмотреть сообщение
Вопрос небольшой - а зачем вам вообще нужен XML в данном случае? Получается, что сперва сервер у вас "выбирает данные из базы данных", формирует XML, а потом этот XML надо еще парсить, то есть теперь уже разбирать.
Может быть я что-то не понимаю? Разве нельзя данные сразу клиенту отдавать?
Ну, нам же нужно в каком-то виде передавать данные: простой GET-строкой, в виде xml или JSON, либо бинарные данные по сокету... В нашей реализации вся динамика передается по сокету, а статика - инициализация игровых объектов и собственно игрового уровня на их основе - одним POST-запросом, в виде xml-дерева.

Цитата:
Сообщение от Котяра Посмотреть сообщение
а может компромисс?
Код AS3:
<object>
  <properties>
    <posX value="10"/>
    <posY value="20"/>
    <name value="vasya"/>
  </properties>
</object>
или тогда:
Код AS3:
<object posX="10" posY="20" name="vasya"/>
Кстати что-то ваш серверный программист темнит) вывести данные в виде атрибутов а не отдельных нодов никак нельзя назвать "ручным" выводом и на быстродействие никак не скажется.
Компромисс замечательный и вполне логичный, но в таком виде данные в си-шарпе серриализовать не получиться, а прийдется ручками писать модуль, который эти данные упаковывает в данной формат - и как итог, лишняя нагрузка на сервер, т.к. придется самостоятельно собирать xml-строку (я так это понял). Хотя что же это за серверная технология, который не умеет быстро производить конкатенацию строк... тут и PHP сгодился бы... (

Старый 27.05.2010, 14:50
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 6  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Вас дурят. ))

Вот здесь на пальцах расписана сериализация на дот.нет'е
http://www.realcoding.net/articles/x...ps-tricks.html

Серверный программист взял самый простой способ сериализации - это да.
То что сериализация с использованием атрибутов существенно увеличит нагрузку на сервер - имхо, глупость несусветная.

Старый 27.05.2010, 14:51
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 7  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
http://www.realcoding.net/articles/x...ps-tricks.html
2 вида сериализации:
Код AS3:
<DataClass >
  <Name>Just Name</Name>
</DataClass>
и
Код AS3:
<Data Name="Just Name"/>
UPD: блин.. опередили)
одним гуглом пользовались)
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 27.05.2010 в 14:57.
Старый 27.05.2010, 15:02
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 8  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
)))))))
я пользовался "негуглом", но сути это не меняет ))

Старый 27.05.2010, 16:31
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 9  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
За ссылку по серриализации спасибо - врага нужно знать в лицо ))))
Я, пожалуй, не совсем верно выразился:
дело в том, что элемент
Код:
  <properties>
    <property name="posX" value="10"/>
    <property name="posY" value="20"/>
    <property name="name" value="vasya"/>
  </properties>
получается в следствии того, что это серриализованный массив, т.е. на стороне сервера политика такая: база данных должна масштабироваться "вдоль и поперек", все свойства объектов - могут быть в любой момент добавлены или, наоборот, удалены, поэтому серверный класс-обертка, который получает данные из базы, без разбору набивает ими массив properties, и отдает их серриализованный вариант флэш-клиенту. С моей же стороны, конкретный объект обладает вполне конкретными свойствами, которые я ожидаю получить, т.е. если это "ОсновнойОбъектМира" - я должен получить его ширину, высоту и т.д., если это "Персонаж" - в добавок к ширине и высоте мне нужен список его анимаций и т.д.

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

Старый 27.05.2010, 16:56
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 10  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
это ничего не меняет (почти ничего)
серверному программисту надо правильным образом указать [XmlAttribute] в этом "одном-на-все-случаи-жизни" классе и все.

Получите все пропертис не в виде нодов, а в виде атрибутов. Одним из атрибутов, очевидно, будет тип объекта, чтобы было понятно, что с этим всем делать.

Там в примере все написано:

Код:
public class DataClass
{
    public DataClass(){}
    public string ID = Guid.NewGuid().ToString();
    public string Name = "Just Name";
    public Decimal Count = 10;
    public DateTime Date = DateTime.Now;
}
дает

Код:
<?xml version="1.0" encoding="utf-8"?>
<DataClass xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ID>34332413-e70f-44f7-b35c-b34c47812dbc</ID>
  <Name>Just Name</Name>
  <Count>10</Count>
  <Date>2006-10-30T12:35:20.3110319+03:00</Date>
</DataClass>
а всего навсего указание [XmlAttribute]:

Код:
[XmlRoot("Data")] // изменим имя корневого элемента
    public class DataClass
    {
           public DataClass(){}

           [XmlAttribute] // сериализуем в xml атрибут 
           public string ID = Guid.NewGuid().ToString();

           [XmlAttribute] // сериализуем в xml атрибут 
           public string Name = "Just Name";

           [XmlElement("Reserved")] // изменим имя xml элемента
           public Decimal Count = 10;

           [XmlIgnore] // не будет сериализоваться
           public DateTime Date = DateTime.Now;
    }
кардинально меняет картину:

Код:
<?xml version="1.0" encoding="utf-8"?>
<Data xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="cc340d5e-4c80-4fe5-9c3d-e49f64e26b22" Name="Just Name">
  <Reserved>10</Reserved>
</Data>


Последний раз редактировалось mikhailk; 27.05.2010 в 16:58.
Создать новую тему Ответ Часовой пояс GMT +4, время: 20:35.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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