Skip to main content
인싸 알고리즘
(Flocking Algorithm)
DevRookie JINN
Flocking Algorithm = 인싸 알고리즘
이 알고리즘만 알면 나도 인싸?
• Flocking 알고리즘
동물들의 집단 움직임을 구현한 알고리즘
Boid
Flock
Boid
- 무리(Flock)를 이루는 개별 구성 요소
인싸 3요소
1. 응집 ( Cohesion )
2. 정렬 ( Alignment )
3. 분리 ( Separation )
세가지 행동 규칙(Step)으로 속도를 만들어낸다
1. 응집 ( Cohesion )
• 주변의 이웃 곁으로 가려는 성질
자신의 인식 반경 안에 있는 이웃 보이드들의 무게중심으로 이동
Cohesion(이웃들)
{
for(이웃들)
{
if (거리 (내 위치, 이웃 위치) < 응집영역범위)
{
vector += 이웃 위치
++count
}
}
if(count > 0)
{
return vector /= count;
}
else
{
return zero vector;
}
}
2. 정렬 ( Alignment )
• 주변의 보이드와 같은 방향을 향하려는 성질
인식 반경 내의, 이웃 보이드들 속도의 평균
속도 = (방향 * 힘) 이므로
이웃의 속력이 빠를 수록 정렬하려는 힘도 커짐
Align(이웃들)
{
for (이웃들)
{
if (거리(내 위치, 이웃 위치) < 응집영역범위)
{
vector += 이웃 속도
count++
}
}
if(count > 0)
{
return vector / count
}
else
{
return zero vector
}
}
3. 분리 ( Separation )
• 이웃 보이드와 거리를 두려는 성질
인식 반경 내로 이웃 보이드 진입시
이웃의 반대 방향으로 힘이 작용
분리 인식 반경이 응집 반경보다 클 경우,
이웃을 모두 배척하는 아싸 보이드가 되기 때문에 주의
Separation(이웃들)
{
for (이웃들)
{
if (거리(내 위치, 이웃 위치) < 분리 영역범위)
{
vector += (내위치 - 이웃 위치).normalize() / 거리
count++
}
}
if(count > 0)
{
return vector / count
}
else
{
return zero vector
}
}
• 3요소를 모두 결합해봅시다
Steer(deltaTime)
{
velocity += Flock()
location += (velocity * deltaTime)
}
Flock()
{
이웃들 = GetCollideBoid()
steer += Separation(이웃들) * 분리 가중치
steer += Align(이웃들) * 정렬 가중치
steer += Cohesion(이웃들) * 응집 가중치
return steer
}
문제점
• 보이드의 시야
• 영향도 수정
• 장애물 회피
• 성능 이슈
Flocking Algorithm -2-
플로킹 프로젝트 개선
DevRookie JINN
지난번 발표했던
Flock Algorithm을 구현한 프로젝트
300마리 이상 생성했을 때
에디터상에서 30프레임을 겨우 유지
성능이 심하게 떨어진다….
이것이 바다다!! 희망편
현실
사실 해보고 싶은 것은 이런 느낌이었다…
이대론 안된다 개선해보자!!
Stat Unit
Stat Game
UpdateOverlaps Time
PerformOverlapQuery Time
이름만봐도 충돌체 처리하는 부분…
단순한 구형 충돌체가 달려있을 뿐어서
솔직히 이렇게 비용이 비싼건 생각보다 의외…
콜리전 셋팅을 보니 비용이 비쌀 수밖에 없었다
발표용 프로젝트라 따로 설정을 안해줬었음
애초에 근처 다른 보이드 체크 용도의 콜리전이기때문에
Pawn을 제외한 다른 채널들은 모두 꺼주고
콜리전 범위도 어느정도 줄여줌
단순히 콜리전 설정 변경만으로도 유의미한 변화
Frame 30FPS -> 60FPS
UpdateOverlaps Time 12.3ms -> 2.53ms
PerformOverlapQuery Time 9.3ms -> 2.28ms
좁은 공간에 많은 보이드를 스폰시킬때도
프레임이 급락
스폰 범위를 넓혀 스폰 시점에
너무 많이 오버랩 되지 않도록 변경
이제 1000마리 40프레임 유지
참고자료
• http://dogfeet.github.io/articles/2012/flocking-algorithm.html
• https://www.youtube.com/watch?v=mhjuuHl6qHM
• https://www.red3d.com/cwr/boids/ &t=1561s