C++ 如何在C++;?

C++ 如何在C++;?,c++,windows,linux,C++,Windows,Linux,对于学校项目,我需要(重新)创建一个功能齐全的R-Type多播放器版本,无需使用以下外部库: 促进 SFML/SDL Qt 不允许使用C++11 此外,这个游戏必须在Fedora(Linux)和Windows之间完全可移植。我负责服务器,因此严禁使用任何图形库 为了创建正确的游戏循环,我需要一个正确的计时器类,类似于实现GetTicks()或GetElapsedTime()方法的SDL中的计时器类。但我问自己,创建这样一个类的最佳方式是什么,到目前为止,我是这样开始的: 使用pthread

对于学校项目,我需要(重新)创建一个功能齐全的R-Type多播放器版本,无需使用以下外部库:

  • 促进
  • SFML/SDL
  • Qt
  • 不允许使用C++11
此外,这个游戏必须在Fedora(Linux)和Windows之间完全可移植。我负责服务器,因此严禁使用任何图形库

为了创建正确的游戏循环,我需要一个正确的计时器类,类似于实现GetTicks()或GetElapsedTime()方法的SDL中的计时器类。但我问自己,创建这样一个类的最佳方式是什么,到目前为止,我是这样开始的:

  • 使用pthread(可移植)创建线程类
  • 在循环中使用函数time()和difftime()确定自上次滴答声以来经过的时间
知道这个类将被同时播放的几十个实例使用,我应该使用Singleton设计模式吗?这种方法准确吗


编辑:更改了我问题的解释,以更符合我的需要,更准确地说明我可以使用什么或不可以使用什么。

您可能希望为Linux创建一个围绕
gettimeofday
的包装器,该包装器返回自纪元以来的微秒数,以及Windows的
GetTickCount
,返回自系统启动以来的毫秒数


您也可以在Windows上使用,它将在进程启动后每秒返回秒*时钟(是的,墙上的时钟时间不是CPU时间)。

如果spec pthreads已过期,则不会在Windows上运行,标准中未包含

如果您可以使用C++11,那么就可以使用std::chrono作为计时器。这是一个高精度计时器,具有相当直观的界面。它基本上是从boost中提出来的(就像线程一样),因此boost的大部分文档都转换为std::chrono。 (或者对于低精度,只需使用C时间库)对于线程,可以使用std::thread

注意:这些是标准库的元素,您只需在您的平台上创建测试,以确保您使用的stdlib支持它们(您需要启用c++11-通常是--std=c++0x)


我确信GCC4.6中的线程和时钟占了绝大多数,而且看起来很稳定。

要实现您的想法,没有一种简单的方法。幸运的是,有一些简单的方法可以做你想做的事情

首先:
在循环中使用函数time()和difftime()来确定经过了多少时间
,这是个糟糕的主意。这将使用100%的一个CPU,从而使程序缓慢爬行。如果你想等待一段特定的时间(1/60秒或1/10秒的“滴答声”),那就等一下。别胡思乱想

标题:

long long get_time();
long long get_freq();
void wait_for(long long nanoseconds);
cpp:


所有这些都不是完美的(特别是因为我没有为linux编写代码),但无论何时您必须处理操作系统,这都是一个通用的概念(因为它不在标准中,您不能使用库)。Windows和GCC实现可以在单独的文件中,如果您想获得墙时间,可以在Windows上使用
QueryPerformanceCounter
,在POSIX系统上使用
clock\u MONOTONIC
clock\u MONOTONIC
Linux 2.6.28+。

,p螺纹不是C++的一部分。如果你不能使用外部库,你也将无法进行图形处理。所以基本上,你的需求是自相矛盾的。你能使用C++11吗?然后你就可以用新的chrono了。另外,我不知道你是如何创建你的图形,因为C++没有任何图形库…那么你可以使用一些你忘记告诉我们的库吗?如果是学校用的,而C++11在作业中没有被指定为“否”,那么就使用它吧。C++ 11是有效的C++。你的教授不能为你评分。@爱菲士:这些要求是不可行的:你不能获得高分辨率的定时器,你不能在没有外部库的情况下访问C++网络。不,你需要使用Windows高性能定时器来在Windows上实现高分辨率定时。这两种都不在C++标准中。一个是POSIX,另一个什么都不是:)@DeadMG我想这取决于他想要的解决方案。我认为这些足够满足他的需要。我不相信有任何便携式计时器,所以我们只能使用POSIX和坏掉的Windows功能。不幸的是,这些东西不是计时器,它们让进程进入睡眠状态。理想情况下,ePobe、KQueR和HR定时器应该用于不同的平台,但那些不是C++标准…(有一个Windows版本的pthread(我几年前在一个跨平台项目中使用过它):kol:std::thread将再次成为未来的证明版本,如果boost::thread失败,将优先考虑,因为它非常接近标准。感谢您提供此代码示例。它肯定会帮助我理解Timerclass背后的逻辑。我现在重新体验一下,按照我计划的方式,我的计时器会有多重。谢谢您的反馈堡垒!
#ifdef _MSC_VER //windows compiler for windows machines
long long get_time() {
    LARGE_INTEGER r;
    QueryPerformanceCounter(r);
    return r.QuadPart;
}
long long get_freq() {
    LARGE_INTEGER r;
    QueryPerformanceFrequency(r);
    return r.QuadPart;
}
void wait_for(long long nanoseconds)
{
    Sleep(nanoseconds / 1000000);
}
#endif
#ifdef __GNUC__ //linux compiler for linux machines
long long get_time() {
    timespec r
    clock_gettime(CLOCK_MONOTONIC, &r);
    return long long(r.seconds)*1000000000 + r.nanoseconds;
}
long long get_freq() {
    timespec r
    clock_getres(CLOCK_MONOTONIC, &r);
    return r.nanoseconds;
}
void wait_for(long long nanoseconds)
{
    timespec r = {nanoseconds/1000000000, nanoseconds%1000000000};
    nanosleep(&r, NULL);
}
#endif