java硬件加速.doc

上传人:ni****g 文档编号:560332213 上传时间:2023-11-17 格式:DOC 页数:3 大小:26KB
返回 下载 相关 举报
java硬件加速.doc_第1页
第1页 / 共3页
java硬件加速.doc_第2页
第2页 / 共3页
java硬件加速.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《java硬件加速.doc》由会员分享,可在线阅读,更多相关《java硬件加速.doc(3页珍藏版)》请在金锄头文库上搜索。

1、小弟玩Java这几年,总有一件挥之不去地烦恼。你说吧这玩意儿啥都好,偏偏就是慢。尤其是实时绘制大块图片,一卡一卡地那是相当地慢。眼巴巴瞅着那些玩DirectDraw的把图像载到OffScreenSurface里去轻轻松松就能让FPS上百。那时候,我就瞅着啊,哪天Java也能玩显存操作呢?终于,我们盼星星盼月亮终于盼来了Java2D和java.awt.image.VolatileImage以前,要绘制一副图片,尤其是带部分透明度的大幅图像,要花上10ms级的时间(我是指在我的烂机器上,嗯),这在游戏这样要求高速图像更新的应用里根本是不能容忍的。为什么这么慢?一般计算机数字图像的绘制其实是图像从一

2、块存储区域转移到系统显存(VRAM)中某个位置的过程,在图像转移完成后再由显卡负责整个屏幕信号的转换和输出,然后经过显示器将模拟或数字信号转换成人眼能分辨的图像。只有第一个阶段是被应用程序控制的,图像转移过程的好坏决定了整个图像的渲染速度。一般,图像的转移分为以下几种:内存到显存的匹配格式图片转移;显存到显存的图片转移;内存到显存的不匹配格式图片转移;图像转移的速度,取决于两个因素:格式和位置;所谓位置,便是指图像的源和目的,一般从内存到显存比较从显存到显存慢。要提高渲染速度,除尽量把图片搁显存里以外,还要尽量减少其中传输次数和总的传输数据量;所谓格式,是指源和目的的图像格式是否匹配,如果不匹

3、配,会造成转换时间等损失。诸位有没有看过东方快车谋杀案?东方快车入俄罗斯边境后要停车一晚上换轮子,因为此国的铁路宽度与领国不同这个道理是一样的,使用匹配格式绘图,能大大增加渲染速度。小弟我根据实验,得出了三种转移方式的比较:内存到显存的不匹配格式图片转移,慢到爆;内存到显存的匹配格式图片转移,较快;显存到显存的图片转移,贝戒快口阿;下面讲讲实现上述三者的方法:先讲慢到爆的那个。如果不用任何加速手段,仅采用往awt 组件上drawImage(),结果就是慢到爆,因为格式不匹配,属于第三种。既然已经这么慢了,于是这种渲染方法又附带一个缺点:闪烁;接下来,一般最常用的手段是用Swing来绘图,因为它

4、内建了自动显存缓冲,因此渲染速度大大增加而且不用担心闪烁问题,转移方式属于第一种,且是懒人的首选。当然,我们也可以在AWT里手动实现显存内缓冲,毕竟Swing就是构造在AWT之上的;最后一种最最王道的方法,需要手动把图片转移进显存咱们分成3步走:首先,下面这个巨长的语句可以申请一块与显存图像格式相容的内存,它可以用来1离屏缓存和2存储图像: Image buffer = GraphicsEnvironment .getLocalGraphicsEnvironment () .getDefaultScreenDevice () .getDefaultConfiguration () .creat

5、eCompatibleImage (w, h, Transparency.BITMASK); / 最后一个参数指定透明方式类似的,加上几个字母后这个语句能够制造一块可以用的显存 Image buffer = GraphicsEnvironment .getLocalGraphicsEnvironment () .getDefaultScreenDevice () .getDefaultConfiguration () .createCompatibleVolatileImage (w, h);(对了,上述方法可以用Component的createImage和createVolatileImag

6、e代替,效果一样,缺点是不能手动指定透明方式而且代码不够华丽,不能用来吓唬小朋友)接着用ImageIO载入图像文件Graphics2D g = buffer.createGraphics();g.drawImage (ImageIO.read (c:/pic.png) , null, 0, 0);g.dispose ();这样一次性地把内存图像以匹配格式的形式转移入内存/显存那么接下来使用缓存的过程就非常简单了,只要将欲绘制的图像画在离屏缓冲里,然后这么覆盖Component的绘制方法:public void update (Graphics g)paint (g);public void p

7、aint (Graphics g)if (offScreenBuffer = null) return;g.drawImage (offScreenBuffer, 0, 0, null); /显存到显存的Blitting这样你就可以用几乎接近C+的速度来绘制图像啦说到这里VolatileImage是千好万好,但是它其实有两个致命的缺点:第一,api doc里这么说:The drawing surface of an image (the memory where the image contents actually reside) can be lost or invalidated, ca

8、using the contents of that memory to go away.(大意:绘制使用的显存表面会丢失,然后图像也丢失了)我先按照上述办法,把所有图片载入显存,再在显存开一个离屏缓冲,运行一个awt窗口,用渲染线程不断刷图片,然后我打开了禽兽争霸3爽了一盘亡灵,退出游戏后一看,Java窗口黑了原来DirectX程序禽兽争霸独占显存后,把原本在屏外缓冲区的VolatileImage的显存给抢了,这也就是为什么它会命名为VolatileImage的原因,除运行独占显存的程序,其它情况如更改分辨率和色深等也会造成显存内容丢失,但是如果你只用VI做离屏缓冲而把图片存在内存里的话是没有问题的;第二,显存中的VolatileImage对透明度支持不佳实际应用中,所有载入显存的PNG图像会莫名奇妙地变成无透明图像这个问题,呃,暂时还没有解决,那么要么用慢一点渲染方法,要么就把游戏里所有的人物都弄成方块状,名为方块世界好了写完了,大家拍砖把

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号