ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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에서 병목이 발생할 수 있어.

    어떻게 최적화할 수 있을까?

    1. Lua 호출 빈도 최소화
      • 매 프레임마다 Lua를 호출하지 말고, 일정 주기(예: 500ms마다)로 호출
      • AI 상태가 바뀔 때만 Lua 스크립트를 실행
    2. Lua에서 로직을 최대한 처리하고, C++ 호출 최소화
      • 예를 들어, C++에서 isEnemyNearby() 같은 정보를 매번 가져오는 대신,
      • Lua가 한 번에 여러 개의 데이터를 가져와서 자체적으로 판단
    3. C++에서 기본적인 AI 로직을 처리하고, Lua는 고수준 의사 결정만 담당
      • C++에서 경로 찾기, 물리 연산 등 성능이 중요한 부분을 처리
      • Lua는 "어디로 이동할지" "공격할지 도망칠지" 같은 결정만 수행
    4. Lua 코루틴 활용
      • AI가 일정 시간 동안 실행되는 경우, 코루틴을 사용해서 한 번에 많은 NPC가 Lua를 호출하지 않도록 스케줄링
    5. Lua JIT 사용 검토
      • 일반적인 Lua 인터프리터보다 JIT(Just-In-Time) 컴파일러를 사용하면 성능이 좋아질 수 있음
      • 하지만 C++과의 연동 방식에 따라 오버헤드가 남을 수 있어서 테스트 필요

    결론

    네, C++의 오브젝트 순회 + Lua AI 호출 조합은 성능 저하를 일으킬 가능성이 커. 특히 MMORPG 같은 대규모 시스템에서는 Lua 호출 오버헤드가 쌓이면 심각한 병목이 될 수 있어.
    그래서 Lua 호출 최소화 + C++에서 기본 AI 처리 + 코루틴 활용 같은 최적화 전략을 잘 짜야 해.

    몬스터, NPC 별로 tick 주기를 결정

    예) 보스 몬스터 16ms, 일반 NPC 500ms 🚀

Designed by Tistory.