Timer计时器在游戏中的重要意义~~(经验之谈)

大家都知道,时间在程序中的重要性,几乎任何运算都可能跟时间有关;
 
       在运算中,时间是作为一个系数;
 
       系统每桢调用的时间间隔通常是变化的,
 
       那么可以这样下结论,时间不光是一个系数,而且是一个经常变化的系数;
 
       问题就出来了,平时我们在处理播放或者Camera操作的时候,如果时间系数经常变化,
 
       必然会导致结果有闪烁的痕迹,
 
       我们把这个变化过程放在坐标系上,可以明显的看到,线路图是由一条条不规律的直线构成;
 
       解决办法是,把直线图变成平滑的曲线图就可以达到这个目的;
 
       即把系统每桢调用的时间间隔做平滑处理,下面是实现模版:

#define USE_HIGH_FREQUENCY
#define FILTER_SIZE 16
class TIMER
{
    float filter[FILTER_SIZE];
    long  filter_index;
public:
    TIMER()
    {
        long n;
        for (n=0;n<FILTER_SIZE;n++) filter[FILTER_SIZE] = 20.0f;
        filter_index = 0;
#ifdef USE_HIGH_FREQUENCY  
        LARGE_INTEGER liFreq;
        QueryPerformanceFrequency( &liFreq );
        fSecondsPerTick = 1.0f / liFreq.QuadPart; 
        QueryPerformanceCounter(&liPrevTime);
#else
        Previous_Time = GetTickCount();
#endif
        Delta_Time = 20;
        rDelta_Time = Delta_Time;
        fps = 0; fps_count = 0; fps_time = 0;
        Ring = false;
        FixedDelta = false;
        ADT = 1;
        ADT_ON = true;
        ADT_val = 10;
    };
    bool  FixedDelta;
    DWORD FixedDeltaValue;
    bool  Ring;
#ifdef USE_HIGH_FREQUENCY  
    float   fSecondsPerTick;
    LARGE_INTEGER liPrevTime;
#endif
    DWORD Previous_Time;
    DWORD Delta_Time;
    DWORD rDelta_Time;
    DWORD fps;
    DWORD fps_count;
    DWORD fps_time;
    DWORD ADT;
    float ADT_val;
    bool ADT_ON;
    DWORD Run()
    {
        long n;
#ifdef USE_HIGH_FREQUENCY  
        LARGE_INTEGER liCurTime;
        QueryPerformanceCounter( &liCurTime );
        float fDeltaTime = 1000.0f * (liCurTime.QuadPart - liPrevTime.QuadPart) * fSecondsPerTick;
        Delta_Time = long(fDeltaTime);
#else
        DWORD Current_Time;
        Current_Time = GetTickCount();
        Delta_Time = Current_Time - Previous_Time;
        rDelta_Time = Delta_Time;
#endif
        if(Delta_Time > 100)
        {
            Delta_Time = 100;
            fDeltaTime = 100.f;
        }
        filter[filter_index] = (float)Delta_Time;
        filter_index++;
        if (filter_index >= FILTER_SIZE) filter_index = 0;
        ADT_val = 0;
        for (n=0;n<FILTER_SIZE;n++) ADT_val += filter[n];
        ADT_val = ADT_val/FILTER_SIZE;

        fps_time += Delta_Time;
        ADT += Delta_Time;
        fps_count++;
        if (fps_time >= 1000)
        {
            //ADT_val = ADT/fps_count;

            ADT = 1;
            fps_time = fps_time - 1000;
            fps = fps_count;
            fps_count = 0;
            Ring = true;
        } else Ring = false;
#ifdef USE_HIGH_FREQUENCY
        liPrevTime = liCurTime;
#else
        Previous_Time = Current_Time;
#endif

        if (ADT_ON) Delta_Time = (DWORD)ADT_val;
        if (Delta_Time == 0) Delta_Time = 1;
        if (FixedDelta) return FixedDeltaValue;
        return Delta_Time;
    };
    void SetDelta(long DeltaTime)
    {
        if (DeltaTime < 0)
        {
            FixedDelta = false;
        }
        else
        {
            FixedDeltaValue = DeltaTime;
            FixedDelta = true;
        }
    }
};

时间: 2024-11-01 13:24:49

Timer计时器在游戏中的重要意义~~(经验之谈)的相关文章

【ANDROID游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2ME的游戏类库与ANDROID游戏开发!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/361.html 由于写书的缘故,博文更新缓慢,大家体谅,今天针对群内常提出动画实现的问题来进行一个详细讲述: 此章节适合没有做过游戏开发的同学学习! 做过Android软件的童鞋们,在学习游戏开发的时候,思维总是被固定在了Android系统组件上!比如动画实现总想着利用BitmapDrawable.Animatio

线程做计时器,和Timer计时器,对比。

问题描述 线程做计时器,和Timer计时器,对比.线程做计时器(线程里的方法)://采集任务控制线程(遍历每个任务对象,任务对象中存储着每个设备信息和接口信息关系,在指定时间间隔的整数倍的时候,将设备对象添加到接口对象即可完成采集)privatevoidRunTask(){while(true){Thread.Sleep(10);//遍历每个采集任务对象foreach(ITaskitinTaskList){//判断当前时间是不是"采集频率"妙的整数倍if(it.TaskCheck())

【IOS-COCOS2D游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/图片缩放后模糊透明/图片不清晰【2013年12月13日补充】/动画播放出现毛边以及禁止游戏中自动锁屏问题!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/507.html 本章节主要为大家介绍在游戏开发过程中经常遇到的两个问题:  1. 解决滚屏背景或拼接地图有黑边! 对于游戏开发中,背景(游戏地图)是必要的元素之一,那么对于大部分游戏的背景都是动态,或者不断移动的:例如RPG中的背景随着人物.主角而移动,那么一般情况下背景都是由地图编辑器(图块)拼出来的,要不就

J2ME游戏中读入文本并存储在String数组中

数组 一个在J2SE中十分钟即告完成的代码,在J2ME中花费了一个下午.是什么样的代码呢?[要求]在游戏中读入文本形式存储的hints [分析]J2ME没有BufferReader,用InputStreamReader吧既然没有BufferReader,也就不要奢望有readLine()了,自己慢慢循环吧 [源代码] 以下内容为程序代码/* read hint-------------------------------------- */ /** * This is the hints * *

Flash游戏中使用漂亮的文字

从标题到StageClear字样,从分数到对话框,游戏中很多地方要用到文字.若是简单的使用Flash标准字体?这算游戏吗?我们需要华丽的文字! 偶们即将系统滴讨论游戏中的文字,目标是--把文字美化到牙齿!! 有一些文字是静态的,可以用各种绘图手段极尽美化之能事--但是也是很有讲究的:然而另一些是动态的,只能用动态文本吗?--废柴!未够班阿! 1 用Flash绘图工具处理静态文字 Flash绘图工具很好用.写下一排文字之后,Ctrl+B 两次,可以将文本打散成填充.这个时候我们就可以用各种方法来处

Flash游戏开发系列一:游戏中的敌人(7)

第六篇:Flash游戏开发系列一:游戏中的敌人. 五.跟踪导弹(续完) 上次我们已经知道怎样让导弹的旋转看起来像那么回事,紧接着就是让导弹运动起来了. 导弹的一些属性,我们需要好好定义一下,这是完整的初始化函数: init = function () {enemy._x = 40;enemy._y = 350;enemy._rotation = 0;enemy_obj.MAXAngle = 6;enemy_obj.MAXSpeed = 4;enemy_obj.speedX = enemy_obj

Flash游戏开发系列一:游戏中的敌人(6)

第五篇:Flash游戏开发系列一:游戏中的敌人. 五.跟踪导弹(续) 前面讲过了如何让导弹朝向玩家,但是真正在应用的时候,不可能这么生硬的体现.大家可能也发现了,导弹的方向一直指向玩家,其实很不真实,那么如何才能更加真实一些呢.常用的方法有几种,我们这里介绍其中一种,其它的大家可能要去参考游戏开发图书了. 在这里,我们使用的方法是,导弹有一个最大转向角度,也就是说,如果转向达到这个角度,就不能再转了,这样,看起来就会真实一些,导弹也就不回一下子面对玩家,看看下面这个例子,我把导弹的最大转向角度设

Flash游戏开发系列一:游戏中的敌人(5)

第四篇:Flash游戏开发系列一:游戏中的敌人. 五.跟踪导弹 看看这个例子,在动画屏幕上按下鼠标,导弹就会跟踪玩家,直到击中玩家: 对于新手来说,一下子就实现它可能不太容易,我们来一点一点的做. (1)导弹的方向 我们先来实现导弹朝向玩家的功能,就像下面这个:(按下鼠标观看) 首先,我们注意到,敌人的导弹是要朝向玩家的,这和前面不同.前面的敌人是一个圆头圆脑的家伙,不用分辨它的方向.我们就先来看一下如何让敌人有方向感. 首先给新手讲解一下基本知识:用鼠标来触发动画. 我们先设定一个变量,布尔类

Flash游戏开发系列一:游戏中的敌人(4)

第三篇:Flash游戏开发系列一:游戏中的敌人. 四(插).半随机移动的敌人 看看这个例子: 我们可以看到,一个敌人按照一定的规律从上面到下面移动.主要的规律是自上而下,但是移动的范围是随机的.这种方法在早期的游戏里面经常使用,包括一些大型的游戏.其实这是一种非常简单的运动方式,但是如果使用得当,也很有威胁. 我们大概瞧一下原理: 敌人每次向一个方向以随机的速度走八步,然后再改变方向,再走八步.在这个例子里面,为了简单说明,敌人走到画面底部以后,我们会让它重新回到原来的位置,重新再走. 我们创建