-
Lua AI 스크립트 호출에 따른 오버헤드카테고리 없음 2025. 3. 24. 18:02
1. Lua 호출 오버헤드
C++에서 Lua 함수를 호출할 때마다
- Lua 스택 조작
- C++ <-> Lua 간 데이터 변환
- 함수 실행 후 결과 반환
이런 과정이 필요해서 네이티브 C++ 코드보다 훨씬 느려질 수 있어. 특히 AI 스크립트처럼 짧고 자주 실행되는 함수라면 이 오버헤드가 누적되면서 성능에 영향을 미칠 거야.
2. 오브젝트 순회 & Lua 호출이 섞이면 캐시 미스 발생
MMORPG 월드에서는 많은 오브젝트(NPC, 몬스터 등)를 순회하면서 AI 로직을 실행해야 해.
- C++에서 오브젝트 순회를 하면 CPU 캐시에 맞게 정렬된 데이터를 빠르게 처리할 수 있지만
- 순회 중에 Lua 함수를 호출하면
- C++에서 Lua VM으로 컨텍스트 스위칭
- Lua 메모리(Heap 할당) 접근
- Lua 내부의 가비지 컬렉션(GC)
이런 일들이 일어나면서 CPU 캐시 효율이 떨어지고, 전체적인 실행 속도가 느려질 수 있어.
3. Lua의 싱글스레드 한계 & 병렬 처리 문제
Lua 자체가 기본적으로 싱글스레드라서, AI 스크립트를 병렬로 실행하기 어려운 점도 있어.
- MMORPG는 수백~수천 개의 NPC AI가 동시에 동작해야 하는데,
- C++에서는 여러 개의 스레드로 분산할 수 있지만
- Lua 호출이 많으면 결국 Lua VM에서 병목이 발생할 수 있어.
어떻게 최적화할 수 있을까?
- Lua 호출 빈도 최소화
- 매 프레임마다 Lua를 호출하지 말고, 일정 주기(예: 500ms마다)로 호출
- AI 상태가 바뀔 때만 Lua 스크립트를 실행
- Lua에서 로직을 최대한 처리하고, C++ 호출 최소화
- 예를 들어, C++에서 isEnemyNearby() 같은 정보를 매번 가져오는 대신,
- Lua가 한 번에 여러 개의 데이터를 가져와서 자체적으로 판단
- C++에서 기본적인 AI 로직을 처리하고, Lua는 고수준 의사 결정만 담당
- C++에서 경로 찾기, 물리 연산 등 성능이 중요한 부분을 처리
- Lua는 "어디로 이동할지" "공격할지 도망칠지" 같은 결정만 수행
- Lua 코루틴 활용
- AI가 일정 시간 동안 실행되는 경우, 코루틴을 사용해서 한 번에 많은 NPC가 Lua를 호출하지 않도록 스케줄링
- Lua JIT 사용 검토
- 일반적인 Lua 인터프리터보다 JIT(Just-In-Time) 컴파일러를 사용하면 성능이 좋아질 수 있음
- 하지만 C++과의 연동 방식에 따라 오버헤드가 남을 수 있어서 테스트 필요
결론
네, C++의 오브젝트 순회 + Lua AI 호출 조합은 성능 저하를 일으킬 가능성이 커. 특히 MMORPG 같은 대규모 시스템에서는 Lua 호출 오버헤드가 쌓이면 심각한 병목이 될 수 있어.
그래서 Lua 호출 최소화 + C++에서 기본 AI 처리 + 코루틴 활용 같은 최적화 전략을 잘 짜야 해.몬스터, NPC 별로 tick 주기를 결정
예) 보스 몬스터 16ms, 일반 NPC 500ms 🚀