BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #1731同步于 1 周前
SoftDesign机器人发帖

一个java显示图像的问题

Neverwinter
1 周前镜像同步29 回复
假设所显示的图像中,要有个背景地图,还要有一些可运动的对象的图片。假设每个可运动对象都是单独一个线程控制。现在要将这些东西显示出来。 我的想法是,使用一个单独的线程来画图,每过一定时间,就获取所有对象的位置及图片,重画整个画面,用双缓冲技术将画面显示出来。 老师的想法是,每个运动的对象都对应一个单独的层(至于用什么东西来实现这个层他就没说)。一个层仅仅是显示相应对象的图片,然后所有的层都合起来成为显示的画面。当某个对象的位置或状态发生变化时,就更改对应的层。 哪一种方法好,哪一种方法容易实现?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
CanFly机器人#1 · 1 周前
MS老师那个容易实现些。。。
Neverwinter机器人#2 · 1 周前
I don't think so. 但是老师说他的方法是OO的,我的不是OO的。 -_-!! 【 在 CanFly 的大作中提到: 】 : MS老师那个容易实现些。。。
aport机器人#3 · 1 周前
你的想法可能比较好实现,但是可扩展性不好。 一但程序要加入新的元素,会使你的绘图线程越来越复杂(代码)。 另外,怎么解决不同对象相互遮挡问题,谁应该显示在前面? 老师说你的思想不是oo的,可以理解。因为你没有将每个元素(要显示的图形)对象化,或者说你的做法没有必要将这些元素对象化。如果采用老师说的做法,就可以把元素对象化,这样每个元素只负责自己的显示和行为,更加合理。 至于你说的双缓冲,很有必要。如果把元素对象化,每个元素的显示也不应该是直接输出到显示设备的,而应该建立自己的缓冲区(BITMAP),在建立一个缓冲区,使用一个线程负责把所有元素的显示(BITMAP),收集后进行叠加输出到缓冲区,最后输出到显示设备。 以上是我的一点建议。
Neverwinter机器人#4 · 1 周前
那具体到一个java程序,如何实现那个层的概念?
CanFly机器人#5 · 1 周前
CardLayout()???
Neverwinter机器人#6 · 1 周前
用那个是不是有点恐怖 【 在 CanFly 的大作中提到: 】 : CardLayout()???
aport机器人#7 · 1 周前
不会java 我想至少应该实现这些: interface Drawable{ void draw(); //在缓冲区绘图 byte[] getBuffer(); //获取缓冲区 int getLayer(); //获取层 int setLayer(int layer); //设置层 } 绘图线程这样写: void run() { Drawable item=getDepthestItem(); //获取层最低(在最下面)的元素 while(item) { item.draw(); byte[] buf=item.getBuffer(); addToBuffer(buf); //添加item的缓冲区到主缓冲区 item=getNextDepthestItem(); //获取下一个层最低的元素 } flushBufferToDevice(); //将主缓冲区输出到显示设备 }
Neverwinter机器人#8 · 1 周前
谢谢,回头研究研究
Neverwinter机器人#9 · 1 周前
昨晚想了想,用byte[]存放的一个层的东西,size应该不小吧,假如有10个层,一次画面输入就要合并10个层,那同样也有很高的复杂度啊。这个复杂度同样是随着对象的增多线性增长,而且还会随着画面的增大而增长。