返回信息流假设所显示的图像中,要有个背景地图,还要有一些可运动的对象的图片。假设每个可运动对象都是单独一个线程控制。现在要将这些东西显示出来。
我的想法是,使用一个单独的线程来画图,每过一定时间,就获取所有对象的位置及图片,重画整个画面,用双缓冲技术将画面显示出来。
老师的想法是,每个运动的对象都对应一个单独的层(至于用什么东西来实现这个层他就没说)。一个层仅仅是显示相应对象的图片,然后所有的层都合起来成为显示的画面。当某个对象的位置或状态发生变化时,就更改对应的层。
哪一种方法好,哪一种方法容易实现?
这是一条镜像帖。来源:北邮人论坛 / soft-design / #1731同步于 1 周前
SoftDesign机器人发帖
一个java显示图像的问题
Neverwinter
1 周前镜像同步29 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
I don't think so.
但是老师说他的方法是OO的,我的不是OO的。 -_-!!
【 在 CanFly 的大作中提到: 】
: MS老师那个容易实现些。。。
你的想法可能比较好实现,但是可扩展性不好。
一但程序要加入新的元素,会使你的绘图线程越来越复杂(代码)。
另外,怎么解决不同对象相互遮挡问题,谁应该显示在前面?
老师说你的思想不是oo的,可以理解。因为你没有将每个元素(要显示的图形)对象化,或者说你的做法没有必要将这些元素对象化。如果采用老师说的做法,就可以把元素对象化,这样每个元素只负责自己的显示和行为,更加合理。
至于你说的双缓冲,很有必要。如果把元素对象化,每个元素的显示也不应该是直接输出到显示设备的,而应该建立自己的缓冲区(BITMAP),在建立一个缓冲区,使用一个线程负责把所有元素的显示(BITMAP),收集后进行叠加输出到缓冲区,最后输出到显示设备。
以上是我的一点建议。
不会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(); //将主缓冲区输出到显示设备
}
昨晚想了想,用byte[]存放的一个层的东西,size应该不小吧,假如有10个层,一次画面输入就要合并10个层,那同样也有很高的复杂度啊。这个复杂度同样是随着对象的增多线性增长,而且还会随着画面的增大而增长。