Многопоточная физика -- не совсем халява

Всё-таки переход на многопоточную физику дался не так легко, как это изначально показалось.

Проблема возникла с near-callback (т.е. callback который вызывается для каждой пары объектов которые уже точно столкнулись) — он использовался для "on__pre_collision" event'ов, по которым некоторые Actor'ы делали всякую работу (подбираемые предметы типа монеток и бросаемые штуки типа ракет или пушечных ядер).


Первая проблема в том, что near-callback вообще не вызывался в много-поточной версии, что в-общем логично — код CollisionDispatcher основан на SpuGatheringCollisionDispatcher, а с SPU никаких callback'ов на PPU особо не повызываешь.


Вторая, более существенная проблема, в том, что даже если раскомментировать вызов callback'а и оно начнёт работать, то overhead убивает почти всю выгоду от многопоточности (да ещё глюков может добавится), т.к. callback будет вызываться из разных потоков и работать с "глобальными" данными физики и игры (плюс ещё дополнительные тормоза на guard в виде mutex'а или critical section).

В итоге, пришлось полностью отказаться от модели event'ов и использовать phantom'ы (ghost-object в терминах Bullet). 

Весь функционал полностью сохранился; в одном месте пришлось добавить лишний ray-test при collision'е с tri-mesh'ем — весьма небольшая цена за многопоточность, как по мне.

Последняя правка: пт, 04/11/2011 - 21:10
Submitted by BLK Dragon on

Комментарии

а тесты что показали?

Submitted by alkemist on
alkemist wrote:

а тесты что показали?

4ms

Submitted by BLK Dragon on

GameDev.by