游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1594|回复: 3

Thread .Sleep(500)后你的线程睡了多久?wxh zt

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2005-4-9 01:55:00 | 显示全部楼层 |阅读模式

0o0 发表于 2005-4-3 20:38:34  
 
我们在J2ME中继承Canvas类的时候一般会再实现Runnable接口,实现多线程的效果个人认为实际上这边的线程不过是起到一个定时器的作用,完全可以用一个Timer或者用一个Inner class来实现这个的功能,在这里不对这个做过多的讨论。

我们的run()这个函数一般是实现这样的功能,定时的处理游戏逻辑gameLogic()和重画屏幕paint()。注意这里的定时是本文的重点,如果执行游戏逻辑和重画屏幕的间隔时间不为固定的话。一定破坏游戏性和游戏画面的真实性。

好了,我们看看一般的处理方法()

public void run() {

   while (true) {

     gameLogic();//处理游戏逻辑

     repaint();//调用paint()重画屏幕

     Thread.sleep(500);//线程sleep0.5秒

   }

}

看上去好象是每次的间隔就是0.5秒。不过有没有想过如果一个复杂逻辑的游戏gameLogic(),和paint()实际上也是需要不少时间来处理的,而且对于一个复杂逻辑的游戏来说每次处理的时间长度都不相同,可能第一次gameLogic()+paint()的时间是0.1秒下一次又有可能是0.01秒。这样不就造成了间隔时间的不固定吗。所以我们必须把gameLogic(),和paint()的运算时间计算进去,就象下面那样。

    public void run() {

        time0 = System.currentTimeMillis();

        while (true) {

            time1 = System.currentTimeMillis();

            timePassed = time1 - time0;

            time0 = time1;

            gameLogic();//处理游戏逻辑

            repaint();

            time1 = System.currentTimeMillis();

            if (time1 - time0 < RUN_RATE) {

                try {

                    Thread.sleep(RUN_RATE - (time1 - time0));

                }

                catch (InterruptedException e) {

                }

            }

        }

    }


8

主题

71

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2005-4-9 22:46:00 | 显示全部楼层

Re:Thread .Sleep(500)后你的线程睡了多久?wxh zt

还有一种情况没考虑
gameLogic();
repaint();
可能本身就已经超过了RUN_RATE, 第二种方式就CPU百分百了

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2005-4-10 19:45:00 | 显示全部楼层

老大,这些文章对游戏好像用处不大吧。

rt

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
发表于 2005-4-10 20:43:00 | 显示全部楼层

Re:Thread .Sleep(500)后你的线程睡了多久?wxh zt

sleep能够保证你睡眠够指定时间,但是可能会多一些。因为windows毕竟实时性不行。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 04:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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