2014-12-19 6 views
0

내 게임의 코드를 동적으로 변경하고 싶습니다.대용량의 데이터를 동적 코드로 처리하십시오.

class GameState { 
    public int SomeData; 
    public Entity[] EntityPool; 
} 

interface IServices { 
    IRenderer Renderer { get; } 
} 

interface IGameCode { 
    void RenderAndUpdate(GameState currentState, IServices serviceProvider); 
} 

내가 지금과 같은 코드를 쓸 수 원하는 :

이미 사용
void MainLoop() { 
    IGameCode gameCode = new DefaultGameCode(); 
    while(true) { 
     // Handle Plattform things 
     if(shouldUseNewGameCode) { 
      UnloadCode(gameCode); 

      gameCode = LoadCode("new.dll"); 
      // or 
      gameCode = LoadCode("new.cs"); 
     } 
     // Call GameTick 
     gameCode.RenderAndUpdate(gameState, services); 
    } 
} 

응용 프로그램 도메인과 Proxyclass하지만 직렬화 너무 느리다 예를 들어 내 게임이 이런 식으로 구성되어 말할 수의 경우 모든 프레임. 나는 포인터를 전달하려고했지만 AppDomains가 자신의 가상 주소 공간을 사용하기 때문에 GameState 객체에 액세스 할 수 없습니다. 내 다른 생각은 GetMethodBody()를 통해 컴파일 된 메서드에서 IL을 가져 와서 DynamicMethod에 전달하기 위해 Reflection을 사용하는 것이지만 IGameCode 구현에서 Submethods 또는 Variables를 사용할 수 없기 때문에 RenderAndUpdate 메서드를 작성하는 방법을 제한합니다. .

그래서 내가하고 싶은 것을 어떻게 할 수 있습니까?

+2

왜 다른 AppDomain에서 dll을로드합니까? 기본 도메인에로드하고 사용하십시오. 새로운 도메인을 만들고, 도메인을로드하고, 도메인을 항상 찢어서 얻을 수있는 이점은 무엇입니까? –

+0

@SriramSakthivel : 전체 AppDomain을 언로드하고 새로운 DLL로로드하여 새로운 버전의 DLL을 얻을 수 있다는 이점이 있습니다. –

+0

@JohnSaunders하지만 OP는 dll이나 다른 DLL의 새 버전을로드하지 않는 것 같습니다. 그는 나를 위해 같은 DLL을 반복해서하고있는 것처럼 보입니다. 나는 틀릴 수도 있지만 OP의 코드는 그렇게 말하고있다. –

답변

0

앞에서 보았 듯이 모든 프레임에 AppDomain 개의 경계를 넘기고 싶지는 않습니다. 특히 코드가 주 코드로 다시 호출되어야하는 경우 특히 그렇습니다. IServices 여러 번. 심지어 조금 향상시킬 수있는 MarshalByRefObject을 사용해도 너무 느려질 것입니다. 따라서 AppDomain을 포함하지 않는 솔루션이 필요합니다.

조립품의 크기는 어느 정도입니까? 얼마나 자주 바꿀 예정입니까?

.NET 어셈블리는 일반적으로 공간 효율성이 뛰어나며 사용자가 한 세션에서 어셈블리를 몇 번 이상 전환하지 않을 것으로 생각되면 DLL을 메모리에 byte[]으로 읽고 로드하려면 Assembly.Load(byte[]);을 사용하십시오.

또는 프로세스 메모리 공간에서 죽은 어셈블리를 실제로 허용 할 수 없다면 도우미 프로세스, 즉 "시작 관리자"를 사용하는 것이 더 좋을 것이라고 생각합니다. 구현을 전환하려면 도우미를 시작하십시오 프로세스 (또는 원하는 경우 항상 실행중인 채로 두십시오)를 선택하면 현재 게임 프로세스가 종료 될 때까지 기다린 다음 새 설정으로 새 프로세스를 시작합니다.

스위치가 느려지지만 각 스위치에 대해 일회성 비용이 소요되며 실제 게임 플레이 중에 프로그램이 최대 속도로 실행될 수 있습니다.