集成GLPbuffer和Java Graphics2D

该程序在 2005 年又重新用 Java 编写了一次,主要设计工作由 David J. Eck 完成。其 Java 版本被称作 3D-XplorMath-J。它可在作为独 立程序运行,也可以作为 网站 上的一系列 applet 运行。该项目受到国际自然科学基金 (DUE Award #0514781) 一定程度上的支持。

OpenGL 集成中的设计问题

3D-XplorMath-J 最初使用 Java Graphics2D,我们的目标是找到集成 OpenGL 图形的最简单方法。3D-XplorMath-J 使用 接口 Renderer3D 定义的渲染程序来绘图。我们创建了另外一个渲染程序类,使该程序除了能执行现有 Java Graphics2D 渲染以外,还能执行 OpenGL 渲染。这 个新的渲染程序将设置 OpenGL 光照、影像和视点转换,然后使用 OpenGL 命令进行渲染和绘制。

OpenGL 提供了硬件加速 3D 绘图,借助改进的图形和极快的速度,能使用 Graphics2D 实现 3D 绘图。OpenGL 通过 JOGL API 使用 Java 实现。图 1 中的图像给出了改进图形的可视化表示,我们是通过 JOGL 实现的。从上面两幅图可以看出,JOGL 给出的蜗牛壳表示形式比 Java Graphics2D 绘制的更加清晰。但是,这点区别在不是很复杂的对象中并不明显。对于正在旋转的对象,这点区别会变得很明显,即使是卷形垫 ,这从下面两幅图中可以看出。

图 1. 图形比较。左上方:静止的蜗牛壳,使用 JOGL 绘制。右上方:静止的蜗牛壳,使用 Java Graphics2D 绘制。左下方:动态的卷形 垫,使用 JOGL 绘制。右下方:动态的卷形垫,使用 Java Graphics2D 绘制。

JOGL 中有三个类表示 OpenGL “可绘制区域”,即几个可以绘制 3D 图像的地方。它们是 GLCanvas、GLJPanel 和 GLPbuffer。其中, GLCanvas 和 GLJPanel 是两个常用的类,但在大型复杂的项目中,可能需要更改大量代码后,集成才能成功。GLPbuffer 是三个类中最少知道 的一个,但它拥有一些独特的功能,足以引起 Java 程序员的重视。在本例中,使用一个 pbuffer 来渲染对象似乎很简单,因为我们可以使用 与 Java Graphics2D 相同的框架,只要稍微修改为绘制到 pbuffer(在内存中存储屏幕以外的图片)即可。这样的图片然后可以作为一个标准 BufferedImage 被检索到,该 BufferedImage 可以被复制到屏幕。

GLCanvas 和 GLJPanel 是 GUI 组件。GLCanvas 更兼容 AWT,GLJPanel 更兼容 Swing。在 GLCanvas 中绘制会更快一点,但它是一个“重 量级”组件,在 Swing 中使用比较困难。在 Amy Fowler 和 Chris Campbell 合著的一些文章中对此问题进行了讨论。在 3D-XplorMath-J 中 使用这些类需要用 GLCanvas 或 GLJPanel 替换 JPanel。遗憾的是,JPanel 更多用在 3D 绘图中。例如,它用于显示 BufferedImage,这些 事情用 GLCanvas 或 GLJPanel 不是那么容易实现。请注意:至少在 Java 5.0 中是这样的。文章最后,我们将简要讨论 Java 6.0 中的一些 变化。

另一方面,JPanel 可以在不破坏程序 Graphics2D 绘制框架的情况下使用。GLPbuffer 表示内存中一个可用作 OpenGL 命令绘制界面的区 域,非常类似于 Graphics2D 的 BufferedImage。这样,就可以获得用 BufferedImage 形式绘制的图像副本。BufferedImage 然后可以使用标 准的 Graphics2D 技术复制到屏幕。在这篇文章中,我们将说明如何实现这一点,并讨论这样做的性能意义。使用 pbuffer 最主要是考虑到它 仍然是 JOGL 的一个试验方面,因而受各种平台不同程序的支持。绘制到缓冲区而不是直接绘制到 GLJPanel 或 GLCanvas 会变慢也是我们考 虑的一点。在 Linux、Mac 和 Windows 环境中经过测试后可以确定,这三者之间的差异很小,不会影响到 pbuffer 的使用。运行同一动画, 绘制 500 帧,每一帧画 500 个任意大小的球,每一种平台得到的速度如下:

整个动画的估计时间 每帧的估计时间
GLCanvas 39285ms=39.285s 78.57ms=.07857s
GLJPanel 42325ms=42.325s 84.65ms=.08465s
GLPbuffer 50945ms=50.945s 101.89ms=.10189s
整个动画的估计时间 每帧的估计时间
GLCanvas 48795ms=48.795s 97.59ms=.09759s
GLJPanel 53161ms=53.161s 106.322ms=.106322s
GLPbuffer 82221ms=82.221s 164.442ms=.164442s
整个动画的估计时间 每帧的估计时间
GLCanvas 50813ms=50.813s 101.626ms=.101626s
GLJPanel 67704ms=67.704s 135.408ms=.135.408s
GLPbuffer 70703ms = 70.703s 141.406ms=.141406s

这些表显示了使用 GLPbuffer 消耗的时间并不长,在 Mac 平台上表现得比其他平台更显著。因此我们决定使用 pbuffer 来试着集成,利 用它的试验特性来碰碰运气。用于生成这些表的程序代码可从 示例代码 下载。其中还有一个交互式程序,用于以交互方式比较这两种技术。

时间: 2024-12-22 14:11:52

集成GLPbuffer和Java Graphics2D的相关文章

如何在java Graphics2D 画出文字的阴影黑边效果

问题描述 如何在java Graphics2D 画出文字的阴影黑边效果 public static void setFont(String context, BufferedImage ImageNew, int x, int y, Color c) { Graphics2D g = ImageNew.createGraphics();// 得到图形上下文 g.setColor(c); // 设置画笔颜色 Color.LIGHT_GRAY g.setFont(new Font("宋体"

如果精通Java Graphics2D 会有什么前途

问题描述 现在突然对 java graphics2D 和算法感兴趣,正在研究相关内容,不知道如果精通它们有没有前途,哪位有经验人士指点一二. 解决方案 graphics2D 用过,可以对处理进行一些很方便的处理,效果还说得过去.但是编译时经常出现警告:不属于标准的JAVA API,而属于SUN的专属API,在未来某时会删除或修改.我认为这个东西只能用来简单的处理图片,对于一般应用来说是够用了.JAVA本来性能不如C语言,图片处理很消耗资源,使用JAVA不适合.研究算法应该去研究C语言.这个类也不

如何集成Perf4j到Java应用程序中并生成性能数据

在实际部署的生产环境能够以较低的风险及成本实现对业务逻辑级别性能问题的追踪.本文将介绍如何集成 Perf4j 到 Java 应用程序中并生成性能数据. 系统日志是应用程序问题诊断及运行维护的重要工具.Logback.Log4j 是常用于 Java 平台的日志记录 API. 目前大部分产品只是将系统重要参数.状态的变化及异常信息通过日志输出.本文将要介绍的 Perf4j 是一款专门用于 Java 服务器端代码计时.记录日志和监控结果的开源工具包.Perf4j 对常用日志工具包进行了扩展,能够将得到

date 集成 ate-集成java.util.Date的困惑

问题描述 集成java.util.Date的困惑 一个类集成了java.util.Date public class DBDate extends Date implements IDBDate { private static final long serialVersionUID = 1722199654569062027L; private Date date ; public DBDate(Date dateParam) { this.date = dateParam; } public

android eclipse 2.2版本ChatUIDemo集成红包报java.lang.NoClassDefFoundError: com.easemob.chat.EMChat(已解决)

问题描述 android eclipse下,sdk为2.2版本下,仅仅demo(ChatUIDemo)可编译运行.Android版本为6.0集成红包,编译可通过,运行报java.lang.NoClassDefFoundError: com.easemob.chat.EMChat. 解决方案 问题已解决.解决方式:使用Android studio来开发就行.环信团队在开发红包功能时是在Android studio环境下开发,是好的.估计因为时间紧,没有在eclipse下充分测试.虽然做出来了,但是

配置-关于在Azure搭建一个完整的Java web项目的步骤并和azure各种服务集成

问题描述 关于在Azure搭建一个完整的Java web项目的步骤并和azure各种服务集成 如何把java web项目和azure提供的服务进行集成,有哪些配置?能不能提供教程 解决方案 最简单的当然是使用虚拟机服务,使用一个你熟悉的操作系统,比如ubuntu server.cent os或者windows server,然后用ssh.ps或者remote desktop登录进去.你原先怎么部署,现在还是怎么部署,一点都没有变化. 解决方案二: HiAzur官网提供了一些关于java开发的文档

Java中的Graphics2D类基本使用教程_java

Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的控制.绘图属性 Graphics2D定义了几种方法,用于添加或改变图形的状态属性.可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式:设定平移.旋转.缩放或修剪变换图形:以及设定填充图形的颜色和图案等.图形状态属性用特定的对象存储. 1. stroke属性 stroke属性控制线条的宽度.笔形

Java核心技术 卷Ⅰ 基础知识(原书第10版)

Java核心技术系列 Java核心技术 卷Ⅰ 基础知识 (原书第10版) Core Java Volume I-Fundamentals (10th Edition) [美] 凯S.霍斯特曼(Cay S. Horstmann) 著 周立新 陈 波 叶乃文 邝劲筠 杜永萍 译 图书在版编目(CIP)数据 Java核心技术 卷Ⅰ 基础知识(原书第10版) / (美)凯S. 霍斯特曼(Cay S. Horstmann)著:周立新等译. -北京:机械工业出版社,2016.8 (Java核心技术系列) 书

Java SE 6在Solaris的可观察性特征分析

Java平台标准版(Java SE)6,代码名为"Mustang",是最新的Java SE发行版本(正在开发中).Java SE 6源码和二进制代码都可以在www.Java.net上下载.Java SE 6平台要到2006年秋天才能正式发布.不过,现在你可以下载试用Java SE 6 Beta版. Java SE 6平台中提供了多种可观察性(observability)工具,这其中的许多工具都可在系统中运行,而这些工具中的只有极少数被用于挂起进程或核心复制处理.因此,在本文中,我们将分