Performance 如何在循环操作和绘制事件时对齐?
我目前正在笛卡尔坐标系上绘画和显示。在我的游戏中,我有快速移动的物体,子弹,我使用以下公式来确定位置:Performance 如何在循环操作和绘制事件时对齐?,performance,theory,game-physics,mathematical-optimization,Performance,Theory,Game Physics,Mathematical Optimization,我目前正在笛卡尔坐标系上绘画和显示。在我的游戏中,我有快速移动的物体,子弹,我使用以下公式来确定位置: x += speed * Cos(theta); y += speed * Sin(theta); 其中,θ是一个弧度测量值,速度以牺牲整体连续性为代价修改速度。[lim速度→ ∞] 然后x和y=开始和下一个计算的x,y点之间较大的“跳跃” 我必须在“高速”对象上使用这个公式,所以我没有使用计时器(限制为毫秒.001),而是使用了while循环: while(true) { if(cur
x += speed * Cos(theta);
y += speed * Sin(theta);
其中,θ是一个弧度
测量值,速度以牺牲整体连续性为代价修改速度。[lim速度→ ∞] 然后x和y=开始和下一个计算的x,y点之间较大的“跳跃”
我必须在“高速”对象上使用这个公式,所以我没有使用计时器(限制为毫秒.001),而是使用了while循环:
while(true) {
if(currentTime - oldTime > setInterval) //x,y and intersection operations {
//operations
} if(currentTime - oldTime > setInterval) //paint operations {
//operations
}
sleep(0,nanoseconds);//sleeps thread or if you're a C kind of guy, "task"
}
我希望x、y和交叉点操作以比绘制事件快得多的速度发生,我计划以每秒30-125次的速度发生绘制事件(基本上是监视器的赫兹)
实际问题:
- 对于x、y和交叉操作,什么是最有效的速率,以便它们在不同的CPU上以一致的速率执行(从多尘的单核@1.6 ghz到奇特的shmancy十六进制@4.0 ghz)
- 对于这些操作,是否有比我的更好的角度位置公式
*请注意,如果您想知道,我绘制对象的方法与我的问题无关。请在每次屏幕刷新(60Hz?)时启动计时器。在这段时间内,您可以计算此时对象所在的位置。您可以在确定的位置绘制对象 无论何时,只要您想找出对象当前所在的位置,您都可以运行物理模拟,直到时间赶上要渲染的时间点。这样,您就可以在对象应该所在的时间点上为对象设置动画 定义物理模拟运行的频率。也可以选择60Hz或其任意整数倍。以相同的时间增量(即1/频率)运行物理引擎。要渲染时,请找出缺少多少物理刻度,然后逐个运行
此方案对丢失或多余的计时器计时具有完全的鲁棒性。CPU时钟频率也不重要。对象始终以其应处于的价格位置进行渲染。非常有趣,我喜欢您的风格。如果有人无法将渲染作为事件触发程序,您建议如何计算时间点通过屏幕刷新来恢复?任何触发痛苦操作的方式都会起作用。计时器、睡眠循环……当此类事件发生时,您只需计算挂钟时间缺失的程度。(小心计算机进入睡眠状态…).GetTickCount64应该允许您获得连续的时间值。我必须找出一个滴答计数系统,因为我使用的是Java而不是C++/C#。我不相信Java像.NET家族那样提供了滴答事件或滴答变量。我必须综合我自己的系统。