Приложение Silverlight не простаивает при использовании асинхронного AJAX - PullRequest
0 голосов
/ 15 июня 2011

В настоящее время я работаю с приложением Silverlight 5, которое поддерживает двустороннюю связь между собой и JavaScript.Приложение Silverlight отвечает за рендеринг 3D-контента, а JavaScript - за сбор и подготовку данных для рендеринга.

Проблема, с которой я столкнулся, заключается в том, что DrawingSurface Silverlight 5 перерисовывается только после того, как DrawingSurfaceстановится недействительным, и приложение становится бездействующим.К сожалению, при загрузке данных, которые мне требуются, с сервера с использованием асинхронных запросов AJAX, DrawingSurface не перерисовывается, пока не будут загружены все данные (несмотря на аннулирование DrawingSurface после загрузки каждого фрагмента данных).

Я понимаю это, но меня смущает то, что когда я выполняю точно такой же стиль асинхронных запросов на загрузку с использованием WebClient в Silverlight, DrawingSurface успешно перерисовывается после большинства вызовов аннулирования.

ПервоначальноЯ думал, что это может быть связано с какой-то проблемой с потоками, но все вызовы (и обратные вызовы) работают в одном потоке.Я попытался использовать как AQAX API jQuery, так и написать свой собственный обработчик XmlHttpRequest на JavaScript;но я получаю одинаковый результат в обоих направлениях.Первоначально я заметил, что jQuery возвращал данные в том же порядке, в котором я их запрашивал (тогда как в Silverlight WebClient этого не было), что и привело меня к созданию моего собственного обработчика XmlHttpRequest, так как я думал, что переупорядочение могло вызвать скриптоставаться активным во время асинхронных вызовов.

Кто-нибудь имел эту проблему раньше и / или у кого-нибудь есть предложения по обходным путям / исправлениям?

1 Ответ

0 голосов
/ 15 июня 2011

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

Не забывайте в любом случае, что логика рендеринга выполняется в своем собственном потоке: вам придется соответствующим образом заблокировать ваши общие экземпляры.

public void Draw(object sender, System.Windows.Controls.DrawEventArgs e)
{
   var device = e.GraphicsDevice;


   device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, new Color(0, 0, 0, 0f), 

   //Drawing logic.
   [...]

   e.InvalidateSurface();


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...