


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
小弟玩Java这几年,总有一件挥之不去地烦恼。你说吧这玩意儿啥都好,偏偏就是慢。尤其是实时绘制大块图片,一卡一卡地那是相当地慢。眼巴巴瞅着那些玩DirectDraw的把图像载到OffScreenSurface里去轻轻松松就能让FPS上百。那时候,我就瞅着啊,哪天Java也能玩显存操作呢?终于,我们盼星星盼月亮终于盼来了Java2D和java.awt.image.VolatileImage以前,要绘制一副图片,尤其是带部分透明度的大幅图像,要花上10ms级的时间(我是指在我的烂机器上,嗯),这在游戏这样要求高速图像更新的应用里根本是不能容忍的。为什么这么慢?一般计算机数字图像的绘制其实是图像从一块存储区域转移到系统显存(VRAM)中某个位置的过程,在图像转移完成后再由显卡负责整个屏幕信号的转换和输出,然后经过显示器将模拟或数字信号转换成人眼能分辨的图像。只有第一个阶段是被应用程序控制的,图像转移过程的好坏决定了整个图像的渲染速度。一般,图像的转移分为以下几种:内存到显存的匹配格式图片转移;显存到显存的图片转移;内存到显存的不匹配格式图片转移;图像转移的速度,取决于两个因素:格式和位置;所谓位置,便是指图像的源和目的,一般从内存到显存比较从显存到显存慢。要提高渲染速度,除尽量把图片搁显存里以外,还要尽量减少其中传输次数和总的传输数据量;所谓格式,是指源和目的的图像格式是否匹配,如果不匹配,会造成转换时间等损失。诸位有没有看过东方快车谋杀案?东方快车入俄罗斯边境后要停车一晚上换轮子,因为此国的铁路宽度与领国不同这个道理是一样的,使用匹配格式绘图,能大大增加渲染速度。小弟我根据实验,得出了三种转移方式的比较:内存到显存的不匹配格式图片转移,慢到爆;内存到显存的匹配格式图片转移,较快;显存到显存的图片转移,贝戒快口阿;下面讲讲实现上述三者的方法:先讲慢到爆的那个。如果不用任何加速手段,仅采用往awt 组件上drawImage(),结果就是慢到爆,因为格式不匹配,属于第三种。既然已经这么慢了,于是这种渲染方法又附带一个缺点:闪烁;接下来,一般最常用的手段是用Swing来绘图,因为它内建了自动显存缓冲,因此渲染速度大大增加而且不用担心闪烁问题,转移方式属于第一种,且是懒人的首选。当然,我们也可以在AWT里手动实现显存内缓冲,毕竟Swing就是构造在AWT之上的;最后一种最最王道的方法,需要手动把图片转移进显存咱们分成3步走:首先,下面这个巨长的语句可以申请一块与显存图像格式相容的内存,它可以用来1离屏缓存和2存储图像: Image buffer = GraphicsEnvironment .getLocalGraphicsEnvironment () .getDefaultScreenDevice () .getDefaultConfiguration () .createCompatibleImage (w, h, Transparency.BITMASK); / 最后一个参数指定透明方式类似的,加上几个字母后这个语句能够制造一块可以用的显存 Image buffer = GraphicsEnvironment .getLocalGraphicsEnvironment () .getDefaultScreenDevice () .getDefaultConfiguration () .createCompatibleVolatileImage (w, h);(对了,上述方法可以用Component的createImage和createVolatileImage代替,效果一样,缺点是不能手动指定透明方式而且代码不够华丽,不能用来吓唬小朋友)接着用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 paint (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, causing the contents of that memory to go away.(大意:绘制使用的显存表面会丢失,然后图像也丢失了)我先按照上述办法,把所有图片载入显存,再在显存开一个离屏缓冲,运行一个awt窗口,用渲染线程不断刷图片,然后我打开了禽兽争霸3爽了一盘亡灵,退出游戏后一看,Java窗口黑了原来DirectX程序禽兽争霸独占显存后,把原本在屏外缓冲区的VolatileImage的显存给抢了,这也就是为什么它会命名为VolatileImage的原因,除运行独占显存的程序,其它情况如更改分辨率和色深等也会造成显存内容丢失,但是如果你只用VI做离屏缓冲而把图片存在内存里的话是没有问
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第一课(演唱)中华人民共和国国歌(教学设计)-湘艺版(2012)音乐六年级上册
- 辅导员要劳动合同
- 项目1 学习服务技能教学设计小学劳动六年级上册湘人版《劳动实践指导手册》
- 2023四年级数学上册 3 角的度量第4课时 画角配套说课稿 新人教版
- 2025制造企业承包合同
- 10.2 酸和碱的中和反应(第2课时溶液酸碱度的表示法:pH)说课稿-2025-2026学年九年级化学人教版下册
- Unit 1 What's the matter Section A 2a-2d说课稿 2024-2025学年人教版英语八年级下册
- 第12课《短文二篇-答谢中书书》课件+2025-2026学年统编版语文八年级上册
- 第一节 开源硬件系统的微控制器说课稿-2025-2026学年高中信息技术华东师大版2020选择性必修6 开源硬件项目设计-华东师大版2020
- 七年级生物上册 第三单元 第二章 第二节 植株的生长说课稿 (新版)新人教版
- 小型水库维修养护项目方案投标文件(技术方案)
- 中国城市轨道交通全自动运行系统技术指南
- 广东省春季高考数学试卷
- 中国篆刻史课件
- 2025-2030中国搬运机器人行业发展前景预测与投资建议报告
- DB2301∕T 178-2024 地下市政基础设施普查及信息化管理平台建设技术规程
- 《人工智能与社会》高职人工智能通识课程全套教学课件
- 龋齿的治疗讲课件
- 概念验证中心管理制度
- 电能质量技术监督培训课件
- 妊娠期高血压疾病诊治指南(2025版)解读
评论
0/150
提交评论