tôi đã thực hiện một trò chơi động cơ vòng lặp như sau:Có các phương pháp hay nhất để triển khai vòng lặp trò chơi không đồng bộ không?
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;
}
Tôi đang sử dụng lớp AsyncResult
khuyến cáo của Jeff Richter trong bài viết của mình, Implementing the CLR Asynchronous Programming Model. Để có thể dừng động cơ từ giao diện người dùng, việc triển khai tôi đã sử dụng hơi lệch so với mẫu không đồng bộ chuẩn. Việc triển khai này hoạt động như mong đợi, nhưng khi tôi chuyển hướng từ một thực hành tiêu chuẩn, tôi trở lại cộng đồng SO để đảm bảo tôi đang làm đúng cách.
Có bất kỳ vấn đề nào với việc triển khai này mà mọi người có thể thấy không?
trong vòng lặp công cụ trò chơi, bạn sẽ không tạo ra một chuỗi mới thay vì sử dụng một chuỗi hồ bơi? –
@Mitch: Tôi không chắc lắm. Tôi tin rằng việc sinh ra một sợi mới là tiêu chuẩn. Tôi không biết rằng có bất cứ điều gì sai trái với việc sử dụng một Threadpool thread. Động cơ trò chơi này là siêu nhẹ. Ngoài ra, kể từ khi một giao diện người dùng WinForms là * trong kiểm soát *, tôi nghĩ đây sẽ là một cách tốt để làm việc vòng lặp trò chơi. – IAbstract
Tại sao bạn sử dụng * chủ đề * bất kỳ trong một vòng lặp trò chơi? Nếu bạn cần * bất kỳ (mà thực sự nên được đặt câu hỏi), các chủ đề có thể là các luồng được tạo sẵn cho một mục đích * xác định rõ ràng * (ví dụ: luôn luôn 2 luồng, v.v ... liên tục hoạt động) hoặc đồng bộ hóa khác. Tuy nhiên, tốt nhất có thể chỉ để giữ nó "KISS". –