【发布时间】:2011-01-02 03:33:17
【问题描述】:
我已经实现了一个游戏引擎循环如下:
public static Boolean Start ( )
{
if (hasBoard)
{
// start engine on worker thread
asyncTask = new AsyncResult ( stopEngine, asyncTask );
isRunning = ThreadPool.QueueUserWorkItem ( startEngine, asyncTask );
if (isRunning)
{
Console.WriteLine ( "[{0}] Engine started",
DateTime.Now.ToString ( "hh:mm:ss" ) );
}
else
{
Console.WriteLine ( "[{0}] Engine failed to start",
DateTime.Now.ToString ( "hh:mm:ss" ) );
}
}
return isRunning;
}
public static void Stop ( )
{
Console.WriteLine ( "[{0}] Engine stopping",
DateTime.Now.ToString ( "hh:mm:ss" ) );
asyncTask.SetAsCompleted ( null, false );
}
private static void startEngine ( Object task )
{
while (!( (IAsyncResult)task ).IsCompleted)
{
Thread.Sleep ( 10000 );
Console.WriteLine ( "[{0}] Engine running",
DateTime.Now.ToString ( "hh:mm:ss" ) );
}
}
private static void stopEngine ( IAsyncResult iaResult )
{
// clean up resources
Console.WriteLine ( "[{0}] Engine stopped",
DateTime.Now.ToString ( "hh:mm:ss" ) );
isRunning = false;
}
我正在使用 Jeff Richter 在他的文章 Implementing the CLR Asynchronous Programming Model 中推荐的 AsyncResult 类。为了能够从 UI 中停止引擎,我使用的实现有点偏离标准异步模式。此实现按预期工作,但是当我偏离标准实践时,我会回到 SO 社区以确保我以正确的方式做事。
此实现是否存在任何人都可以看到的问题?
【问题讨论】:
-
在游戏引擎循环中,您不会简单地生成一个新线程而不是使用池线程吗?
-
@Mitch:我不太确定。我相信产生一个新线程是标准的。我不知道使用 Threadpool 线程有什么问题。这个游戏引擎是超轻量级的。此外,由于 WinForms UI 在控制中,我认为这是处理游戏循环的好方法。
-
你为什么在游戏循环中使用 any 线程?如果您需要任何(这确实应该受到很好的质疑),线程应该可能是为特定明确目的预先生成的线程(例如,总是2个线程等. 连续生活)在队列或其他同步中工作。然而,最好的办法就是保持“KISS”。
-
@pst:可能是因为这是我第一次尝试构建和理解一个非常简单的游戏引擎。
标签: c# .net asynchronous game-loop