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

Project1

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

[RMVX发布] 解决脚本改分辨率潜在问题(欢迎进入讨论)

[复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

21
发表于 2011-4-12 18:36:27 | 只看该作者
这样试试……强制修改窗口的WIDTH和Height然后在执行resize

点评

(呼应15楼?否则无视之)API Hook? 图片数字帖子(缩放)里刚解决编辑dll,马上搞拦截技术?= =表示应付不能...  发表于 2011-4-14 21:25
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
22
发表于 2011-4-13 06:16:43 | 只看该作者
回复 一箭烂YiJL 的帖子
那么也就是一定要修改WindowProc函数了。

不一定,可以通过SetWindowsHookEx注册一个窗口消息的过滤器,不过本质上还是和替换 WIndowProc 一样是建立了一个自己的钩子函数。

听您说Graphics.update会导致GetMessage无法获得,那么纯Ruby就不可能了。(PeekMessage貌似不是好的办法。)

GetMessage 可以获得,但不会获得全部,有相当一部分消息会被 RGSS 底层的消息循环取走,这个在沉影的鼠标贴里和她讨论过。PeekMessage 只是不从消息队列拿走消息,仍然不能让消息掠夺的现象改观。

实际上我想问的是while的语法,我用while的目的是让RGSS暂停,当RM窗口为前台窗口的时候,才继续(才Graphics.resize_screen)。Ruby有一个能够暂停的方法么?一直循环在这个空的循环中似乎不是太好。

这个和后台运行的判断方法一样,后台运行是处理 WM_ACTIVATEAPP——一个当窗口获得键盘焦点时系统会发送的消息。要是纯 Ruby 能做到,后台运行就不需要 DLL 了。纯 Ruby 的话只能使用 WaitForSingleObject 或类似的函数,但 NT 并没有预设类似得到焦点的事件供 WaitForSingleObject 使用。

在 Ruby 中可以通过睡眠线程让当前线程的执行暂停。

  1. sleep(0.02)
复制代码
可以考虑在空的循环中添上 sleep 让线程睡眠,这是以判断的敏感度换取了 CPU 时间——在线程睡眠的时候 CPU 可以去干别的事,但同时这个判断相比之前敏感度降低了。这之间的差别在单核 CPU 架构下尤为明显,CPU 唯一内核的大部分时间都被这个空循环占用,在处理系统中其它程序的时候就没那么敏感了,对于最终用户来说,他们感觉到的就是一个字:“卡”。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
23
 楼主| 发表于 2011-4-14 21:58:25 | 只看该作者
回复 苏小脉 的帖子
sleep

表示纯sleep无参数会:
由于我这台机是双核,在有sleep的情况下,第一的CPU(单核的反应?)的反应比第二的CPU使用量较为高,反而不用时第一的CPU(单核的反应?)的反应比第二的CPU使用量较为低。
感觉不用较好...但停一秒时的CPU效果理想,但灵敏度就在1秒的范围之内。就把整个空while写成:
  1. sleep(1) until IsIconic.call(Handle::HWND) == 0
复制代码
那么就要在CPU和灵敏度之间取一个平衡。



之后对外解释一下B(第二个)方法为什么先要resize_screen(544, 416)再resize_screen正确分辨率,这是因为resize_screen一次后再次同一参数执行会无效,也就是Graphics会记录resize_screen最近一次的改分辨率数字,输入同上次参数时会无动作。同时归纳出这个方法会更消耗CPU操作。

ps:消耗CPU操作只维持在改分辨率和最小化的同时。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
24
发表于 2011-4-15 00:40:09 | 只看该作者
回复 一箭烂YiJL 的帖子
表示纯sleep无参数

无参数时使用默认值 0,表示永远睡眠。

由于我这台机是双核,在有sleep的情况下,第一的CPU(单核的反应?)的反应比第二的CPU使用量较为高,反而不用时第一的CPU(单核的反应?)的反应比第二的CPU使用量较为低。

没看明白什么意思,你是说添加了 sleep 反而提高了 CPU 使用率?断无这个道理,不知道你是怎么测试的。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
25
 楼主| 发表于 2011-4-15 15:05:17 | 只看该作者
回复 苏小脉 的帖子
sleep无参数时使用默认值 0,表示永远睡眠

奇怪的没有...写sleep不会永远睡眠啊,例如:
  1. sleep    # 不会永远睡眠
复制代码
如果写这样就会永远睡眠:
  1. sleep(0);sleep
复制代码
那么这样就无效:
  1. sleep(0)            # 或者是:
  2. sleep(0);sleep(0)   # 或者是:
  3. sleep   ;sleep      # 都不会永远睡眠
复制代码
貌似sleep(无参数)只是一个执行。

您上楼(我)有点话说错了><

我双核,任务管理器的时候会有两个CPU显示块,用sleep和不用sleep都各有高低,分别相反。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
26
发表于 2011-4-16 01:41:35 | 只看该作者
一箭烂YiJL 发表于 2011-4-15 15:05
回复 苏小脉 的帖子

测了一下,sleep 默认参数为 0 这个好像是《Programming Ruby》的文档失误,为 0 时 sleep 应该是立即返回,昨天我是依据这个说的,很明显错了。

但如果没有传递 sleep 参数,那确实是表示永久睡眠,这是各种文档都明确说明的。process.c 中 sleep 的实现也是如此显示:
  1. static VALUE
  2. rb_f_sleep(int argc, VALUE *argv)
  3. {
  4.     time_t beg, end;

  5.     beg = time(0);
  6.     if (argc == 0) {
  7.         rb_thread_sleep_forever();
  8.     }
  9.     else if (argc == 1) {
  10.         rb_thread_wait_for(rb_time_interval(argv[0]));
  11.     }
  12.     else {
  13.         rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..1)", argc);
  14.     }

  15.     end = time(0) - beg;

  16.     return INT2FIX(end);
  17. }
复制代码
当没有参数时调用 rb_thread_sleep_forever。

RM 要么是刻意做了什么手脚,要么就是在嵌入解释器的时候没考虑周全产生了 BUG。

我双核,任务管理器的时候会有两个CPU显示块,用sleep和不用sleep都各有高低,分别相反。

CPU 在执行 Ruby 程序的时候如果得到空闲,自然又跑去执行别的程序了。Ruby 睡眠了线程就相当于自动放弃了当前的时间片。你应该看的是 ruby.exe (或者 Game.exe,如果用的是 RM)这个进程的 CPU 使用率。

点评

嗯,无论是嵌入 Ruby 还是做本地扩展,最需要考虑的问题就是并发(线程)问题了。  发表于 2011-4-17 00:36
RM F1手册也这么写,但不能排除其它线程的因素。我这台电脑如见资源贫乏,没有Ruby.exe。上述其余的都没什么认识...┘口└  发表于 2011-4-16 20:45
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
432
在线时间
4175 小时
注册时间
2010-6-26
帖子
6474
27
发表于 2011-4-24 20:31:38 | 只看该作者

我给您上传了个附件,您看看有多恶心吧

本帖最后由 eve592370698 于 2011-4-24 21:11 编辑

我自己东拼西凑弄了个vx1024×768分辨率的脚本,就是用起来挺那个,不知道怎么说。

GTBS1024x768D.rar

3.9 MB, 下载次数: 57

点评

msn联络吧~  发表于 2011-4-24 21:39
潜水,专心忙活三次元工作了……
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
19 小时
注册时间
2011-5-4
帖子
27
28
发表于 2011-5-10 15:13:09 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
83 小时
注册时间
2010-9-16
帖子
54
29
发表于 2011-7-20 19:58:43 | 只看该作者
直接改个game.exe 和RGSS202E.dll  八紫云 大大曾经扔给我 两个分辨率的 一个640*480 一个 800*600 都是一打开就是分辨率的大小  并没有从脚本中加载 不过可惜的是 地图分辨率并没有解限
lz可以考虑一下

点评

来了,来了  发表于 2011-7-22 15:24
下面这位咱密聊行吗。。。  发表于 2011-7-21 14:03
XD,这东西很好啊,可否发给我下,我试着工程跟DLL整合,符合640*480 800*600 可发到 [email protected]  发表于 2011-7-21 12:01
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
30
 楼主| 发表于 2011-7-21 20:56:56 | 只看该作者
零度 发表于 2011-7-20 19:58
直接改个game.exe 和RGSS202E.dll  八紫云 大大曾经扔给我 两个分辨率的 一个640*480 一个 800*600 都是一 ...
直接改个game.exe 和RGSS202E.dll

Game.exe 控制了打开的分辨率,RGSS202E.dll 监控后来的分辨率,我记得貌似这个配搭会令窗口边有一点点变化,而且 RGSS202E.dll 似乎也会出现同 SE 无法连续播放的问题。

地图分辨率并没有解限

是因为游戏脚本的 Viewport 问题,可以搜索一下关键分辨率 544 和 416 的 Viewport 。还有很多问题都是与游戏内部坐标有关的,你可以自己修改一下,或者找现成的修改好的工程。

都是一打开就是分辨率的大小  并没有从脚本中加载

被修改后的 Game.exe 和 RGSS202E.dll 当然是,但是在脚本里再修改分辨率的话就应该会出现这个潜在问题。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-13 11:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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