Объединение возможностей Processing.js и веб-работников - PullRequest
7 голосов
/ 23 августа 2009

Я читал о двух (относительно) новых концепциях в языке Javascript - Web Workers и потрясающем Processing.js Джона Резига (ну, на самом деле, это не совсем новая «концепция Javascript», но вы поняли мою идею). Несколько замечательных примеров того, как оба бродят по интернетам, но мне еще предстоит найти тот, который эффективно использует обе техники. Это выглядит довольно интересно и мощно для меня, поэтому я подумал, что мне лучше попробовать.

Тем не менее, я не могу придумать лучший дизайн сценария для интеграции двух из них ... Мне кажется, что обычно, когда используется Processing.js, некоторые классы определяются в «Обработка-заявка». Это позволяет вам использовать Java-подобный синтаксис для этого. Однако эти классы доступны только в приложении обработки - что очевидно. Но потом у нас есть работники ... В этом удивительном примере объект функции Javascript сначала определяется в отдельном сценарии, и, если желательно использование Worker, сценарий Worker импортирует прототип этого объекта и как бы "болтится" на него.

Мне эти два не кажутся «взаимозаменяемыми» в том смысле, что вы не можете получить доступ к классу, который вы определили в приложении для обработки, когда находитесь в своем рабочем сценарии. Вероятно, по какой-то причине, поскольку классы, подобные обработке, определенно не очень похожи на Javascript. Насколько я вижу, мне придется сделать аналогичное определение класса (в форме нового прототипа функции) в моем рабочем скрипте - что не очень хорошо для удобства сопровождения, и просто кажется ужасно плохим дизайном для меня, хотя я все еще большой новичок на эту тему.

Я что-то пропускаю? Хочу ли я чего-то, чего просто не должно быть? Или я просто неправильно понял некоторые фундаментальные понятия?

Спасибо за помощь!

Edit:

Продолжил пытаться связываться с прототипом Рабочего, чтобы «придать ему форму», как объект, для которого он должен работать, но вскоре понял, что это не тот путь.

Давайте попробуем наброски для работы с: У меня есть класс «Ball», который почти ничего не делает, кроме хранения двумерной позиции. В каждом цикле draw() Processing.js вызывает свой метод update(), который заставляет мяч занять новую позицию. После этого вызывается метод display(), в котором Шар рисует маленький кружок в своей текущей позиции.

Ничего сложного для начала. Теперь предположим, что определение нового местоположения шара - довольно дорогая операция, например, если она включает движение шара через «сложное» гравитационное поле. Если этот расчет должен выполняться каждый раз перед рисованием, это вызовет некоторую задержку. Тем не менее, если вам удастся сделать это одновременно, он может пройти более плавно. Итак, я понял, что мог бы дать классу Ball дополнительный массив 'положений' в своем списке свойств, который будет содержать все его последовательные местоположения. Когда создается экземпляр Ball, он создает нового работника, который начинает вычислять позиции, и каждый раз, когда он завершает одну, он отправляет обратно на Ball сообщение, содержащее новую двумерную позицию. Затем Ball будет помещать этот элемент в свой массив позиций, поэтому каждый раз, когда ему нужно обновить свою позицию, он просто переходит к следующей записи в массиве.

В целом - хорошая или плохая идея? Если хорошо, какие-либо предложения о том, как спроектировать это?

Ответы [ 5 ]

3 голосов
/ 02 сентября 2009

3D симуляторы игровой физики (как на xbox360) обычно работают с фиксированной скоростью, независимо от частоты кадров. Это потому, что физика слишком сложна для аналитического моделирования, поэтому вы выполняете числовые аппроксимации, поэтому вам необходимо детерминистически синхронизировать ошибки. Дополнительным преимуществом является то, что частота кадров не зависит от физических характеристик, поэтому вы можете обновить физику с частотой 5 Гц, интерполировать и т. Д.

Итак, модель, которую вы описываете, именно так и делают профессионалы.

1 голос
/ 06 ноября 2010

вы не можете получить доступ к классу, который вы определили в приложении обработки, когда вы в вашем рабочем сценарии. Вероятно, по причине

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

0 голосов
/ 02 сентября 2009

Эта идея напоминает мне об идее очереди задач Google, интегрированной в Google App Engine.

http://code.google.com/appengine/docs/python/taskqueue/

Это может помочь вам.

Для моей асинхронной настольной онлайн-игры я собираюсь внедрить систему, в которой хранится история сообщений, чтобы игроки могли видеть, что произошло, когда не была их очередь. Каждое происходящее получает уникальный идентификатор, и всякий раз, когда игроку отправляются какие-либо сообщения, он отслеживает последнее полученное сообщение. Затем, когда они возвращаются, они могут увидеть быструю анимацию всего, что произошло из последнего полученного ими сообщения.

И если я доберусь до точки, где мне нужен сервер для обработки чего-либо, пока клиент не ждет, я использую очередь задач

0 голосов
/ 01 сентября 2009

Просто мысль ... но при обработке сигнала вы получаете частоту дискретизации, которая разделяет аналоговый сигнал на цифровую информацию. Ключ заключается в том, чтобы сохранить только достаточное количество сигнала для воссоздания оригинала. Подобно тому, как MP3 копируются из музыкальных файлов с использованием 128, 192 и т. Д.

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

Я знаю, что это не отвечает ни на один из ваших вопросов о Processing.js или Web Workers. Просто идея помочь вам выполнить эти вычисления более эффективно.

0 голосов
/ 25 августа 2009

В этом примере расчет позиций должен быть закончен до рисования мяча - так что асинхронная обработка не имеет смысла?

Сам p5 очень синхронный - есть один центральный метод draw , который выполняет все рисование.

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

Для более сложных приложений, основанных на событиях, таких как игра, могут использоваться веб-работники.

...