2009-09-05 2 views
6

여러분, 루아 주를 복제 할 수있는 방법이 있습니까?클로닝 루아 주

내 게임 응용 프로그램에서 루아 가상 머신의 초기화 절차는 꽤 무거웠습니다 (많은 스크립트가 한 번에로드되기 때문에 약 1 초). 각 자율 에이전트에 대해 별도의 Lua VM을 보유하고 에이전트가 생성되면 Lua 초기화가 FPS에 심각한 영향을 미칩니다.

다음 스키마에 대해 생각하고 있습니다. "preforked"Lua 상태를 각 에이전트에 대해 단순히 복제하는 것은 어떻습니까? 가능한가?

+2

많은 사람들이 루아를 잘못 작성합니다. 머리 글자가 아닙니다. 위의 내용을 표준 명명법을 따르도록 친절하게 수정 해 주시겠습니까? 우리는 PYTHON도 쓰지 않습니다. 루아는 세 글자로 된 이름입니다. 참조 : http://www.lua.org/about.html – akauppi

+3

아, 죄송합니다. 머리를 가져 주셔서 감사합니다. – pachanga

+0

혹시 이것을 할 방법을 찾았습니까? – DShook

답변

4

완전히 별도의 VM 대신 각 자치 에이전트에 루아의 coroutine을 사용하는 것을 고려하고 싶습니다. 코 루틴은보다 가벼운 솔루션이지만 응용 프로그램에 적합하지 않을 수 있습니다.

아키텍처를 변경할 수없는 경우 LuaJIT을 시도해보십시오. 그것은 당신의 목적을 위해 충분히 빨리 초기화 할 수 있습니다.

추가 옵션 :

  1. Rings : "반지 새로운 루아를 만들 수있는 방법을 제공하는 라이브러리 루아 내에서 상태이다 또한 창조자 (마스터)와 사이에 통신 할 수있는 간단한 방법을 제공합니다. 생성 (슬레이브) 상태. "

  2. Pluto ". 플랫 파일로, 이후 동일하거나 다른 루아 우주로 그들을 다시 읽기"루아 우주 "명왕성은 사용자의 임의의 큰 부분을 쓸 수있는 라이브러리입니다"

+0

하지만 coroutines를 사용하려고 생각했지만 한 coroutine의 치명적인 오류가 다른 옵션에 영향을 미쳐서 atm이 아닌 이유에 대해 두려워합니다. 링크 주셔서 감사합니다! 나는 현재 루아 지트와 반지를보고 있습니다. 반지는 내 문제에 대한 가능한 해결책 인 것 같다. – pachanga

+3

한 코 루틴에서 치명적인 오류가 발생해도 다른 사람에게 아무런 영향을 미치지 않습니다. 우리가 루아 코드에 관해서 이야기하는 한, 사용자가 제공 한 것들은 물론 프로그램 된 데미지를 줄 수 있습니다. –

+0

사실 복제를해야합니다. 그것은 내가하고있는 POS 프레임 워크를위한 것이고, 나는 스크립트를 작성하는 사람이 신용 카드 암호를 훔칠 수 있기를 바랍니다. EMV 라이브러리를 사용하면 사용자가 콜백을 통해 화면을 사용자 정의 할 수 있으며 각 콜백은 화면을로드하는 루아 코 루틴을 트리거합니다. 하지만 coroutines 변수를 공유하고, 나는 암호를 호출하는 동안 변수 환경에 대한 모든 수정을 롤백 ... 이걸 위해 새로운 질문을 작성해야합니까? –

1

가도 (download, docs를) 레인을 그리고 내가 아는 모든 유사한 제품에 comparison 내.

반지는 별도의 루아 상태 제공하지만, 없는 멀티 스레딩 : 반지에 대해

비교 시트는 말한다. 이것은 을 간단하게 만들지 만 하나 이상의 CPU 코어를 사용하지 않습니다.

참고 : 비교표에는 차선이 '비순환 표'만 마샬링합니다. 사이클을 수행하고 마샬 함수, 상위 값 등을 수행합니다. 그리고 Lua 상태 사이의 복사본을 중간에 내용을 현혹시킬 필요가없는 직접 복사로 수행합니다. 이것은 그것을 빨리한다.

1

Linux를 사용하는 경우 Lua 작성자 중 한 명이 lper, LPSM 기반 실험 라이브러리를 사용해보십시오.

+0

네, 리눅스를 사용하고 있습니다. 링크를 이용해 주셔서 감사합니다! – pachanga

1

통지는 Lua 5.2 이상에서 작동합니다.

이 VM에 대한 액세스를 제한 할 수 있습니다. _G (전역 루아 상태)에 종속되지 않고 각 클라이언트에 대해 별도의 테이블을 만드는 데 필요한 모든 기능을 갖춘 하나의 인스턴스를 만듭니다. 그들은 자신의 글로벌 네임 스페이스로 사용할 것입니다. 현재 _G로 테이블을 설정하는 것은 _ENV를 통해 가능합니다. 그것은 한 게시물에서 설명하기가 상당히 어려운 주제입니다. 요약하면 새 클라이언트에 대해 "가상"_G를 준비한 다음 클라이언트 코드 대신 _G를 대체하십시오. There is where I advice you to start.

여기에 요점이 나와 있습니다.

local _ENV = t -- change the environment. without the local, this would change the environment for the entire chunk

그냥 local을 제거하고 모든 추가 코드 _ENV를 변경할 수 있습니다. 실험을 통해 행운을 빌어 요!

P. S. _ENV 및 _G 테이블에 대해 metatable을 설정하고 해당 metatable을 변경하는 것을 금지 할 수 있음을 잊지 마십시오. 루아는 여기에서 정말 유연합니다.