我希望能够动态更改我的游戏代码。例如,假设我的游戏是这样构造的:
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);
}
}
我已经使用了 AppDomains 和 Proxyclass,但是序列化每一帧太慢了。我试图只传递一个指针,但由于 AppDomains 使用他们自己的虚拟地址空间,我无法访问 GameState 对象。我的另一个想法是使用反射通过 GetMethodBody() 从编译方法中获取 IL 并将其传递给 DynamicMethod 但这会限制我编写 RenderAndUpdate 方法的方式,因为我不能在 IGameCode 实现中使用子方法或变量.
那么我怎样才能实现我想做的事情呢?