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

Project1

 找回密码
 注册会员
搜索
查看: 10680|回复: 30
打印 上一主题 下一主题

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

[复制链接]

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5464
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
跳转到指定楼层
1
发表于 2011-4-10 15:12:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 一箭烂YiJL 于 2011-4-11 20:19 编辑

0.序
嗯~潜在问题,用Graphics.resize_screen这个函数来修改的游戏应该都会有。
(欢迎各位试一下会否出现此问题。)我在想着这个会是VX的bug?

虽然(画面)分辨率的确大了,但是窗体没大,所以看不清楚,
除此之外,还会令鼠标系统变得诡异。


1.楸出问题所在
  • 脚本里写下Graphics.resize_screen(640, 480)
  • 开启游戏,马上狂按最小化按钮,直至窗口最小化为止。
  • 过一阵子把窗口最大化,就会发现(用柳柳的姜太公的小岛做宣传对象):
如果不会弄以上的,二楼提供了一个用脚本楸出问题的办法。

正常的(请按一下图片放大至1比1后才做比较):

如果不相信者可以自己开新工程试,或者对照上图的窗口边的大小。
这种情况会发生在忙于弄其他窗口的玩家身上。
虽然分辨率的确大了,但是窗体没大,所以看不清楚,看不仔细。
除此之外,鼠标系统这种平面视觉都会很诡异!!!。

2.解决办法
先要统一使用紫苏大人的精准获取窗口句柄,请复制其中的脚本。然后才能用:
A.直接的方法——在改分辨率前强制最大化:

  1. $window_width  = 640      # 设置的长度
  2. $window_height = 480      # 设置的高度

  3. hWnd = get_hWnd
  4. ShowWindow = Win32API.new("user32", "ShowWindow", "ll", "l")
  5. ShowWindow.call(hWnd, 9)
  6. Graphics.resize_screen($window_width, $window_height)
复制代码
这个方法可能会有碍游戏给人的好感。

B.婉转的方法——不断的改直到有效
  1. $window_width  = 640      # 设置的长度
  2. $window_height = 480      # 设置的高度

  3. hWnd = get_hWnd
  4. GetClientRect = Win32API.new("user32", "GetClientRect", "lp", "l")
  5. rect = [0,0,0,0].pack("l4")

  6. while rect.unpack("l4")[2,3] != [$window_width, $window_height]
  7.   Graphics.resize_screen(544, 416)
  8.   Graphics.resize_screen($window_width, $window_height)
  9.   GetClientRect.call(hWnd, rect)
  10. end
复制代码
这样的好处就是在最大化的时候才真正改动,不用强制启动窗口。

C.更婉转的方法——面对着窗口的时候才会改:
  1. $window_width  = 640      # 设置的长度
  2. $window_height = 480      # 设置的高度

  3. hWnd = get_hWnd
  4. IsIconic = Win32API.new("user32", "IsIconic", "l", "l")
  5. while IsIconic.call(hWnd) != 0
  6. end
  7. Graphics.resize_screen($window_width, $window_height)
复制代码
这办法比以上二种都要好,但是关于while的停顿写的不好,希望有人指正。

欢迎讨论更多有关这问题的解决办法或思路。

点评

我在我的回复那上传了个恶心附件,您帮我研究研究吧。您是vx高手,到时候教教我啊。我知道我笨,但是我努力学习。  发表于 2011-4-24 21:13
我只是来求LZ头像出处的  发表于 2011-4-10 16:47

评分

参与人数 2星屑 +800 收起 理由
DeathKing + 776 讨论鼓励
summer92 + 24 我很赞同

查看全部评分

Lv1.梦旅人

梦石
0
星屑
50
在线时间
83 小时
注册时间
2010-9-16
帖子
54
31
发表于 2011-7-22 17:29:59 | 只看该作者
一箭烂YiJL 发表于 2011-7-21 20:56
Game.exe 控制了打开的分辨率,RGSS202E.dll 监控后来的分辨率,我记得貌似这个配搭会令窗口边有一点点 ...

不是的,dll上面有个地图限制,最大只能是640*480,6r上有人解除过这种限制,改过后的并没有任何bug,如果需要的话,我可以发上来给你看看

点评

我怎么感觉没限制呢,多少大小都木问题,后来也有发一些新的DLL  发表于 2011-7-22 18:00
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5464
在线时间
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 当然是,但是在脚本里再修改分辨率的话就应该会出现这个潜在问题。
回复 支持 反对

使用道具 举报

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
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

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
星屑
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.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5464
在线时间
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
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.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5464
在线时间
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操作只维持在改分辨率和最小化的同时。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 02:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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