| 赞 | 3 |
| VIP | 333 |
| 好人卡 | 2 |
| 积分 | 1 |
| 经验 | 1450446 |
| 最后登录 | 2019-5-29 |
| 在线时间 | 615 小时 |
Lv1.梦旅人 66RPG站长
- 梦石
- 0
- 星屑
- 54
- 在线时间
- 615 小时
- 注册时间
- 2005-10-10
- 帖子
- 5734
  
|
时间可以做个简单测试,楼上。首先加一个高精度计时器:http://rpg.blue/web/htm/news225.htm,便于计算毫秒数。
然后640*480个点的绘制运算:
- p "测试开始"
- a = $sys_timer.now()
- $aseesa = Sprite.new
- $aseesa.bitmap = Bitmap.new(640,480)
- color=Color.new(255,255,255)
- for i in 1..640
- for m in 1..480
- $aseesa.bitmap.set_pixel(i, m,color )
- end
- end
- a = $sys_timer.now() - a
- p a.to_i,"先创建Color,绘制填满640×480个点"
- a = 0
- $aseesa.bitmap.dispose
- $aseesa.dispose
- a = $sys_timer.now()
- $aseesa = Sprite.new
- $aseesa.bitmap = Bitmap.new(640,480)
- for i in 1..640
- for m in 1..480
- $aseesa.bitmap.set_pixel(i, m,Color.new(255,255,255))
- end
- end
- a = $sys_timer.now() - a
- p a.to_i,"每次创建Color,绘制填满640×480个点"
- a = 0
- $aseesa.bitmap.dispose
- $aseesa.dispose
- a = $sys_timer.now()
- $aseesa = Sprite.new
- $aseesa.bitmap = Bitmap.new("white")
- a = $sys_timer.now() - a
- p a.to_i,"从图片读取,填满640×480个点"
- a = 0
- $aseesa.bitmap.dispose
- $aseesa.dispose
- a = $sys_timer.now()
- $aseesa = Sprite.new
- $aseesa.bitmap = Bitmap.new(640,480)
- $aseesa.bitmap.fill_rect(0,0,640,480,Color.new(255,0,0))
- a = $sys_timer.now() - a
- p a.to_i,"绘制矩形,填满640×480个点"
复制代码
在我电脑的情况:
第一种情况:290毫秒
第二种情况:910毫秒
第三种情况:15毫秒 (用的"white"是photoshop做的640*480图)
第四种情况:2毫秒
这就是为什么说最好不要用手动操作象素,290毫秒和15毫秒的差距。
当然,毫无疑问,这些图形生成之后就已经是一个内存对象,再次加载的速度理论上是一样的——这就是楼上所说的加载速度问题,预加载等方法。但是楼上和我讨论的不是一个事情,我现在说的只是用不同方式创建图象(生成BITMAP的过程)---->然后显示图象,这个过程的速度。楼主问的也是为什么同样是640×480个颜色点的一次创建,手动操作象素点要比读取图片的创建速度要慢。结论实际上就是“计算比拷贝要慢”这样一句。
至于创建完毕后从内存加载到显卡速度基本都是相同的。
这个东西的引申就是当年曾经考虑使用set_pixel制作图片的特效,形成斜切或者透视的效果,以此完成小幅度的3D效果(SFC的那种)。但实际上set_pixel运算压力太大,这么做之后帧数只能有0.5到1帧左右。虽说现在电脑硬件升级了,能有1-3帧了,但set_pixel手动生成还是不太可取的方法。
Ruby的for循环效率有问题?这点我倒不知道。不知怎么追踪他的效率,和其他语言做对比?我没研究过Ruby运行时候的汇编情况,这里就不多发表意见了。 |
|