游戏 之 延时 本帖最后由 hetengfei_ 于 2011-12-20 23:47:58 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #1楼 的 贴子不成功,看来CSDN 的安全方面 做的不错啊! 怎么可能Thread.Sleep呢?你阻塞了主线程,让它无法腾出时间来处理别的工作,这纯粹是画蛇添足。可能你的本意是多线程操作画面上的处理,但是那可不能使用Thread.Sleep啊。 要达到非常好的效果,本想下面做的。做法: 键盘+Mouse 线程A声明 线程B主线程C 先 开辟一片内存,这为(后续)每帧画面 的队例(假定10 帧(以每秒20帧的速度,就算主线程被卡了 0.5 秒也可以通畅))。timer 的timer_tick 作为画片的更新 (主线程引起)再用Monitor 来同步 A B C 三个线程。(本想用 以上方式来设计的,这样会涉及 几大我不懂的)一:线程间通迅二:因主线程C 要进行画图计算,还要控制 缓存队例,发消息到 声控线程B ,还有timer_tick 所以要使他占用更多的CUP 时间比。 声明 线程B ----->声音 线程B 我给你写个建议吧,不算是回答,因为我也不专业,怕被吐槽啊。1.如果使用多线程,那只用线程去更改数据,而不更改界面。2.Sleep真的不要用了,这个很麻烦,计时会受到计算机性能的影响。使用Timer或实现一个阻塞来判断主界面是否需要更新。如果设置可以跳帧(游戏设置里经常会有),那么用Stopwatch来修正Timer,如果不给跳帧选项,就不用修正了。3.主界面的重绘和更新(更新数据如果用其他线程来操作,要控制好同一帧界面数据的同步)是个while(true),因为游戏来说,本身就是个死循环。4.如果使用多线程,每个可移动的单位最好都使用独自的线程;如果不想这么做,就不用多线程,这是可以的,因为1/24秒,计算机可以做的事情超乎你的想象。5.不要用任何阻塞操作,除非阻塞操作不会影响游戏的过程(同时阻塞while(true))。6.锁帧/非锁帧与按需更新while(shouldUpdate)//锁帧.非锁帧使用while(true){ Update();}void Update(){ //...收集数据的改变 Repaint();}void Repaint(){ //...更新界面}//按需更新void Update()//需要更新的时候,调用即可{ //收集数据更改 Repaint();}void Repaint(){ //更新主界面} 使用Timer进行更新的话,不用while(true),将Update放入CallBack即可。 datagridview即时刷新问题(网络) C#中序列化和反序列化 请各位赐教~~ 高分求CheckedListBox内部拖放项的源码 C# a继承b c继承b a与c怎么转换 新手求问:C#调用C++dll函数时返回值的问题 新手上路,写了文本框是否为空验证代码,如何终止程序往下走? C#操作2个ORCAL数据库的问题 线程转换问题? 如何将一个复杂对象序列化,然后直接存入数据表的一个字段? 在数据库里搜索匹配数据 求一排除型正则
看来CSDN 的安全方面 做的不错啊!
要达到非常好的效果,本想下面做的。
做法:
键盘+Mouse 线程A
声明 线程B
主线程C 先 开辟一片内存,这为(后续)每帧画面 的队例(假定10 帧(以每秒20帧的速度,就算主线程被卡了 0.5 秒也可以通畅))。
timer 的timer_tick 作为画片的更新 (主线程引起)
再用Monitor 来同步 A B C 三个线程。
(本想用 以上方式来设计的,这样会涉及 几大我不懂的)
一:线程间通迅
二:因主线程C 要进行画图计算,还要控制 缓存队例,发消息到 声控线程B ,还有timer_tick 所以要使他占用更多的CUP 时间比。
我给你写个建议吧,不算是回答,因为我也不专业,怕被吐槽啊。1.如果使用多线程,那只用线程去更改数据,而不更改界面。
2.Sleep真的不要用了,这个很麻烦,计时会受到计算机性能的影响。
使用Timer或实现一个阻塞来判断主界面是否需要更新。如果设置可以跳帧(游戏设置里经常会有),那么用Stopwatch来修正Timer,如果不给跳帧选项,就不用修正了。
3.主界面的重绘和更新(更新数据如果用其他线程来操作,要控制好同一帧界面数据的同步)是个while(true),因为游戏来说,本身就是个死循环。
4.如果使用多线程,每个可移动的单位最好都使用独自的线程;如果不想这么做,就不用多线程,这是可以的,因为1/24秒,计算机可以做的事情超乎你的想象。
5.不要用任何阻塞操作,除非阻塞操作不会影响游戏的过程(同时阻塞while(true))。
6.锁帧/非锁帧与按需更新while(shouldUpdate)//锁帧.非锁帧使用while(true)
{
Update();
}void Update()
{
//...收集数据的改变
Repaint();
}
void Repaint()
{
//...更新界面
}//按需更新
void Update()//需要更新的时候,调用即可
{
//收集数据更改
Repaint();
}void Repaint()
{
//更新主界面
}
使用Timer进行更新的话,不用while(true),将Update放入CallBack即可。