Oszem, według mojej wiedzy jest zasobożerne.
Ja znalazłem na to dwa rozwiązania w swoim projekcie.
a) zmiana collision_circle na collision_rectangle - Wiem, że nie zawsze jest to możliwe, ale np. jeśli robisz pole widzenia przeciwnika, to czy circle czy rectangle, efekt jest bardzo do siebie podobny. ( u mnie przy 100 obiektach to uzyskanie 1000fps więcej... dużo.)
b) To co najbardziej zwiększa wydajność, to przerzucenie tej funkcji na ten "konkretny typ obiektu" który ma Ci znaleźć. Przykład:
- masz 100 przeciwników którzy patrolują teren i sprawdzają czy widzą obiekt gracza np. oPlayer, a więc masz 100 razy collision_circle. Możesz odwrócić sytuacje i to graczowi dać collision_circle czy widzi przeciwników, jeśli tak, zrób np. oEnemy.widze_gracza = true; Wtedy collision_circle występuje tylko 1 raz;
Pamiętaj, że zawsze możesz zrobić rodzica obiektów, np. nie musisz pisać
collision_circle_list(x, y, 100, oEnemy1);
collision_circle_list(x, y, 100, oEnemy2);
collision_circle_list(x, y, 100, oEnemy3);
collision_circle_list(x, y, 100, oEnemy4);
tylko wrzucić jako child do pustego obiektu, np. oEnemies
i wtedy
collision_circle_list(x, y, 100, oEnemies);
PS: Listę tworzymy w create, jeśli damy to w innym miejscu, step czy draw, będzie się ona tworzyć bez końca aż zapełni całą pamięć RAM. Tworzenie jej w step i od razu niszczenie jej przy pomocy ds_list_destroy(), kiedy już zrobi swoje, też negatywnie wpływa na fps;