Распределение потоков в Box2D с pthreads

Итак, я, по сути, пытаюсь реализовать собственное расширение AIR, которое выполняет симуляцию физики на языке C с интерфейсами через ActionScript.

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

В конечном счете, мне нужна помощь в настройке среды потоков для запуска моделирования Box2D в отдельном потоке и последующего опроса состояния в AS3.

Методы:

  1. Грубая сила:

В этом методе я просто вызываю C из AS3 и говорю ему создать мир и передать ему несколько полей, чтобы добавить в этот мир. Каждый кадр в AS3 я вызываю в C, чтобы сообщить миру о шаге, затем перебираю все тела в мире, получаю их положение и поворот, конвертирую их в объекты ActionScript и помещаю их в массив ActionScript, а затем отправляю это обратно в AS3. Оказавшись там, я перебираю возвращаемый массив и назначаю эти значения положения и поворота своим спрайтам, чтобы они визуально обновлялись.

Результаты на самом деле вполне приличные: добавлено около 116 блоков до того, как пострадает частота кадров. Это по сравнению с 30 блоками в чистой реализации AS3. Обратите внимание, что эта статистика находится в режиме отладки. В режиме выпуска они оба доживают до 120 ящиков. Существует небольшая разница между реализацией AS3 и реализацией собственного расширения.

  1. Совместное использование массива ByteArray

Для повышения производительности я решил, что было бы неплохо попытаться ограничить объем данных, маршалируемых между C и AS3. ANE поддерживает совместное использование пространства памяти байтового массива, поэтому я бы отправил ByteArray, созданный в AS3, на C, а C просто обновил ByteArray.Это избавляет нас от необходимости создавать объекты AS3 в C и передавать их обратно. В каждом кадре AS3 просто нужно перебирать его ByteArray и видеть, что C написал в него, а затем присваивать эти значения спрайтам для установки визуального состояния.

Результаты здесь, к сожалению, примерно такие же. Улучшения незначительны.

  1. Прямая установка объекта из C

Еще одна вещь, на которую способны ANE, - это установка свойства объекта, который находится в AS3. В этом смысле я стремился устранить накладные расходы, связанные с передачей данных обратно в AS3, циклическим просмотром тел для сбора данных в C и циклическим просмотром в AS3 для присвоения значений. Я напрямую изменил код Box2D, чтобы при изменении его значений он записывал новые значения поворота x, y, непосредственно в соответствующий Sprite.

Результаты потрясающие при очень небольшом количестве объектов, поскольку вызов для установки этих свойств занимает меньше миллисекунды. Проблема в том, что это линейно масштабируется и составляет около 90 объектов, накладные расходы слишком велики, и все начинает замедляться.

  1. Threading

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

Очевидно, нужно пойти на компромисс, поэтому мое текущее решение - лучшее, что я могу придумать на данный момент.

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

На стороне C создается мир и создается новый поток pthread для выполнения этого шага. По сути, моделирование мира в другом потоке.После этого он собирает все данные и записывает их в двойной массив. Затем это происходит снова, и снова, и снова. Он просто вечно симулирует в своем собственном потоке.

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

То же самое, когда мы вызываем для обновления значений в AIR, я хочу сделать memcpy из массива двойников в мой массив байтов AS3, а затем пройти через массив байтов, чтобы установить значения в визуале.

Мьютексы доставляли мне проблемы, поэтому я в основном реализовал свой собственный, который вы можете видеть ниже ... и смеяться над:)

Однако он работает, но не так быстро, как мне бы тоже хотелось. Около 90-х мы снова притормаживаем.

У кого-нибудь есть мысли или указания? Было бы очень признательно!

Код C

Парсер работал некорректно, поэтому я вставил его сюда: http://pastebin.com/eBQGuGJX

Код AS3

То же самое с парсером. Я только включил соответствующий метод обработки каждого кадра в AS3. http://pastebin.com/R1Qs2Tyt

5
задан Jon 2 March 2012 в 03:05
поделиться