2010-04-22 3 views
5

나는 게임을위한 몇몇 스크립트를 작성해 왔으며 스크립트는 루아로 작성되었습니다. 게임에 필요한 요구 사항 중 하나는 게임이 멈 추면 루아 스크립트 (모든 프레임이라고 함)의 Update 메소드가 실행하는 데 약 2 ~ 3 밀리 초가 걸리지 않을 수 있다는 것입니다.루아 태스크 스케줄링

나는 coroutines로이 문제를 해결했다. 내가해야할 것은 Multitasking.RunTask (SomeFunction)를 호출 한 다음이 작업을 coroutine으로 실행하고, 그 다음에 코드를 통해 Multitasking.Yield()를 분산시켜야한다. 오래 작업이 실행되고 있고 2ms 이상이면 작업을 일시 중지하고 다음 프레임을 다시 시작합니다. 다행히 멀티 태스킹을해야한다는 것을 제외하고는 괜찮습니다. 내 코드 전체에 걸쳐 도처에이 있습니다.

이상적으로는 너무 오래 실행하면 내 코드가 자동으로 생성됩니다. 그럼, 인수로 루아 함수를 취할 수 있으며, 줄 단위로 실행할 수 있습니까 (어쩌면 내가 아는 루아 내부 루아 해석 아마도 어쩌면 당신이 가지고있는 모든 경우 함수 포인터입니다) 의심? 이런 식으로 모든 단일 라인 사이에서 필요한 경우 런타임 및 출력을 자동으로 확인할 수 있습니다.

편집 : 분명히하기 위해 게임을 개조하고 있습니다. 즉, 루아에 대한 액세스 권한 만 있습니다. C++ 트릭이 허용되지 않습니다.

답변

5

lua_sethookDebug Interface에 체크하십시오.

+0

C++ 소스에 액세스해야하는 것처럼 보입니까? – Martin

+0

C 언어가 아닌 C++ – Javier

+2

'debug' 라이브러리는 루아에서 내보내집니다. 루아에서'debug.sethook()'를 직접 호출 할 수있다. –

1

실제로이 솔루션을 직접 사용해 본적이 없으므로 제대로 작동하는지 잘 모릅니다.

debug.sethook(coroutine.yield,"",10000); 

임의로 번호를 선택했습니다. 그것은 대략 당신이 필요로하는 시간 제한까지 비틀어 져야 할 것입니다. C 함수 등에서 보낸 시간은 명령 카운트 값을 증가시키지 않으므로 루프가 장기 실행 C 함수를 호출 할 때보 다 훨씬 빠르게이 제한에 도달합니다. 훨씬 더 낮은 값을 설정하고 대신 os.clock() 또는 유사한 것이 증가한 것을 보는 함수를 제공하는 것이 가능할 수 있습니다.

+0

아마도 가장 우아한 해결책 일 것입니다. (사실, 원래 이것을 시도했지만) 불행히도 효과가 없습니다. 이 토론 참조 http://lua-list.2524044.n2.nabble.com/embedded-lua-in-web-based-REPL-td4766017.html – AlexWebr