Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在循环操作和绘制事件时对齐?_Performance_Theory_Game Physics_Mathematical Optimization - Fatal编程技术网

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家族那样提供了滴答事件或滴答变量。我必须综合我自己的系统。