浅谈JavaSE性能优化(1)——BufferedImage与像素级渲染

               

写在前面的话:


JAVA应用结构简单,易于编写,能够轻易完成高强度的复杂交互,并且安全性高,稳定性强,免费资源丰富,网络功能强大,拥有近乎完美的多线程机制。有必要的前提下,Java程序员甚至可以使用JNI直接与本地环境沟通,从而绕过虚拟机的性能制约。

 

JAVA应用的跨平台特性,更(理论上)让其可以运行于任何系统和平台之上,最大限度的增加了程序的通用可能。

 

从本质上讲,无论你以Java开发桌面应用也好,网页应用也罢,其实并没有明显的界线存在。究其根本,无非是使用Applet/JApplet/JavaFX当做容器,抑或AWT/Swing/SWT当作容器的区别罢了。

 

快捷、灵活、通用、稳定,以上这些优势,原本足以让JAVA将成为未来网页游戏乃至中小型桌面游戏开发的主流语言之一。

 

然而,Java的运行效率问题,似乎却成了这一些美好前景的绊脚石。更直接的说,有一些人武断的认为,Java“缓慢”的运行速度,让它根本不适合作为游戏客户端之用。

 

即便自JDK1.6Java的图形渲染能力已经有了显著提升,即便国外像RuneScape之类的Java3D网页游戏已经上线盈利很多年(PS:顺便鄙视下Jagex最近对RuneScape作的人物属性调整……),即便连NetBeans的运行速度都已经变得能同普通桌面程序不遑多让。但是,某些自2004年后或许从未接触过新技术的家伙,依旧乐此不疲的散布着有关Java性能的流言蜚语。

 

在某些落伍人士眼里,Java如同洪水猛兽,又好像是他们天生的对头。他们甚至宁愿选择某些行将就木的技术,他们甚至宁愿将某些只适合做低成本动画的东西视为命根,他们甚至宁愿花大力气去处理那些因为不支持实际多线程、CPU占用过高、硬件加速不到位、资源回收异常等等问题而引发的致命BUG,也不愿意去多了解一下Java。他们将一种原本可以带来巨大商业利益的语言视若等闲,他们宁愿让自己的雇主花费数倍的精力与财力去打造垃圾,也不愿意让雇主和公司拥有接触到更为优秀技术的机会。

 

不得不说,这即是Java的遗憾,更是某些落伍人士雇主及其公司,乃至整个游戏产业的遗憾。

 

当然,一味的指责他人,就成了抱怨,势必会犯“有嘴说别人,没嘴说自己”的民族通病。事实上,人们对于Java性能方面之所以会产生误解,除了旁人的傲慢与偏见外,自然也同Java自身的发展历程密不可分(具体原因我在其它的博文中已经阐述过很多次,此处不再赘述)。

 

但总体上讲,除了原Sun公司本身的不作为,以及Java偏向企业级开发,偏向服务器端开发的大环境影响外。Java进行游戏开发,或者说桌面开发的最大缺陷,就在于其图形开发方面,特别是有关于渲染优化方面,乃至整个Java游戏开发领域的书籍资料都严重匮乏。没错,相比浩如烟海的Java服务器端技术资料而言,Java游戏开发方面的资源凤毛麟角。在某个黑暗时期中,甚至连Java版的贪食蛇、俄罗斯方块、超级马里奥之类的资源都会被人视为经典。

 

不客气地说,如果凭那些东西就想让人树立对于Java游戏开发的信心,就算不等于痴人说梦,至少也是难于登天了。

 

而如果想要解决这个问题,那么更多的示例,以及更多的技术文章将必不可少。为此,笔者才会产生创作此系列博文的意愿,唯恨椽笔拙文,权作引玉之砖。

 

 

正文:BufferedImage与像素级渲染

 

常有人说Java图形渲染很慢?嗯,相对C/C++而言,Java2D固有的图像处理能力确实有待提高。

 

但是,这也仅仅局限于对比C/C++应用而言。

 

如果您是以其它什么东西与之比较,却得出Java渲染很慢的结论。那么,或者并不是出自Java本身的原因,而在于您并没能搞清楚该怎样正确的使用Java绘图。

 

况且,即便是相对于C/C++而谈,Java也并非相差到难以望其项背的地步。相对于某些行将就木的技术,至少我们除了异常积极的自行修改JRE,或者极端消极的等待JRE官方更新以外,还有使用OpenGL或者像素级优化这两条道路可走。

 

在本节当中,我们就先谈点基础的,来说说Java渲染的像素级优化吧。

 

像素与RGB

 

像素是什么?简单的讲,像素就是色彩,像素是系统能够在计算机屏幕上显示的最小染色点。越高位的像素,其拥有的色板也就越丰富,越能表达颜色的真实感。

 

众所周知,图像是像素的复合,看似绚丽的形象,也无外是一个个肉眼难以分辨的细微颗粒集合罢了。

 

比如,在一些常见的Java图像处理中,我们经常会用到所谓的RGB24模式(24位三原色模式,在Java2D中以TYPE_INT_RGB表示),将RedGreenBlue三种色彩加以混合,创造出唯一的色彩点并绘制到计算机之上。而这个色彩点,也就是所谓的像素。因为在RGB24RedGreenBlue三者都被分配有一个0~255的强度值,所以该RGB模式的极限机能就是256*256*256,即至多可以显示出16777216种颜色。

 

PS:关于16位的RGB565Java2D中表示为TYPE_USHORT_565_RGB)以及RGB555Java2D中表示为TYPE_USHORT_555_RGB)会在以后章节中涉及,大家此刻只要知道,使用24位以下的图形处理模式,在显示速度上虽然会有提高,视觉效果上却必然会有损失就可以了

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值