QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1081|回复: 10

关于“定时器”的实现……

[复制链接]
发表于 2004-7-4 05:27:15 | 显示全部楼层 |阅读模式
SDL里有个SDL_GetTicks():
“调用SDL_GetTicks() 可以获得从过去某个时刻到现在所经过的毫秒。”

网络游戏的服务器端也需要这种功能的函数,但是我不想在服务器端也用SDL,那么该怎么实现这种功能的函数,得精确到毫秒级……
发表于 2004-7-4 08:57:49 | 显示全部楼层
SDL_GetTicks()一般用作SDL程序如游戏等的延迟所用;其它应用你可试试usleep(毫秒数)作延迟。
回复

使用道具 举报

 楼主| 发表于 2004-7-4 19:41:17 | 显示全部楼层
晕……我就是要做游戏的服务器端啊……
需要的不是延迟函数……需要的是“获得从过去某个时刻到现在所经过的毫秒”……
回复

使用道具 举报

发表于 2004-7-4 20:57:04 | 显示全部楼层
那找SDL源码看看SDL_GetTicks()的代码不就可以了!
回复

使用道具 举报

 楼主| 发表于 2004-7-5 16:42:41 | 显示全部楼层
[quote:ca2683ed71="lanche"]那找SDL源码看看SDL_GetTicks()的代码不就可以了![/quote]

那你帮我解读一下…… :-(

[code:1]

Uint32 SDL_GetTicks (void)
{
#ifdef USE_RDTSC
        unsigned long long now;
        if ( ! cpu_mhz1000 ) {
                return 0; /* Shouldn't happen. BUG!! */
        }
        rdtsc(now);
        return (Uint32)((now-start)/cpu_mhz1000);
#else
        struct timeval now;
        Uint32 ticks;

        gettimeofday(&now, NULL);
        ticks=(now.tv_sec-start.tv_sec)*1000+(now.tv_usec-start.tv_usec)/1000;
        return(ticks);
#endif /* USE_RDTSC */
}

[/code:1]
完整的文件在这:
http://www.libsdl.org/cgi/cvsweb.cgi/SDL12/src/timer/linux/SDL_systimer.c?rev=1.10&content-type=text/x-cvsweb-markup


另外我找到个函数:

#include <sys/timeb.h>

int ftime(struct timeb *tp);

它能返回秒数+毫秒数,基本上可以代替SDL_GetTicks(),但是在APUE里没有提到这个函数,我怕它不是POSIX标准的,会带来可移植性问题……
回复

使用道具 举报

发表于 2004-7-5 19:48:29 | 显示全部楼层
直接照抄SDL_GetTicks()的代码,将它命名为My_GetTicks()之类的便可。代码很简单,无须解释吧,在USE_RDTSC间的代码可能是针对实时应用的(也许嵌入式等实时系统用的),接下来的代码才是我们系统用到的,ticks=(now.tv_sec-start.tv_sec)*1000+(now.tv_usec-start.tv_usec)/1000;应该很容易理解。
回复

使用道具 举报

 楼主| 发表于 2004-7-5 20:52:18 | 显示全部楼层
hoho~重于看明白了……不过有个不明白的地方:
microseconds是什么单位?如果是毫秒,那么 (now.tv_usec-start.tv_usec)/1000 得到的不就是秒了吗?
回复

使用道具 举报

发表于 2004-7-5 21:12:13 | 显示全部楼层
microseconds是微秒(micro是微呀,你忘了微软叫什么了么?),usec中的u也就是微,数学中应该学过的,sec当然就是秒了,usec则为微秒~~~也可将ticks精确到微秒,但不大实用罢了。

在用My_GetTicks()之前,可能需要在程序开始时初始化一个类型为timeval结构的start全局变量。
回复

使用道具 举报

 楼主| 发表于 2004-7-5 21:25:51 | 显示全部楼层
系统的始终能精确到微秒……     
我想不需要在My_GetTicks()再定义start了吧?反正我用到My_GetTicks()的时候也都是要减去一个last_time的~

谢谢lanche~~
回复

使用道具 举报

发表于 2004-7-5 21:30:59 | 显示全部楼层
客气啥?咱都是吃米饭的(杨州吃米饭的吧?)。
回复

使用道具 举报

 楼主| 发表于 2004-7-6 05:41:26 | 显示全部楼层
扬州炒饭!很有名的~     
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 23:39 , Processed in 0.045778 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表