java硬件加速

java硬件加速

ID:38192468

大小:26.00 KB

页数:3页

时间:2019-05-24

java硬件加速_第1页
java硬件加速_第2页
java硬件加速_第3页
资源描述:

《java硬件加速》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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

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

3、中传输次数和总的传输数据量;所谓格式,是指源和目的的图像格式是否匹配,如果不匹配,会造成转换时间等损失。诸位有没有看过《东方快车谋杀案》?东方快车入俄罗斯边境后要停车一晚上……换轮子,因为此国的铁路宽度与领国不同……这个道理是一样的,使用匹配格式绘图,能大大增加渲染速度。小弟我根据实验,得出了三种转移方式的比较:内存到显存的不匹配格式图片转移,慢~到~爆~;内存到显存的匹配格式图片转移,较快;显存到显存的图片转移,贝戒~快~口阿~;下面讲讲实现上述三者的方法:先讲慢到爆的那个。如果不用任何加速手段,仅采用往awt组件上drawImage(),结果就是慢到爆

4、,因为格式不匹配,属于第三种。既然已经这么慢了,于是这种渲染方法又附带一个缺点:闪烁;接下来,一般最常用的手段是用Swing来绘图,因为它内建了自动显存缓冲,因此渲染速度大大增加而且不用担心闪烁问题,转移方式属于第一种,且是懒人的首选。当然,我们也可以在AWT里手动实现显存内缓冲,毕竟Swing就是构造在AWT之上的;最后一种最最王道的方法,需要手动把图片转移进显存咱们分成3步走:首先,下面这个巨长的语句可以申请一块与显存图像格式相容的内存,它可以用来1离屏缓存和2存储图像:Imagebuffer=GraphicsEnvironment.getLocalG

5、raphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(w,h,Transparency.BITMASK);//最后一个参数指定透明方式类似的,加上几个字母后这个语句能够制造一块可以用的显存Imagebuffer=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createC

6、ompatibleVolatileImage(w,h);(对了,上述方法可以用Component的createImage和createVolatileImage代替,效果一样,缺点是不能手动指定透明方式而且代码不够华丽,不能用来吓唬小朋友)接着用ImageIO载入图像文件Graphics2Dg=buffer.createGraphics();g.drawImage(ImageIO.read("c:/pic.png"),null,0,0);g.dispose();这样一次性地把内存图像以匹配格式的形式转移入内存/显存那么接下来使用缓存的过程就非常简单了,只要

7、将欲绘制的图像画在离屏缓冲里,然后这么覆盖Component的绘制方法:publicvoidupdate(Graphicsg){paint(g);}publicvoidpaint(Graphicsg){if(offScreenBuffer==null)return;g.drawImage(offScreenBuffer,0,0,null);//显存到显存的Blitting}这样你就可以用几乎接近C++的速度来绘制图像啦说到这里VolatileImage是千好万好,但是它其实有两个致命的缺点:第一,apidoc里这么说:Thedrawingsurfaceof

8、animage(thememorywheretheimagecon

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。