设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 一箭烂YiJL
打印 上一主题 下一主题

[RMVX发布] 新手教程——计算累计时间Window_(2)

  [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
2 小时
注册时间
2010-12-6
帖子
23
11
发表于 2010-12-6 23:36:41 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1342
在线时间
675 小时
注册时间
2009-11-11
帖子
2790
12
发表于 2010-12-7 10:19:37 | 只看该作者
索引~~索引~~~,一直为游戏时间这个DD头疼...

点评

- -没问题的,你懂的~~~  发表于 2010-12-8 10:46
请注意这是“教程”!不是实用脚本!  发表于 2010-12-7 18:36

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
13
发表于 2010-12-7 11:33:32 | 只看该作者
赞一个,还有图解,这年头这么用心的人越来越少了:)

其实沙发的建议很好,并不是统一性的问题,而是严谨性的问题。RM 默认的这种计算方式依赖于帧计数和一个固定帧率,在游戏逻辑耗时太久的时候,就不能做到精确的计时了,特别是在硬件条件差的机器上。如果游戏逻辑在人眼能够察觉的间隔内还没有运行完毕,游戏的帧计数仍然是从间隔之前的量开始增长,这样就会导致时间“变慢”。Ruby 的 Time 对象可以获取系统时间,而现代的计算机的系统时间都是由独立的实时时钟芯片处理的,所以不但和某个游戏进程的帧率无关,和 CPU、I/O 时间也无关,即便游戏在某一处逻辑耗时太久,接下来刷新时间时获取到的也是真实的挂钟时间(实耗时间)。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42344
在线时间
7599 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

14
发表于 2010-12-7 12:08:34 | 只看该作者
回复 苏小脉 的帖子

是在初始化的时候才获取时间计算吗?会不会因为修改系统时间达到特殊目的?

点评

随时获取系统时间;修改是难免的(单机),但是可以放烟雾弹……=v-  发表于 2010-12-7 13:39
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
23 小时
注册时间
2010-6-17
帖子
58
15
发表于 2010-12-7 12:49:23 | 只看该作者
= =真要想修改的话,无论怎么计时都能修改的说
关键是计时目的的问题
为了帮助玩家记录通关时间?那么玩家的SL该如何处理呢
对游戏内容产生影响?那么又何苦追求计时准确性或者真实性呢
实际上除了特殊需要,在存档时记录下存档时间,让玩家知道哪个存档是最新的就够了吧= =

点评

总帧数是通过 Marshal.dump 序列化到存档文件的,所以可以修改 o.o  发表于 2010-12-7 20:56
教学用的方法是以总帧数计算,SL后都不会改变。还有这是个教程!我并不是追求什么精确时间似的。  发表于 2010-12-7 18:18
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
16
发表于 2010-12-7 13:37:33 | 只看该作者
回复 路过的小白 的帖子
为了帮助玩家记录通关时间?那么玩家的SL该如何处理呢

在本机,从来就没有绝对避免 S/L 的方法,只有防君子的权变措施。
对游戏内容产生影响?那么又何苦追求计时准确性或者真实性呢

在播放一个音频时,你可能希望让游戏的某个线程与播放同步,这时你就需要让该线程精确地等待这么多个单位的时间。又如需要在特定时间内完成的任务,你不想因为这个时间随着玩家的机器性能不同而不同。当然,这些都可以归类于你说的“特殊需要”,在单机游戏领域不精确计时确实并非致命。如果咱们的上下文换到联机对战以及多人在线游戏,那精确计时就是保证公平竞技的一个必要前提了。

点评

苏前辈请看下边的解说  发表于 2010-12-7 18:15
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5454
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
17
 楼主| 发表于 2010-12-7 18:14:29 | 只看该作者
回复 fux2 的帖子

苏小脉前辈(好像)错了,我的教程曾说过initialize里加进update能免去开启窗口过一阵子才显示出来,
所以fux2前辈说的没错,只会在initialize时才开始计算时间,
所以对于之前所说用Time代替PlayTime的影响是很小的,
反而为补充站里的那个方法能够节省资源(原因自己参透)。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
66 小时
注册时间
2010-7-13
帖子
366
18
发表于 2010-12-7 19:46:14 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
19
发表于 2010-12-7 21:23:05 | 只看该作者
本帖最后由 苏小脉 于 2010-12-7 21:43 编辑

回复 一箭烂YiJL 的帖子

initialize里加进update能免去开启窗口过一阵子才显示出来,
所以fux2前辈说的没错,只会在initialize时才开始计算时间,
所以对于之前所说用Time代替PlayTime的影响是很小的,

我怎么感觉你没仔细看我十三楼的回复呢 XD
当你的预期帧率是 40 fps 的时候,如果实际帧率只有二三十,说明游戏逻辑耗时太大导致渲染频率根不上,所以无法达到预期的四十,这就是我说的那种情况。这种情况下你就会感觉游戏时间所谓的“秒”的滴答频率变小了。
你可以在 Scene_Menu 刷新的时候加一句:
  1. 5000000.times {}
复制代码
然后看看这种按帧计数计算的游戏时间的滴答频率。我在本机的 Intel Core I7-720 上测试,实际帧率从 40 降到了 30 fps,换句话说一秒只刷新了 30 次,但由于 Graphics.frame_rate 固定为 40,所以需要更新到 40 次的倍数时才会让游戏时间增长一秒,也就是实际时间的 4/3 秒才等于游戏时间的 1 秒。根据 CPU 性能的不同,这个受到的影响也不同。
反而为补充站里的那个方法能够节省资源(原因自己参透)。

这个其实默认脚本就做了,不知道“站里的那个方法”为什么没做。默认脚本判断的是:
Graphics.frame_count / Graphics.frame_rate != @total_sec
比你模上 60 来的简单。当然默认脚本里 refresh 又重新计算了 Graphics.frame_count / Graphics.frame_rate 一次,所以还是有冗余了。你完全可以让这个除法在一帧之间只进行一次。

点评

但是考虑这样的情况:系统计时,要求玩家在60s内取回某件物品,40fps平均消耗45s,那么如果机器悲剧的20fps的玩家基本上无法完成任务。  发表于 2011-1-3 03:45
关于时间的计算,看起来似乎是个两难问题呢,愚者还没想出一个合理的解决方案。从一个角度来看,获取系统时间是最精确的  发表于 2011-1-3 03:43
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5454
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
20
 楼主| 发表于 2010-12-7 22:44:07 | 只看该作者
回复 苏小脉 的帖子

我所说的"initialize时才开始计算时间"意思只是在场景开始时才执行Window_PlayTime。
不会不断在系统中执行(意思就是Graphics.frame_count会不断增加,但Window_PlayTime不会不断执行),才不会对系统构成很大负担的意思。(所以我个人不执着在Time和PlayTime之间,何况这只是个教程,不过让其他人看到这些对话也算是教程的一部分吧!表现挺乐观的~_~)

另外我说"补充站方法能较节省资源"的原因是,补充站那儿的update会根据:
if sec > @total_sec % 60 or sec == 0
才会调用到refresh,但秒数依然要更新,所以在这句之前有:
sec = (Graphics.frame_count / Graphics.frame_rate) % 60
至于关于脚本已经预设了Graphics.frame_count / Graphics.frame_rate != @total_sec一事,
则是因为教程始终也是教程,也要解释一下的。至于冗余方面则是我考虑不周全的问题。
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 12:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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