【发布时间】:2013-03-23 22:02:49
【问题描述】:
我正在用 C# 开发一个 Chip-8 仿真器,我已经完成了几乎所有方面的部分工作,但我仍然对仿真器的速度控制感到疑惑。
我现在正在做的是假设我每秒获得 60 帧,我使用一个以以下方式触发 1/60 秒的计时器(伪代码):
timer_ticked()
{
for(int i = 0; i < Settings.CyclesPerFrame; i++)
{
EmulateCycle();
}
if (IsDrawFlagSet)
{
DrawGraphics();
}
}
我正在使用一个名为 microtimer http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer 的高分辨率计时器,我相信计时器不会等待 timer_ticked 完成来触发下一个周期(例如,创建一个新线程)并且我有一个线程和表单的问题,因为尝试使用 GDI 绘制到窗口(使用 control.GetGraphics() 方法)似乎是线程安全的,但尝试创建 SDLDotNet 方法(只是一个示例)却不是。
您认为哪种方法可以最好地控制模拟器的速度而不会陷入计时器线程的疯狂?
PS:模拟器的源码可以在GitHub上找到:https://github.com/AlFranco/C8POC
谢谢!
【问题讨论】:
-
伪代码不能保证每秒 60 帧,因为您受制于操作系统和处理器本身。如果
GetGraphics()实际上是线程安全的,我会非常震惊。 -
感谢您的回答!所以 16,6ms 对于普通计时器来说太精确了?你知道更好的解决方案吗?
标签: c# .net multithreading gdi emulation