Оптимизация интерактивности
25.09.2007 Антон ВолковХочу поделиться подходом к оптимизации интерактивности 3D-объектов. Когда-то, ещё во второй версии 3D-движка, мы использовали стандартные MouseEvent для получения мышиных событий на 3D-объектах. Однако, проэкспериментировав с 1-2 тысячами граней, когда каждая является слушателем событий, мы убедились в несовершенности и перегруженности стандартного механизма рассылки мышиных событий. FPS при перемещении мышью над объектами падал с 100 до 50.
Смириться с этим мы не могли, поэтому решили делать собственную систему 3D-событий. Суть её сводится к тому, что все полигоны являются обычными Shape (что, кстати, опять же даёт некоторый прирост производительности), а на камере есть хит-область. При получении мышиного события на этой области мы математически анализируем, какие полигоны входят в этот сектор (см. пример карты границ). Далее, анализируя геометрию, находим ближайший полигон и далее по формуле плоскости ищем пересечение луча из точки мыши до выбранного полигона. В итоге получаем честные 3D-координаты мыши. При этом производительность не пострадала ни на FPS.


