【菜鸟求助】书上的一段代码,希望懂的帮我解释一下。

Stanleyee 2016-07-13 07:57:50
namespace Enginev1._0
{
//定义消息结构,用于PeekMessage填充
[StructLayout(LayoutKind.Sequential)]
public struct Message
{
public IntPtr hWnd;
public int msg;
public IntPtr wParam;
public IntPtr lParam;
public uint time;
public Point p;
}

public class FastLoop
{
public delegate void LoopCallback(double elapsedTime); //定义委托
private readonly LoopCallback _callback; //实例化委托
private readonly PreciseTimer _timer = new PreciseTimer(); //实例精确计时器

//构造函数
public FastLoop(LoopCallback callback)
{
_callback = callback;
Application.Idle += OnApplicationEnterIdle;
}

#region 引入C函数PeekMessage

[SuppressUnmanagedCodeSecurity]
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool PeekMessage(
out Message msg,
IntPtr hWnd,
uint messageFilterMin,
uint messageFilterMax,
uint flags);

#endregion

//这个方法检查了事件队列
private void OnApplicationEnterIdle(object sender, EventArgs e)
{
while (IsAppStillIdle())
{
_callback(_timer.GetElapsedTime());
}
}

//这个方法没有检查事件队列
//private void OnApplicationEnterIdle1 ( object sender, EventArgs e )
//{
// _callback (_timer.GetElapsedTime ());
//}

//这个方法用来判断程序是否进入空闲状态,True=空闲 ,False=不空闲
private static bool IsAppStillIdle()
{
Message msg;
return !PeekMessage(out msg, IntPtr.Zero, 0, 0, 0);
}
}



public class PreciseTimer
{
private long _previousElapsedTime;

private readonly long _ticksPerSecond;

public PreciseTimer()
{
QueryPerformanceFrequency(ref _ticksPerSecond);
GetElapsedTime();
}

[SuppressUnmanagedCodeSecurity]
[DllImport("kernel32")]
private static extern bool QueryPerformanceFrequency(ref long performanceFrequency);

[SuppressUnmanagedCodeSecurity]
[DllImport("kernel32")]
private static extern bool QueryPerformanceCounter(ref long performanceCount);

public double GetElapsedTime()
{
long time = 0;
QueryPerformanceCounter(ref time);

var elapsedTime = (time - _previousElapsedTime)/(double) _ticksPerSecond;
_previousElapsedTime = time;

return elapsedTime;
}
}


这段代码是精通C#游戏编程里面的
...全文
807 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2016-07-14
  • 打赏
  • 举报
回复
调用windows api函数发送消息,你需要一些win32开发的背景知识和C#的interop的知识。
Stanleyee 2016-07-14
  • 打赏
  • 举报
回复
感谢楼上两位的提示,对于winform基础哪些东西,确实不曾接触过。敢问大大,有没有推荐阅读材料?
wanghui0380 2016-07-14
  • 打赏
  • 举报
回复
不深究,入门的时候,只能以“好读书,不求甚解”的方式去读,东西做多了就能理解了 话说,这个玩意如果深究就得从当初c++ sdk那个400行的基础winfrom构造讲起了(c++ sdk那个400行的winfrom构造是所有做form编程的基础,普通程序员到不必理会,但设计到一些底下的操作的程序员到必须明白)
Stanleyee 2016-07-13
  • 打赏
  • 举报
回复
窗口中这样写 FastLoop _fastLoop = new FastLoop(GameLoop); void GameLoop(double elapsedTime) { //do something; } 为什么这样就能确保每一帧做一次GameLoop方法呢?
Stanleyee 2016-07-13
  • 打赏
  • 举报
回复
FastLoop类可以实现一个快速的循环,然后这个类传递的方法GameLoop接受一个(double elapsedTime,按照书上的解释,这样是为了实现精确的时间调配,GetElapsedTime方法用来获取帧之间的间隔时间,但是我不明白其中的原理。希望有有大神出现帮我理解一下个中原理,谢谢!

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧