游戏开发论坛

 找回密码
 立即注册
搜索
楼主: 123321

关于游戏速度

[复制链接]

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-8-16 18:40:00 | 显示全部楼层

Re:关于游戏速度

TIMER和DO LOOP在原理上是不一样的, 我用多个TIMER模拟多线程.

87

主题

790

帖子

806

积分

高级会员

Rank: 4

积分
806
QQ
发表于 2005-8-16 19:30:00 | 显示全部楼层

Re:关于游戏速度

能不能举个例子说说
Do
DoEvents
xxxxx
Loop
怎么用

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-8-16 19:40:00 | 显示全部楼层

Re:关于游戏速度

不用我举例, 到处都是DO LOOP的例子, 我偏偏不用, 以前在DOS我喜欢用GOTO ,那些TV3D的例子里基本都是用DO LOOP的.

TIMER是个控件, DO LOOP是命令, DO LOOP不象控件那么容易操作,
因为我要控制每个钟的开和关, 游戏里的东西都是互相影响的,
别以为只是射击一个坦克?

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2005-8-16 21:50:00 | 显示全部楼层

Re: Re:关于游戏速度

游戏之家: Re:关于游戏速度

不用我举例, 到处都是DO LOOP的例子, 我偏偏不用, 以前在DOS我喜欢用GOTO ,那些TV3D的例子里基本都是用DO L...



一切和游戏相关的渲染、逻辑判断等都可以包含在主循环里面。
不知道你说“不象控件那么容易操作”指的是什么?Timer就那么点属性,完全可以用类模拟,干吗还死守着它?
游戏编程尽量少用控件,尤其是和主循环相关的。



32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2005-8-16 21:51:00 | 显示全部楼层

Re:关于游戏速度

Re:关于游戏速度

能不能举个例子说说
Do
DoEvents
xxxxx
Loop
怎么用


比如类似FC上的坦克游戏:


' 此处放初始化的代码

Do ' 主循环开始
' 此处放逻辑判断代码,比如炮弹是否打中坦克
' 此处各单位更新,比如坦克的位置
' 此处放绘图渲染代码,比如绘制坦克在屏幕上
' 此处放时间约束的代码,比如限定FPS为60
Loop Until Exit1 ' 当满足条件时退出

' 此处放关闭程序的相关代码

靠,GameRes不能同时引用两人的话。

50

主题

382

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2005-8-16 23:06:00 | 显示全部楼层

Re:关于游戏速度

Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim OldTickCount  As Long

Public Sub ControlSpeed(Num As Long)
    Do While GetTickCount - OldTickCount < Num
        Sleep 1
        DoEvents
    Loop
    OldTickCount = GetTickCount
end sub

一个控速的方法,当Num=40 的时候,速度为 25 FPS

50

主题

382

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2005-8-16 23:11:00 | 显示全部楼层

Re:关于游戏速度

Do...Loop 才是王道

我也曾是 Timer 的拥护者,但我遭到惨的教训(游戏速度慢的要死)!

87

主题

790

帖子

806

积分

高级会员

Rank: 4

积分
806
QQ
发表于 2005-8-17 00:42:00 | 显示全部楼层

Re:关于游戏速度

不错,看了这段代码我就可以建立自己对话框了,而不要老用msgbox

87

主题

790

帖子

806

积分

高级会员

Rank: 4

积分
806
QQ
发表于 2005-8-17 00:53:00 | 显示全部楼层

Re:关于游戏速度

再问一个问题,FPS是怎样来衡量速度的大小的,标准是什么
我要控制每1s执行一次这一段程序,那又该怎么控制?

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-8-17 10:27:00 | 显示全部楼层

Re: 关于游戏速度

Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim OldTickCount  As Long

Public Sub ControlSpeed(Num As Long)
    Do While GetTickCount - OldTickCount < Num
        Sleep 1
        DoEvents
    Loop
    OldTickCount = GetTickCount
end sub

一个控速的方法,当Num=40 的时候,速度为 25 FPS


这是个好办法

但一般情况下我们不通过控制FPS来控制游戏速度,而是直接控制游戏进程。也就是说我们不控制图形数据渲染的速度,而是控制图形数据更新的速度,看下面的伪代码

示例一:
Do While True
    Call UpdateFrame() ' 更新每帧的数据
    Call RenderFrame() ' 渲染帧
Loop

示例一的游戏速度是无法控制的,基本上机器有多快游戏速度就有多快

示例二:
Do While True
    If GetTickCount - OldTickCount >= Num Then
        Call UpdateFrame() ' 更新每帧的数据
        OldTickCount = GetTickCount
    End If
    Call RenderFrame() ' 渲染帧
Loop

示例二的游戏速度是可以控制的,但FPS是不可控制的

大家经常听说引擎FPS如何如何多高,就是上面的做法,FPS和游戏速度实现了分离,FPS越高就证明了每次循环占用的时间越少,就证明引擎的效率高,但并不影响游戏速度,而且还可以实现不同对象不同速度,但游戏速度不会高于FPS
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 08:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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