- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 OpenGL GLUT 代码编写游戏,我正在应用一种游戏开发技术,该技术包括测量游戏主循环每次迭代所消耗的时间,因此您可以使用它来按比例更新游戏场景上次更新了。为了实现这一点,我在循环开始时有这个:
void logicLoop () {
float finalTime = (float) clock() / CLOCKS_PER_SEC;
float deltaTime = finalTime - initialTime;
initialTime = finalTime;
...
// Here I move things using deltaTime value
...
}
当我向游戏中添加一颗子弹时,问题就来了。如果子弹在两秒内没有击中任何目标,则必须将其摧毁。然后,我所做的就是保留对子弹创建时刻的引用,如下所示:
class Bullet: public GameObject {
float birthday;
public:
Bullet () {
...
// Some initialization staff
...
birthday = (float) clock() / CLOCKS_PER_SEC;
}
float getBirthday () { return birthday; }
}
然后我将其添加到 finalTime 和 deltaTime 测量之外的逻辑中:
if (bullet != NULL) {
if (finalTime - bullet->getBirthday() > 2) {
world.remove(bullet);
bullet = NULL;
}
}
它看起来不错,但是当我运行代码时,子弹存活的时间太长了。为了寻找问题所在,我打印了 (finalTime - bullet->getBirthday()) 的值,我发现它增加得非常非常慢,就像它不是以秒为单位的时间一样。
问题出在哪里?我以为结果会在几秒钟内完成,所以子弹会在两秒钟内取出。
最佳答案
这是一个常见的错误。 clock()
不测量实际时间的流逝;它测量 CPU 运行此特定进程时经过了多少时间。
其他进程也占用CPU时间,所以两个时钟不一样。每当您的操作系统正在执行其他进程的代码时,包括当这个进程“休眠”时,都不算作 clock()
。如果您的程序在具有多个 CPU 的系统上是多线程的,clock()
可能会“重复计算”时间!
人类对操作系统时间片一无所知或感知:我们只是感知实际时间的实际流逝(称为“挂钟时间”)。最终,您将看到 clock()
的时基与挂钟时间不同。
Do not use clock()
to measure wall time!
您需要像 gettimeofday()
或 clock_gettime()
这样的东西。为了减轻人们改变系统时间的影响,在 Linux 上我个人推荐使用系统的“单调时钟”的 clock_gettime()
,一个与墙上时间同步但具有任意纪元的时钟不受人们玩弄计算机时间设置的影响。 (如果需要,显然可以切换到可移植替代方案。)
这实际上是在 the cppreference.com page for clock()
上讨论的:
std::clock
time may advance faster or slower than the wall clock, depending on the execution resources given to the program by the operating system. For example, if the CPU is shared by other processes,std::clock
time may advance slower than wall clock. On the other hand, if the current process is multithreaded and more than one execution core is available,std::clock
time may advance faster than wall clock.
当您不确定正在发生什么时,请养成阅读您使用的所有功能的文档的习惯。
编辑:原来 GLUT 本身有一个函数可以用于此目的,这可能很方便。 glutGet(GLUT_ELAPSED_TIME)
为您提供自调用 glutInit()
以来经过的毫秒数。所以我想这就是你在这里需要的。它的性能可能会稍微好一点,特别是如果 GLUT(或 OpenGL 的其他部分)已经在周期性地请求 wall time,并且如果这个函数只是查询已经获得的时间……从而使您免于不必要的第二次系统调用(这会产生成本) .
关于C++ 时间测量看起来太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43745361/
#include #include #include using namespace std::chrono; int main(int arc, char* argv[]) { con
我是 opencv 的新手。当我将 sRGB png 提供给它时,我发现以下代码交换了红色和蓝色 channel 。我应该责怪哪个函数,imread 还是 fromarray? 最佳答案 是的,O
我正在使用以下代码,它缩小了每一行,并且由于某种原因整个用户界面也丢失了。我该如何解决?
它是关于以下设置的:Linux 机器、bash、adb、带有 Busybox 的嵌入式 Linux 目标系统。对于目标系统,以下适用: adb shell echo $SHELL /bin/sh ad
当我在 Android Studio 上创建一个空 fragment 时,它会生成以下代码: /** * A simple {@link Fragment} subclass. * Activit
我正在尝试从 Meteor 应用程序的服务器端发布用户的 Facebook 提要: result = Meteor.http.call 'POST', "https://graph.faceb
目前我有两个不同的查询,它们返回完全相同的结果,但是,更改从中过滤结果的参数会使它们以非常不同的方式运行。 搜索 cartography 时的结果 查询 #1: 22 行/~860 毫秒; SELEC
我已经创建了结构: typedef struct { short s; int i; struct Ss { short s; }; } S;
我想在 Java 中打印反斜杠 t。但每当我尝试时,它实际上都将它作为\t 运算符。双反斜杠不起作用。我该怎么做。 最佳答案 例如通过添加另一个反斜杠来转义反斜杠 System.out.println
我想弄清楚为什么 UIActivityViewController 发送一个稍微转换过的字符串来分享给邮件和微信。 这是我的代码: let activityViewController = UIAct
创建标准 SQLite 游标后,我将使用以下方法遍历条目: while (cursor.moveToNext()) { } 所有行都被正确处理。我读过的所有文档都表明您需要发出 moveToFirst
我正在尝试创建一个基本论坛,但在 SQL 中仅打印一行时遇到问题。这是我的 PHP: {$title}"; } } else { print "failed to reach post
我的新 div 元素 ( ) 似乎隐藏在图像后面。我键入的任何内容都显示在图像后面。我想在背景图片之后继续工作。 这是我的代码: DISPLAY
UPD。一行代码解决了问题:.lean() axplanation here 我在 Model.find(...blablabla : [ {"_id":"578763de6e8e0542195ef4
我在 Ubuntu 16.04 中安装了 Tomcat 8.0.45。我使用 let's encrypt 生成的证书启用了 HTTPS 连接器。它就像一个魅力。但是今天Tomcat无法启动HTTPS连
今天,我在一台全新安装了 Windows 7 Ultimate 64 位的新笔记本电脑上安装了 Visual Studio 2010 Professional。我非常习惯于 Visual Studio
根据 Oracle,我应该能够将 .intValue() 和 .compareTo() 之类的方法应用于 double ,但是当我编写 dbl.toString( ) 例如,在 NetBeans 中,
正在为应用程序开发一些拖放功能,虽然可以使用“重影图像”来完成很多事情,将毒品从一个地方转移到另一个地方,但它们看起来总是有点“褪色” - 因此得名鬼影。是否有可能使这些具有与原始颜色相同的深度?谢谢
我是这方面的新手,很抱歉犯了一些愚蠢的错误。快乐学习。每当我使用 URL : localhost:3000/posts/whatever 时,我都会收到无法获取错误。在你问之前,是的,那是在我将内容放
背景 这自然是合法的: let closure: (Int, Int) -> () = { print($0 + $1) } closure(1, 2) // 3 鉴于,自进化提案实现以来 SE-01
我是一名优秀的程序员,十分优秀!