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

Project1

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

[随意闲聊] 默认的悲哀再度出现

[复制链接]

Lv1.梦旅人

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
帖子
3225
跳转到指定楼层
1
发表于 2011-9-2 23:09:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
这个帖子http://rpg.blue/thread-207800-1-1.html
里面的那个解决方法原本为了节约资源,
所以直接用了 self.bitmap.clear ,
因为以为成功整合了所以也没顾虑太多,
但是我忘了那个该死的 RPG::Cache 也是节约资源的存在,
结果导致相同的图片也会消失不见,
但是这也知道能怪自己一时没注意到这项默认的悲哀。
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到[email protected]咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
41849
在线时间
7647 小时
注册时间
2009-7-6
帖子
13525

开拓者贵宾

2
发表于 2011-9-2 23:11:51 | 只看该作者
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
推倒一切吧少女!

点评

把世界妹纸化!  发表于 2011-9-2 23:21
抱歉,我是男的。  发表于 2011-9-2 23:15
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1702
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

3
发表于 2011-9-2 23:43:13 | 只看该作者
bitmap在无论什么情况下,都不能用a = b 而得用a = b.clone
举例
a.bitmap = RPG::Cache.character(001-actor01).clone
我所总结出的血的教训

点评

同样受到了教训  发表于 2011-9-3 12:41
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

4
发表于 2011-9-2 23:46:12 | 只看该作者
本帖最后由 熊猫 于 2011-9-2 23:48 编辑


我在想是不是真正的纯面向对象要想赋值都得用a = b.clone啊
所有变量储存的都是实体对象的指针……

当然Ruby不算我所谓的纯……类似于String神马的有处理特权。。可以直接赋值而不用clone创建新的对象……

不过都像我理解的这样面向对象编程可就麻烦了………………
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1702
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

5
发表于 2011-9-2 23:48:57 | 只看该作者
没错,这就是即时变量与非即时变量的区别
即时变量包括:布尔,数字,字符
其他的都得用clone,否则就是指针
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
953 小时
注册时间
2007-4-25
帖子
805
6
发表于 2011-9-3 00:17:55 | 只看该作者
精灵使者 发表于 2011-9-2 23:43
bitmap在无论什么情况下,都不能用a = b 而得用a = b.clone
举例
a.bitmap = RPG::Cache.character(001-act ...

乱嚼舌头。Cache 存在便是为了共享内存,若需分配新内存,又何须通过 cache 这层,索性 Bitmap.new 了。

bitmap在无论什么情况下,都不能用a = b 而得用a = b.clone [...]

在用“无论什么”这般强烈字样时可不敢草率。``a = b'' 是引用拷贝,``a = b.clone'' 是值拷贝,两者各有其用。前者常用于传递调用者分配的对象(给成员变量或方法局部变量),使被调用者有权利修改调用者原本的对象。若是用 Object#clone 拷贝值,被调用者便止于修改复件而无法修改原件。

@熊猫:
我在想是不是真正的纯面向对象要想赋值都得用a = b.clone啊

不是。

所有变量储存的都是实体对象的指针……

在有 GC 的程序语言论域中最好避免使用“指针”这样的术语而用“引用”。指针虽含有“引用”之意,但毕竟容易使人误以为 Ruby 也有 C 系语言中的指针。

[...] 类似于String神马的有处理特权。。可以直接赋值而不用clone创建新的对象……

此于“纯”否何干?Ruby 解释器在语法分析时每见 String 字面值便分配一个新的 String 对象,自然不用用户来克隆。若果想要在运行时创建可用 String.new。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
41849
在线时间
7647 小时
注册时间
2009-7-6
帖子
13525

开拓者贵宾

7
发表于 2011-9-3 01:01:19 | 只看该作者
我记得bitmap还是sprite不能clone来着。
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1702
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

8
发表于 2011-9-3 22:47:03 | 只看该作者
本帖最后由 精灵使者 于 2011-9-3 22:48 编辑

不过我确实测试clone是可以通过的。
@苏小脉
乱嚼舌头。Cache 存在便是为了共享内存,若需分配新内存,又何须通过 cache 这层,索性 Bitmap.new 了。
在用“无论什么”这般强烈字样时可不敢草率。``a = b'' 是引用拷贝,``a = b.clone'' 是值拷贝,两者各有其用。前者常用于传递调用者分配的对象(给成员变量或方法局部变量),使被调用者有权利修改调用者原本的对象。若是用 Object#clone 拷贝值,被调用者便止于修改复件而无法修改原件。
这一点很重要,如果首先共享了内存而又对共享后的东西作改动的话,所有的Cache的被调用者将会调用修改后的东西,那会是很危险的。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

9
发表于 2011-9-4 00:54:29 | 只看该作者
苏小脉 发表于 2011-9-3 00:17
乱嚼舌头。Cache 存在便是为了共享内存,若需分配新内存,又何须通过 cache 这层,索性 Bitmap.new 了。
...

嗯……确实不应该直接说指针……实际就是指向物件的地址……引用……学习了

纯的问题……看你的解释貌似是[分配一个新的String对象]就等于clone然后赋值了,这部分操作被ruby封装了。

我的理解对不对?
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
953 小时
注册时间
2007-4-25
帖子
805
10
发表于 2011-9-4 04:39:29 | 只看该作者
本帖最后由 苏小脉 于 2011-9-4 04:41 编辑
精灵使者 发表于 2011-9-3 22:47
不过我确实测试clone是可以通过的。
@苏小脉
乱嚼舌头。Cache 存在便是为了共享内存,若需分配新内存,又何 ...


仆并未言道不能“通过”,只是说如若每次都克隆一份,那将失去 Cache 共享内存、避免不必要内存拷贝的意义。仅有的好处便是数字图像解码的过程被 cache 了。

>> 若是用 Object#clone 拷贝值,被调用者便止于修改复件而无法修改原件。

这一点很重要,如果首先共享了内存而又对共享后的东西作改动的话,所有的Cache的被调用者将会调用修改后的东西,那会是很危险的。

Ruby 的危险功能不知其数,然 Ruby 设计哲学是在给用户最大限度的自由的同时又相信用户有自己判断何所为何所不为的能力,更不提“被调用者修改调用者传递的数据”是各种编程语言中都常用的手法。永远使用数据拷贝的手法在函数式递归编程中更常用,但依赖于强大的 GC 性能。

@熊猫
看你的解释貌似是[分配一个新的String对象]就等于clone然后赋值了,这部分操作被ruby封装了。

或许仆于君之原句理解有误,理当先确认一番。

  1. a = 'hello'
  2. b = 'hello'
  3. p a.object_id == b.object_id # => false
复制代码
“可以直接赋值而不用clone创建新的对象”可是指以上现象?

此处并非一个克隆过程,但与克隆的结果相同 [1]。盖因 Ruby 解释器在词法、文法分析时会构建并维护一个内部的抽象语法树,而两个 "hello" 单词(须得是字符串字面值)则分别会成为语法树的两个(一致的)节点。之后解释器便从树根起步走遍整个树,见到第一个 "hello" 节点,便和 Ruby 堆通信并生成一个 String 对象,见到第二个 "hello" 节点,又和 Ruby 堆通信并生成另一个 String 对象,如此 Ruby 堆中便有了两个内容为 "hello" 的 String 对象,但其过程又非是克隆。

[1] 即生成了两个一致的字串 "hello"。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-7-6 21:06

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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