【GMS插件】tEngine时间引擎
gamemaker吧
全部回复
仅看楼主
level 15
sunyubokkkkk
楼主
众所周知,gamemaker默认是延时保帧的工作模式,该引擎让你可以拥有保时丢帧的工作模式。(目前仍为beta版)
2楼地址,3楼为“延时保帧”和“保时丢帧”的解释,4楼为插件用法。
2018年07月09日 03点07分
1
level 15
sunyubokkkkk
楼主
地址楼保留,一会儿放在此楼回复里,先更3、4楼。
2018年07月09日 03点07分
2
sunyubokkkkk
插件本体1Xb
EEa
K2A
EvS_
Cws
xpX
2tzg求不删求不删求不删
2018年07月09日 04点07分
sunyubokkkkk
DEMO工程(已导入插件)1ti
U7Z
nns
mdJ
_l4y
POy
kvZ
Q
2018年07月09日 04点07分
蓝胡子_6
@sunyubokkkkk
楼主大神。。看不懂这个地址呀
2018年12月09日 16点12分
level 15
sunyubokkkkk
楼主
何为“延时保帧”与“保时丢帧”?
---------------------------------------
通俗一点讲,从视觉效果上解释:
假设你的游戏里有一个方块,你想要它在1秒内横向运动500像素,你的房间速度是60,那么你可以这样在Step事件里写:
var spd_per_frame=500/(1*room_speed);//计算出1帧内运动的距离,即速度
x+=spd;//运动
因为我们知道正常情况下,room_speed即是游戏循环1秒内会执行的次数,即帧率。由于房间速度是60,所以正常情况下1秒会经过60帧,即1帧为1/60秒。方块会按照预期在1秒内经过60次运算走过500像素。
但是,什么是“正常情况”?所谓正常情况指的是你的游戏在一台配置足够的电脑上运行,游戏能够做到按房间速度1秒刷新60次。那假如在一台老爷机上或者你的游戏有超赞的特效导致“掉帧”呢?
假设此时实际fps只有30帧每秒,你的代码却仍然没有改变,此时你的方块会在1秒内经过30次运算,也就是只走过250像素。所以按照gamemaker默认的模式,游戏看起来变慢了。
故延时保帧就可以理解为,在实际帧率达不到设定的房间速度时,通过【延长】总执行完方块运动500像素的【时间】,来【保证】每一【帧】的方块的运动量都符合原定代码,掉帧时给人的视觉感受是【变慢】。
--------------------------------------
但有时我们并不希望这样的事发生——可能游戏速度变慢会导致玩家玩起来自带外挂,因为给他们的反应时间变长了,降低游戏性。
此时就有保时丢帧的出现。不同于前者,保时丢帧的模式保证游戏无论帧数多低都能在同样的现实时间内完成任务。采用这种模式的话,你要方块在1秒内运动完500像素,那么不管你fps实际上是60帧30帧2帧还是120帧,它都会在1秒内到达目的地,但代价是什么?
举个例子,假设正常60帧率的时候,每一帧的速度是spd,如果此时掉到30帧,为了仍然保证同样时间走完同样路程,是不是速度不得不变为(60/30)*spd,也就是2倍的原速度?所以相比于正常情况,掉帧时方块会“跳过”某些位置的绘制直接到预定的位置来保证按时完成任务。
故保时丢帧可以理解为,在实际帧率达不到设定的房间速度时,为了【保证】仍按照预定的【时间】执行完方块运动500像素,【丢弃】一些来不及渲染或运算的【帧】,掉帧时给人的视觉感受是【变卡】。
2018年07月09日 04点07分
3
sunyubokkkkk
不知为何发不出动图,待会儿恢复正常了补楼下。
2018年07月09日 04点07分
level 9
阳光-1024
似乎
和我的讯飞娘一样
并无 用
2018年07月09日 11点07分
5
sunyubokkkkk
管他有没用呢,像你一样发出来就是了
2018年07月09日 11点07分
阳光-1024
@sunyubokkkkk
2018年07月09日 11点07分
level 3
图Mgs
楼主,可不可以游戏开始放个计时器设定每间隔出发一次时间,把所有逻辑时间放到这里解决,这不就避开了基于帧的矛盾了吗
2018年07月11日 04点07分
6
sunyubokkkkk
gm的计时器也是基于帧的呀,掉帧的时候无论如何都要用delta_time处理。你用计时器,我用step,这都无所谓,主要是delta_time。
2018年07月11日 05点07分
level 3
图Mgs
大哥你说了这么多,其实就是利用插件把基于帧的全局事件处理为基于时间。
2018年07月11日 05点07分
7
sunyubokkkkk
是的,插件是纯gml的,我说这么多是为了解释基于帧和基于时间的区别。本来还有两个动图,发不出来。
2018年07月11日 05点07分
图Mgs
@sunyubokkkkk
delta_time我在手册里查不到,求详细
2018年07月11日 08点07分
sunyubokkkkk
@图Mgs
F1帮助里有的呀,是这一帧与上一帧之间经过的微秒数,real型。1秒=1,000毫秒=1,000,000微秒
2018年07月11日 08点07分
图Mgs
@图Mgs
明白了,就是恒定时间吧
2018年07月11日 08点07分
level 3
图Mgs
我又详细的了解了一下gm不是基于帧的,gm里帧生成是在每个step里,所以会 出现你说的第一种“延时保真”,而你给的第二种‘保时丢帧,的方法会造成,物体穿墙等bug
2018年07月11日 07点07分
8
sunyubokkkkk
物体穿墙是程序员代码没写好,与此无关,按gm默认的工作模式,代码没写好照样穿墙。穿墙是因为一帧内物体预计运动的距离超过了障碍物的宽度,帧率越高每一帧运动越少越不容易穿墙,帧率越低反之。很多程序员怕设定房间速度太高导致容易掉帧影响游戏表现把房间速度设得不敢太高,但保时丢帧的做法下,
2018年07月11日 08点07分
sunyubokkkkk
@sunyubokkkkk
可以把房间速度设得很高,完全不影响游戏物体实际表现速度。所以从某种程度上说保时丢帧反而不容易穿墙。低帧率情况下两种方法该穿墙都得穿墙,是代码没写好。
2018年07月11日 08点07分
图Mgs
@sunyubokkkkk
我明白你的意思,我就是说在代码是基于位置的碰撞时候容易跳过去,可以按向量写碰撞就不会产生这种情况了
2018年07月11日 08点07分
图Mgs
@sunyubokkkkk
引擎的好处就是不用自己写碰撞
2018年07月11日 08点07分
level 9
微子喵
Unity里的Time.deltaTime
2018年07月11日 15点07分
9
sunyubokkkkk
2018年07月11日 23点07分
疯花正猫
+1
2018年07月28日 16点07分
吧务
level 14
梦想君🐨
其实用draw_enable_drawevent也可以
不过缺点是,绘制事件会发生“跳帧”,如果有人在绘制事件里构筑游戏逻辑,那么会导致游戏出现一些意想不到的情况
下面是官方的例子
frame_skip ++;
if (frame_skip mod 5) == 0
{
draw_enable_drawevent(true);
}
else
{
draw_enable_drawevent(false);
}
2018年07月14日 17点07分
10
sunyubokkkkk
经常干这种事的我感到害怕
2018年07月15日 00点07分
1