一种简单有效的3D模型的动画多线程方案

1649 篇文章 11 订阅
1623 篇文章 22 订阅

一种简单有效的3D模型的动画多线程方案

作者:郭胜,英特尔公司软件与解决方案事业部

摘要

              本文将介绍一种简单而有效的多线程方案,能加速大量的3D模型的动画渲染。此方案通过使用线程池、双缓冲、间隔更新等方法显著提升了骨骼动画的性能。尤其值得一提的是,此方案可以使基于CPU的骨骼动画在多核系统上获得与基于GPU动画接近的性能,从而在某些情况下可成为除基于GPU动画外的另一种良好选择。

介绍

              在现代游戏中,动画扮演着重要的角色,它使3D模型看上去更加真实。骨骼动画可能是今天我们使用的最高级的实时动画技术之一。在这种技术中,定义模型外形的蒙皮通常被称为皮肤,而支撑皮肤的结构通常被称为骨骼,皮肤的形状和位置随着骨骼的变化而变化。由于这种技术的算法涉及大量的矩阵运算[1],因此骨骼动画的计算密集性相当高。而且,大型多人在线角色扮演游戏中通常有一些大的游戏场景,比如集市,战场,闹市区等。这些场景中有很多动态的3D模型。因此处理这些模型的骨骼动画将成为游戏中一个显著的性能瓶颈。

              当前,已经有一些软硬件技术被用于优化骨骼动画的性能。比如对模型骨骼使用LOD(细节分层)技术能减少远处模型的动画复杂性。而在骨骼动画的算法实现中使用SSE指令能获得比原先C实现的代码至少高两倍的性能。对于支持顶点着色器(vertex shader)的显卡,大部分动画渲染工作能从CPU移到GPU上,并获得显著的性能提升。

              在过去的几年里,PC业界有两种趋势,一种是越来越多的台式机和笔记本的处理器是多核的,这意味着现在开发的游戏将在一个主流为多核处理器的市场上发布;另一个趋势是笔记本市场的增长速度明显超过了台式机。这意味主要配备集成显卡的笔记本将在游戏玩家中越来越普遍。因此,如何合理利用多核系统的CPU和GPU资源将是游戏开发者需要认真考虑的问题。

              本文提出了一种模型动画的多线程方案。此方案能通过利用多核处理器资源改善游戏的性能。此方案通过线程池、双缓冲和间隔更新的方法把骨骼动画的渲染管线并行化。而且,一个渲染大量动态3D模型的演示程序被开发用于验证此方案的有用性。测试表明此方案既有利于基于CPU的骨骼动画,又有利于基于GPU的骨骼动画,特别是对基于CPU的动画,通过使用这个方案,能使性能大大优于传统单线程的实现;并且,在某些高端显卡上,使用此方案的基于CPU的动画能体现了与基于GPU的动画近似的性能,而在主流的低端显卡上,更是显示了较明显的性能优势。

              本文接下来的章节组织如下:第二部分介绍骨骼动画的技术和基于CPU和基于GPU实现的优缺点;第三部分阐述此方案及其实现细节,然后第四部分将介绍开发的演示程序,第五部分分析此方案的性能。第六部分提出了一些额外的考虑。最后第七部分是本文的总结。

骨骼动画

              骨骼动画可能是今天最常用的高级实时动画技术之一。在骨骼动画中,称为“皮肤(skin)”的多边形网格随着称为“骨骼(skeleton)”的支持结构的改变而不断变换。这种根据骨骼的动画而实现的皮肤转换处理成为“蒙皮(skinning)”技术。骨骼动画系统使用转换矩阵表示一根骨骼的坐标系相对于其父骨骼的坐标系的转换关系。这些转换矩阵通常保存在模型空间中。骨架中所有骨骼的转换矩阵组成一个时间点的骨骼动画帧。每个动画集都由一系列时间点的动画帧组成。通常游戏逻辑决定当前时间内模型使用什么样的动画集,然后启动骨骼动画的渲染管线去渲染模型。这条渲染管线能被分为三个基本阶段。它们分别是“骨骼变换”、“蒙皮”和“绘制”。

              第一个阶段的主要任务是变换骨骼并获得在世界空间中的骨架转换矩阵。在此阶段中,首先从一个动画集中选择两个时间点的动画帧(骨骼转换矩阵),保证当前时间位于这两个时间点中间,然后当前时间的动画帧由前后两个时间点的动画帧通过插值获得。如果此模型关联多个动画集的话,则所有插值后的动画帧被混和形成当前动画帧。最后,递归地沿着骨架层次,当前动画帧的每个骨骼的转换矩阵被转化为相对与世界坐标系的转换矩阵。通常,第一阶段在CPU上执行。

              第二个阶段被称为“蒙皮(skinning)”。由于皮肤顶点相对于所在骨骼是静止的,所以可以通过变动骨骼获得新的皮肤形状。由于缺省的皮肤保存在模型空间中,因此需要根据骨骼的世界转换矩阵,把皮肤顶点也转换到世界空间中去。在阶段二的实现中,模型空间的皮肤顶点首先通过一个偏移量矩阵转换为相对于所在骨骼的坐标,然后根据第一阶段输出的骨骼的世界转换矩阵,转换为在世界空间中的皮肤顶点。有时一个皮肤顶点受多个骨骼的影响,此时要对骨骼矩阵和偏移量矩阵的乘积进行加权求和。“蒙皮”可以在CPU上执行,也可以在具有顶点着色器的GPU上执行。本文中,“基于CPU的骨骼动画”意味着由CPU处理蒙皮,而“基于GPU的骨骼动画”则表示由GPU处理蒙皮。

              随着GPU的速度迅速增加以及最大程度的平行性被开发出来,用GPU处理蒙皮在诸多情况下都是有利的。一般来说,在今天的中高端独立显卡上,基于GPU的蒙皮比基于CPU的蒙皮更快并且更加节省的系统内存。然而,对于某些应用,在CPU上执行蒙皮更有好处[1]。在CPU上执行蒙皮能提高应用对大部分系统的兼容性。老系统上可能有不支持基于GPU蒙皮的显卡(比如GeForce2 和GeForce4MX)。而且,许多应用为了阴影体(shadow volumes)生成和冲突检测需要使用转换后的数据,但当前的显卡并不能很好地支持从显卡中大量获得已经处理过的数据。而在CPU上蒙皮允许应用很容易地访问动画后的蒙皮数据,且允许GPU做光照和裁减等运算。当然,计算阴影体可以完全放到有些显卡上,但是这种方案在今天的主流显卡上并不是特别有效。允许在GPU上进行蒙皮的显卡也可能由于一些资源上的限制,要求大的骨骼模型被分为多块小的网格才能渲染,这样会降低效率。在CPU上进行蒙皮没有上述限制,并且可以通过使用SSE指令优化和多线程优化使性能接近基于GPU的实现。正由于这些原因,一些游戏如DOOM III和Quake 4采用了基于CPU的蒙皮,使得游戏能运行在最广泛的系统配置上。

              最后一个阶段是把皮肤顶点画到屏幕上。在此阶段中,在世界空间的皮肤顶点经过裁减、栅化、着色等步骤,最终画到屏幕上。此步骤由GPU完成。

方案

              本方案的主要目标是基于软件最大程度地挖掘骨骼动画渲染管线的并行性。方案的设计来自于一些对骨骼动画渲染管线的观察。一方面,由于涉及大量的矩阵运算,此管线是计算密集的;另一方面,不同动态模型的渲染过程通常是独立的。因此,多线程能有利于骨骼动画渲染管线的性能。而且,临近的很小时间间隔中的动画数据(例如骨架的形状)通常非常相似,因此在许多情况下(尤其是在MMORPG中),不一定需要每帧都更新模型动画。间隔地更新模型动画能减轻总线压力,改善CPU和GPU之间的并行性。

              此方案包含三个部分:“线程池”、“双缓冲”和“间隔更新”。线程池中的动画线程执行动画渲染管线的第一阶段和第二阶段[1]。第三阶段由主线程执行,因为这个绘制阶段包含大量对图形API(例如DirectX和OpenGL)的调用,由于性能方面的问题,这些调用通常不合适放在不同的线程中执行[4]。此方案使用双缓冲最大化阶段三和阶段一、二之间的并行性,且简化它们的同步。最后,“间隔更新”的技巧是可供选择的,它能控制动画更新的频率。

              下面的章节将描述这三大部分的细节,以及本方案的资源管理策略,此策略与传统的管理动画资源的策略略有不同。

3.1 线程池

              在本方案中,当渲染一个动态模型时,有一个被称为动画线程的独立线程会分配给这个模型去处理骨骼变换和蒙皮。为了并行渲染大量的动态模型,本方案采用了线程池。这主要基于如下一些优点:首先,线程池可以避免频繁创建和销毁动画线程所致的沉重代价。其次,通过使用线程池,动画线程的数目可以随着动态模型的数目和处理器核心的数目的变化,具有良好伸缩性。另外,线程池提供了一个简洁的编程接口,通过它,主线程只需要把动态模型提交到线程池的任务队列中,而不需要处理线程调度等方面的问题,这些都由线程池自动完成。使用一个良好封装的线程池,比如WIN32系统线程池,你只需要对模型类的定义做少量修改即可象如下代码所示那样实现多线程。

              从上面的代码中可以看到,在类方法Animate中,通过调用一个WIN32线程池API,QueueUserWorkItem[2],模型被提交到线程池。并且,通过使用这个API的第三个参数,可以说明线程池中的最大线程数。一般来说,一个应用中的活动线程数应该不大于处理器核心的数目。由于线程的切换开销,过多的线程并不会带来更多性能。

              在骨骼动画的渲染管线中,由动画线程执行的阶段一和阶段二的输出,将被作为由主线程执行的阶段三的输入。因此主线程必须与动画线程同步以避免数据竞争(data racing )。上面的代码中建议了一种简单有效的同步方法:定义一个计数器计算线程池中的模型数,主线程和动画线程通过轻量级的WIN32“Interlock”同步方法[3]互斥地访问这个计数器。只有当这个计数器为零的时候,主线程才能开始绘制模型。

3.2 双缓冲

              尽管上面的同步方法避免了多线程化的管线中的数据竞争。但它使阶段三和阶段一、二只能串行执行。为了使得阶段三和阶段一、二能并行执行,本方案采用了双缓冲技术。

              在模型动画中可以使用双缓冲主要基于如下假设:动画数据,例如骨架姿势和皮肤顶点,在临近的帧中是非常接近的。因此主线程可以使用前帧产生的动画数据,而不必等当前帧的最新数据。对于动画的视觉效果来说,一帧或几帧延迟的可预测的一致性行为不会影响游戏体验。

              在双缓冲的实现中,被主线程和动画线程共享的所有模型动画数据都有两个拷贝存放在双缓冲中。一个缓冲被称为读缓冲,在这里主线程把动画数据读到管线的阶段三中;另一个缓冲被称为写缓冲,在这里动画线程写入管线的阶段一、二的输出数据(见图一)。两个缓冲每隔一帧或几帧被交换一次。

 

图1: 双缓冲的机制

 

              当模型第一次进入摄像机的视域,模型的读缓冲中的动画数据可能要么没有准备好、要么太陈旧以至不能被主线程用来进行绘制。为了解决这个问题,每个缓冲都附带一个生命周期。当其中的动画数据被更新后,缓冲将被赋予一个新的生命周期,然后在接下来的每帧中,这个生命值会被递减。而主线程只使用生命值非负的缓冲去绘制模型。

              下面的代码描述了双缓冲在模型类中的实现:

 

              双缓冲避免了骨骼动画渲染管线中阶段三和阶段一、二之间的数据竞争,并且使主线程和动画线程之间的同步从帧内转移到帧间。因此在游戏循环开始的时候,主线程需要执行一些操作更新双缓冲的状态。下面的代码是双缓冲在游戏循环中的实现。

 

              双缓冲开发了主线程和动画线程之间的最大的并行性。而且,它能方便多线程编程。例如,程序员可以假设动画数据总是可被主线程使用;以及处理一个模型的动画线程能够从另一个模型的读缓冲中获得动画数据,这使得其他并行处理得以实现,比如并行的模型间冲突检测。双缓冲技术的主要缺点是额外的内存消耗。例如,当使用基于CPU的蒙皮技术渲染100个模型时,假设每个模型有5000个顶点,每个顶点有32字节,那么额外的内存开销有16兆字节。

3.3 间隔更新

              在一些MMORPG的游戏场景中有大量的动态3D模型,这些模型通常被称为PC (Player-Character,玩家角色) 或NPC (Non-Player-Character,非玩家角色)。NPC由游戏控制。在许多情况下,这些NPC的动作经常是简单的、并非快速移动的。由于临近的短时间间隔中的动画数据(例如骨架姿势)非常接近,因此,在这些情况下,并不必要每一帧都更新这些模型的动画。实事上,传统基于CPU的蒙皮常慢于基于GPU的蒙皮的一个主要原因是大量的皮肤顶点频繁地上传到显卡,以至于CPU与GPU之间的总线带宽成为瓶颈。本方案建议了一个技巧:每隔几帧才更新某些模型的动画数据,这样能减轻总线流量的压力,且提高渲染的效率。下面的代码是间隔更新技巧在主循环中的实现。

 

 

              下面的代码是间隔更新技巧在模型类中的实现。

 

              实际的更新模型动画的频率等于帧速率除以更新间隔。当间隔为1,本方案即与传统方法一样每帧更新动画。当间隔增加时,帧速率通常也会相应增加,但更新频率有可能下降。因此在实际游戏中,开发者需要选择合适的更新间隔,使动画更新的频率保持在一个合理的范围内。

              除了减轻总线传输的压力外,间隔更新与多线程结合时还体现了另一个好处。由于间隔更新允许动画任务的执行时间跨越多个帧,这使动画线程能有足够的时间处理一些耗时的动画任务,并且很少影响主线程的速度。

3.4 资源管理

              3D 模型的资源包含顶点缓冲,索引缓冲和纹理等。在处理模型动画时,CPU 和 GPU 会经常访问这些资源,因此这些资源的位置和使用方式将对骨骼动画渲染管线的性能产生重要的影响[6]。

              对于基于 GPU 的动画,渲染管道的大部分负载由显卡承担。在DirectX9中,这些资源通常作为“默认资源”或“托管资源”保存在本地显存中,使GPU能快速存取。此策略仍适用于本文建议的方案。

              对基于CPU的动画,诸如网格顶点缓冲的资源会被CPU频繁更新。通常情况下,最好将这类资源作为“动态默认资源”置于非本地显存(如 AGP 显存)中。例如,在具体实现中,可以使用DirectX的POOL_DEFAULT标记和USAGE_DYNAMIC提示创建模型网格的顶点缓冲[5]。尽管上述资源管理策略最有利于传统基于CPU的动画,但获得的性能在大多数情况下依然无法和基于GPU的动画相比,这是由几方面的因素导致的。在资源管理方面有两个主要原因:1)GPU对“本地”显存的存取速度要远高于“非本地”显存;2)基于CPU动画每帧都需要上传网格顶点数据到GPU,这容易使总线成为瓶颈。

              本文建议的方案能间隔地更新模型动画。这样网格顶点等资源不需要每帧都上传到显卡中。通过间隔更新,此方案使模型动画的动态资源转变为半动态的资源。通常把这类资源作为DirectX的“托管资源”而不是“动态默认资源”来管理更加合理。DirectX会把这类资源放在恰当的位置,使CPU和GPU能高效地访问它们。

              使用“托管资源”的另一个理由是它使DirectX与本方案的多线程上下文具有更好的兼容性。

演示应用

              为了检验此方案是否行之有效,我们开发了一个渲染大量3D模型动画的演示应用。这个演示程序改进了DirectX的例程“MultiAnimation”[7],实现了基于CPU和基于GPU的骨骼动画,并且同时支持单线程和多线程版本。

              本演示展示了许多模型在一个平面地板上漫步的场景。用户或应用(在缺省状态下)可以控制这些模型。每个模型都拥有三个动画集,即闲走、行走和慢跑。动画控制器会将这些动画集融合在一起,确保每个动画可以平滑过渡至下一个动画。这些模型之间会做碰撞检测,可以互相阻碍彼此的运动。通过回调系统,模型可在动画中适当的情况下播放脚步声。在本演示中,动画线程执行的动画任务包括动画集融合、骨架变换和蒙皮(针对基于 CPU 的解决方案)三项工作。演示程序只处理在摄像机视截体中的模型的动画和绘制。在应用控制的模式下,能通过“箭头”键移动摄像机。在用户控制模式下,可以通过“A/W/D”键控制某个被选模型的移动,而摄像机则会跟随模型。

 

图 2: 演示应用的屏幕截图

 

              一个配置文件用于初始化演示应用进入各种运行模式。您可以采用下列 4 个选项配置演示程序:

Method:选择基于 CPU 的蒙皮或基于 GPU 的蒙皮;

Threads:线程池中的动画线程的数量。“非零”表示使用本文建议的多线程方案;“零”表示传统的单线程版本;

Models:初始的模型数量;

Interval:一个动画更新间隔所包含的帧数。此选项只在本文建议的方案中有效。

 

              关于本演示应用的源代码,请参见附录 A。

 

性能分析

              我们采用以下两种系统配置测试该演示程序的性能::

 

配置

处理器

内存

显卡

操作系统

A (台式机)

2.6 GHz Intel® Core™2 Quad ( 4 cores )

2GB DDR2

ATI Radeon X1900 Series

Windows* XP

B (笔记本)

2.4 GHz Intel® Core™2 Duo ( 2 cores )

2GB DDR2

Intel Integrated Graphics GM965

Windows* XP

表 1: 测试平台配置

 

性能测试和等级评定均使用特定的计算机系统和/或组件进行测量。这些测试反映了英特尔产品的大致性能。系统硬件、软件设计或配置的任何不同都有可能影响实际性能。

 

              首先,在此配置上对传统单线程的骨骼动画的实现进行性能评测,并将该评测结果作为基准。配置 A是一种采用了多核处理器和高端显卡的台式机配置。测试结果请参见表 2。测试1是基于CPU的骨骼动画(也就是在CPU上进行蒙皮)的测试结果,测试2是基于GPU的骨骼动画(也就是在GPU上进行蒙皮)的测试结果。显然,我们可以看到:传统的基于 CPU 的蒙皮速度远不及基于 GPU 的蒙皮速度。

 

测试用例序号 (性能指标:每秒帧数)

蒙皮模式

场景中可视模型数量

20

40

60

80

100

1

CPU

63

36

25

19

16

2

GPU

188

161

140

124

108

       

表 2: 在配置A平台上测试单线程的骨骼动画性能

 

              其次,在配置A上测试使用本文建议的方案实现的多线程骨骼动画的性能。测试结果请参见表3。对于基于CPU的骨骼动画,此方案的性能比传统单线程方案好很多 (把测试3, 测试4, 测试5和测试1相比较),前者的速度约为后者的2.6到9倍。对于基于GPU的骨骼动画,虽然此方法带来的性能增幅不如基于CPU的动画那样高,但此方案也明显优于传统单线程方案(将测试 6、测试 7、测试 8 与测试 2 进行比较)。值得注意的是,此方案在某些情况下能使基于CPU的骨骼动画的性能与基于 GPU 的动画的性能几乎相当(将测试 4 与测试 7 进行比较),有时甚至更快(将测试 4 与测试 2 进行比较或将测试 5 与测试 8 进行比较)。上述测试结果的原因是,基于CPU的动画与基于GPU的动画相比有更多部分的动画渲染管线在CPU上,因此能更加充分利用此方案的优势,即通过多线程和有效降低总线压力来提高性能。

 

 

 

测试用例序号 (性能指标:每秒帧数)

蒙皮模式

更新间隔帧数

场景中可视模型数量

20

40

60

80

100

3

CPU

2

167

123

97

80

68

4

CPU

6

216

182

157

141

125

5

CPU

10

225

208

182

170

140

6

GPU

2

205

189

171

143

115

7

GPU

6

223

191

181

143

115

8

GPU

10

225

196

186

143

115

        

表 3: 在配置A上测试本方案的性能 ( 动画线程数 = 3)

 

              从表三中同样可以看出,应用的性能确实受益于间隔更新的技巧。然而,尽管更大的更新间隔能提高帧速率,却降低了动画更新的频率(由表 3 中的数据计算得出)。如果动画更新频率太低(如位于 15 以下),我们的视觉体验就会受到影响。因此,应用程序应采用适当的更新间隔,使动画更新频率保持在一个合理的范围内,并且取得令人满意的帧速率。在测试 4 中,演示程序采用了6帧的更新间隔,使基于 CPU 的动画获得了与基于GPU的动画接近的性能,并且使动画更新频率维持在21~36帧之间。

              我们可以使用英特尔® 线程分析器[8]来捕捉此方案的线程行为细节。英特尔® 线程分析器这一线程分析工具可插入英特尔® VTune™ 性能分析器中,可用来分析线程的负载均衡和任何潜在的线程开销。用线程分析器对此方案的演示程序进行分析,典型的输出结果(见图 4)表明,借助双缓冲,动画线程和主线程在极低的同步开销下几乎可以完全并行运行(由“全利用”色带表示);并且由于线程池的动态调度,动画线程之间的工作负载(由“活动”色带表示)能够达到完美的均衡。而主线程和动画线程的工作负载的差距意味着动画线程可以容纳更多重负载的任务。

 

 

main thread

 

3 animation threads

 

图 3:英特尔® 线程分析器分析此方案的演示程序时的典型输出

 

              为验证此方案的资源管理策略,我们采用DirectX创建网格的各种选项来对本演示程序进行性能评测。测试结果证实,托管资源最有利于此方案的性能,且其它资源策略可能导致应用在多线程环境中被锁定。

 

 

 

 

测试用例序号 (性能指标:每秒帧数)

网格创建选项

动画线程数 = 0

动画线程数= 3

9

D3DXMESH_MANAGED

165

216

10

D3DXMESH_DYNAMIC

90

Locked

11

D3DXMESH_SYSTEMMEM

91

Locked

12

D3DXMESH_WRITEONLY

12

Locked

表 5: 各种资源管理策略对使用此方案的基于CPU动画的性能影响

 

              最后,在配置B上测试使用本文建议的方案实现的多线程骨骼动画的性能。配置 B是一种采用了双核处理器和集成显卡的笔记本电脑配置。测试结果如表5所示。

 

测试用例序号 (性能指标:每秒帧数)

蒙皮模式

更新间隔帧数

场景中可视模型数量

5

10

15

16

CPU

2

202

120

85

17

CPU

6

203

120

85

18

GPU

2

57

30

20

19

GPU

6

57

30

20

      

表 6: 在配置B上测试此方案的性能 ( 动画线程数 = 1)

 

              测试结果表明,采用此方案的基于 CPU 的动画的性能大大优于基于 GPU 的动画(前者约是后者的 3.5~4.2 倍)。原因在于,在基于 GPU 的动画中,大部分动画渲染管线的负载都需要GPU来处理,这使得配置B中的集成显卡成为应用的性能瓶颈。而基于 CPU 的动画能够节省有限的 GPU 资源,并平衡CPU与GPU之间的负载,从而使应用的整体性能得到提高。此外,通过测试还可以发现,在配置 B 中,间隔更新方法对基于 CPU 和基于 GPU 的动画的性能几乎都没有影响。这是因为英特尔® 集成显卡采用了统一内存架构,GPU没有本地显存且总是访问主存中的数据。因此无论采用什么样的更新间隔,对总线流量都不会有明显的影响。

其他考虑

              一些额外的考虑可以扩展本文提出的方案。

              在实际游戏中,除了一些动作简单、节奏缓慢的模型,比如四处漫游的非玩家角色(NPC)之外,还有一些动作复杂,快速变化的模型,比如正在执行打斗动作的玩家角色(PC)。这两类模型常同时出现在同一个游戏场景中,但需要不同的动画更新频率。尽管上述demo中只实现了一种更新间隔,但本质上此方案支持多种更新间隔。最简单的实现两种更新间隔的方法是,对需要快速更新的模型,由主线程串行地执行渲染管线,仅对可以慢速更新的模型,放到线程池中处理;更加灵活和高效的方法是,定制一个具有两个优先级队列的线程池,取代缺省的系统线程池。高优先级队列存放需要快速更新动画的模型,低优先队列存放慢速更新的模型。线程池中的动画线程先处理高优先队列中所有模型,然后处理低优先队列。由于主线程每个间隔周期都会与相关的动画线程同步,所以不会发生低优先队列等待处理的饥饿现象。

              回顾此方案,尽管是为并行化骨骼动画的渲染管线,但它可以很容易推广到其他动画类型,例如变型动画(morphing),粒子动画,布料和柔体仿真等。除了进行骨骼变换和蒙皮外,此方案中的动画任务可以包含其他计算密集的任务,例如物理模拟、AI、冲突检测、阴影体生成等。在此方案的扩展应用中,根据具体任务特性,可以对此方案灵活地裁减,比如有些情况下不需要双缓冲,则可以保持传统的单缓冲,并依然利用本方案的并行性和性能。

总结

              本文提出了一种简单而有效的多线程方案,它能充分利用多核处理器的计算能力,提高骨骼动画的性能。此方案使用线程池、双缓冲和间隔更新的方法并行化了骨骼动画的渲染管线。此方案被证明对基于CPU和基于GPU的骨骼动画都有效。尤其对于基于CPU的动画,通过使用此方案,获得的性能比传统的单线程实现好很多。而且,与基于GPU的动画相比较,使用此方案实现的基于CPU的动画在某些高端显卡上的性能并不逊色,而且在主流集成显卡上反而显示了更好的性能。其原因是该方案能使基于CPU的动画更好地利用多核处理器的运算能力并且省下GPU资源可供渲染复杂的场景。因此,该方案特别有利于需要广泛的显卡兼容性的网络游戏,以及一些消耗大量GPU资源的视频游戏。而且,该方案能扩展应用到更多动画类型。此方案的主要不足是内存开销较大。尽管如此,该方案提供了一种模型动画的可选的优化方法,而且并不排斥传统方案。 因此,在开发一个实际游戏的过程中,开发者可以通过把此方案与其他优化方案结合起来,平衡CPU和GPU的负载,从而在多核系统上获得最佳的整体性能。

参考资料

[1] J.M.P van Waveren, Id Software, Inc.; Optimizing the Rendering Pipeline of Animated Models Using the Intel Streaming SIMD Extensions.

[2] MSDN: QueueUserWorkItem Function

http://msdn2.microsoft.com/en-us/library/ms684957(VS.85).aspx

[3] MSDN: Synchronization Functions

http://msdn2.microsoft.com/en-us/library/ms686360(VS.85).aspx

[4] Microsoft DirectX Documentation for C++: D3DCREATE_MULTITHREADED

[5] Microsoft DirectX Documentation for C++: Performance Optimizations

[6] Microsoft DirectX Documentation for C++: Resource Management Best Practices

[7] Microsoft DirectX SDK (April 2007): MultiAnimation Sample C++ (September 2003)

[8] Intel Thread Profiler: http://www3.intel.com/cd/software/products/asmo-na/eng/219690.htm

 

附录 A

演示源代码下载

作者简介



郭胜是英特尔开发商关系部门的一名应用工程师,主要负责为游戏独立软件开发商(ISV)提供英特尔技术咨询和性能优化服务。加盟英特尔之前,他曾任职于中国的龙头电信设备企业,担任了约两年的软件工程师。他拥有南京大学计算机硕士学位,擅长实时 3D 图形应用的软件设计、编程以及性能优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。 Java 绘图框架 JGraphEd JGraphEd 是一个 Java 的图形编辑应用和绘图框架。 Java 穿越NAT方案 JSTUN.tar JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密 码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用来处理应用程序的命令行参数的类库。 高性能内存消息和事件驱动库 Chronicle Chronicle 是一个超低延迟、高吞吐、持久化的消息和事件驱动的内存数据库,延迟只有16纳秒以及支持每秒钟 500-2000 万消息/记录。 google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来控制 Linux 桌面,例如打开google搜索、鼠标点击、下一窗口、打开帮助、静音等操作。 Java发送短信包 LemonSMS LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 Java日历空间 JCalendarButton JCalendarButton是一个简单的java swing日历选择控件。它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序,它从指定的URL开始,搜索所有可用的链接,以及链接之上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容。 WebSocket协议的Java实现 WebSocket4J WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 ( ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析器 JOpt Simple JOpt Simple 是一个简单的、测试驱动的命令行解析器,支持 POSIX getopt() 和 GNU getopt_long() Java的HTTP代理服务器 Smart Cache Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的缓存系统。 高性能的JSON处理 Jackson Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash 用来计算 MD5、SHA 哈希算法的 Java 类库,支持 "MD5", "SHA", "SHA-1", "SHA-256", "SHA-384", "SHA-512". 高性能RPC框架 nfs-rpc nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架,目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时,tps为168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能,例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的插件,用来对 HTML 文件内容进行清洗和格式化处理。它采用的是 JTidy 库对HTML进行处理。 INI文件操作类库 [ini4j] [ini4j] 是一个简单的Java类库,用来读写Windows的ini配置文件。同时还包含一个 Java Perferences API 的实现。 拒绝服务测试工具 Port Groper PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java 类库,用来提供在命令行中显示进度条的功能。 Tomcat 安装apr 支持 Tomcat Native Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司的开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU的快速和精确跟踪。 条形码扫描和识别程序 LVBarcode LVBarcode 支持下列的条形码格式:Codabar,I2of5,Code39,ExCode39?,EAN-8,EAN-13,Code128 A,Code128 B,Code128 C,MSI,UPC-A,UPC-E. 中文转拼音库 pinyin4j Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。拼音输出格式可以定制。 异步HTTP客户端开发包 HttpAsyncClient HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 HttpCore NIO 和 HttpClient 组件。HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。 NIO网络框架 xSocket xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新加载class文件而无需重启JVM的工具。 PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:Session Initiation Protocol)协议及SIP协议的其它扩展部 分。 Java表达式语法解析库 parboiled parboiled 是一个纯Java库提供了一种轻量级,易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施。你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发自定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以让 Java 程序轻松访问 Windows 平台上的 COM 组件。 JARP JARP是为petri 网提供的一个Java编辑器,基于ARP分析器。可以将网络图导出为 GIF, JPEG, PNG, PPM, ARP and PNML (XML based)文件格式。使用了优秀的JHotDraw 5.2 框架。 activemq(JMS消息服务器 ActiveMQ) ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。 Ajax框架 ZK.rar ZK是一个Ajax Java Web框架,利用少量代码就能够开发出拥有Rich UI的Web应用。ZK提供基于XUL的标记语言和事件驱动的组件,可以让你像开发桌面应用程序一样简单。支持EL表达式和脚本语言包括:JavaScript、Ruby和Groovy等。支持Annotation及数据绑定。集成Google Maps、FCKeditor、DOJO以及Timeline。 Atom协议实现 Abdera.rar Apache Abdera是Atom联合协议(Atom Syndication)和Atom发布(Atom Publication)协议的开源实现,目前尚处于“孵化”阶段。最近,Abdera到达了0.40里程碑版,朝着成功孵化迈出了重要一步。 CKEditor for Java.rar 在线网页编辑插件(用浏览器编辑后所见即所得),支持多种平台下的脚本(asp aspx php cfm Dhtml htc),还集成了上传图片组件,含简、繁中文 cloudxy(弹性云计算平台 Cloudxy).rar Cloudxy 立足于实现虚拟子网(以太网)的弹性云计算平台 该项目主要包含有两个子项目: HLFS - 虚拟机分布式镜像存储 (类似于亚马逊EBS,首先发布出来) ECM - 虚拟环境管理系统 (后续发布) Compass UI 工具 Compass.app.rar Compass.app 是一个针对 Sass 和 Compass 的菜单工具,帮助设计师通过 UI 的方式编译样式,而不用去记住命令行。它是用 JRuby 开发的,可以在多个平台上使用,而不用安装 Ruby 环境。 dnsjava(Java的DNS开发包 dnsjava).rar dnsjava是DNS协议的一个Java开源实现。 DNS服务器 Eagle DNS.zip Eagle DNS 是一个用 Java 语言开发的功能强大的多线程的平台无关的DNS服务器,基于 dnsjava 类库,支持 Primary Zones 和 Secondary Zones。 EclipseHTMLEditor.rar Eclipse HTML编辑器插件 Eclipse的语法着色插件 Colorer Take.rar Colorer Take 能为在Eclipse中打开的各种类型源代码文件按语法着色。支持150多种语言。 ehcache(Java缓存框架 EhCache).rar EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 Facebook API 的 Java 封装请求处理组件 RestFB.zip facebook的restAPI和graphAPI封装,供java调用。 Facebook个人资料导出工具 fbpwn.zip fbpwn(Facebook个人资料导出工具).rar Google API for Java.zip grimwepa(无线密码破解工具).rar 一个密码破解WEP和WPA加密的接入点(路由器) gtd-free(个人待办事项管理软件 GTD-Free).rar GUI界面引擎 SwiXml.zip Hibernate搜索框架 Hibernate Search.zip HTML5模板引擎 Thymeleaf.zip HTML文档解析器 HTMLParser.rar HTML解析器 jsoup.rar iqq(开源 QQ 工具 iQQ).rar jacob-liang-platform-uus(系统平台统一用户 ).rar jalarm(个人提醒工具 jAlarm).rar Java 3D图形引擎 Catcake.zip Java HTTP服务器 TJWS.zip Java 插件框架 jspf.zip Java 缓存系统 JBossCache.zip Java 计算机视觉库 BoofCV.zip Java-COM中间件 JACOB.zip Javascript 扩展工具包 j-et.rar Java串口开发包 RXTX.zip Java五线谱处理类库 abc4j.zip Java任务调度 jconch.rar Java加密包 Jasypt.zip Jasypt这个Java类包为开发人员提供一种简单的方式来为项目增加加密功能,包括:密码Digest认证,文本和对象加密,集成hibernate,Spring Security(Acegi)来增强密码管理。 Java加密库 JSDSI.rar Java单点登录系统 JA-SIG CAS.rar Java即时战略游戏 StarCraft Ⅰ.rar Java和DLL(COM)互操作 Jawin.zip Java图像处理类库 Java Image Filters.zip Java图形组件 JGraph.rar Java图形验证码 SimpleCaptcha.rar 一套用于生成各种图形验证码的库(Java) Java图表 JFreeChart.zip Java多播通讯框架 JGroups.zip JGroups是一个可靠的群组通讯Java工具包。它基于IP组播(IP multicast),但在可靠性,组成员管理上对它作了扩展。 JAVA字节码操作库 BCEL.zip Java实现的EverBox库 Everbox4j.zip Java实现的Web服务安全规范 WSS4J.zip Java对象验证框架 OVal.zip Java常用工具包 Jodd.zip Java应用服务器 Tomcat.zip Java应用框架 Nutz.rar Java开发的SHELL CRaSH.gz Java推箱子游戏 JSoko.rar Java搜索引擎 Lucene.zip Java时间工具包 JTimepiece.zip Java本地代码绑定工具 jSegue.zip Java本地调用接口 JNative.zip Java条形码生成库 Barcode4J.zip Barcode4J由Java语言编写而成,可以灵活的生成条形码。它采用Apache License V2.0许可,这使得它很容易在商业中被使用。它可以让您生成各种流行的一维和二维条码,包括DataMatrix 和 PDF417。以各种格式输出,包括SVG, EPS, bitmaps和Java2D,同样也可根据您的需要添加自己的输出格式。它为各种应用提供了插件,包括最重要的Apache FOP(格式对象处理器)。有一些用户将Barcode4J部署为一个servlet。 Java桌面搜索 JDesktopSearch.zip JDesktopSearch是一个基于Apache Lucene实现的桌面搜索引擎。它能够索引HTML、XML、OpenOffice、MS Word和PDF文档。其它类型的文件只索引文件名。 Java桌面程序开发框架 Viewa.zip Java模板引擎 FreeMarker.tar.gz Java源代码检索系统 JCite.zip Java的EPUB类库 Epublib.zip Java的HL7解析器 HAPI.zip Java的OpenID服务器 JOIDS.rar Java的UIMA注解类 uimaFIT.zip Java的UI皮肤 Quaqua.zip Java神经网络框架 Encog for Java.zip Java程序监控API Java Simon.zip Java算术表达式计算类库 ExpressionJ.zip Java线程错误捕获工具 CheckThread.zip Java网页浏览器 Lobo.zip Java网页爬虫 JSpider.zip Java视觉处理库 JavaCV.rar Java论坛系统 JForum.zip Java调用本地库 JNAerator.zip Java远程终端工具 JTA.rar Java邮件服务器 James.rar Java邮件检验库 JEmval.zip Java验证码生成库 JCaptcha.rar JAXP数据验证引擎 Serene.zip JBoss事务处理 JBossTS.zip JDBC连接池、监控组件 Druid.zip JFCSwing用户图形界面 SwingML.rar JNI代码生成器 JNIGen.zip JSCSS压缩工具 YUI Compressor.zip JSON查询语言 Jaql.rar JSON类库 Flexjson.zip JSP标签 Noka Tag.rar JS和CSS压缩混淆 JsCompressor.rar js文件压缩工具 Closure Compiler.rar jviolajones(人脸检测算法).rar lobby(经典board游戏 Domination).rar makagiga(开源个人桌面软件 Makagiga).rar MathML渲染器 JEuclid.rar OData的Java实现 odata4j.rar P2P应用程序协议框架 Java BEEP Core.zip paoding(中文分词库 Paoding).rar PDF 文档字体处理 FontBox.zip QQ农场外挂JAVA版本 qqhack.rar QQ登录的Java接口 open-qq.zip ralasafe(访问控制(权限管理)中间件 ).rar RPG游戏引擎 Arianne.zip SAT算法库 OpenSAT.zip sigar_mirror(系统信息收集API_Sigar).rar SNMP的MIB浏览器 JMIBBrowser.zip SQL解析类库 SQLJEP.zip SSH服务端 Apache SSHD.rar swiftp(Android上的FTP服务器 SwiFTP).rar swing-explorer(Swing开发辅助工具).rar Swing开发框架 Griffon.zip tbschedule(淘宝任务调度分配器).rar Tomcat的管理和监控 PSI Probe.zip WebDAV网关 Davenport.rar WebSocket通讯框架 jWebSocket.rar Web代理服务器 RabbIT.tar.gz Web服务框架 Apache Axis.rar Web相册平台 Apache PhotArk.rar Web集成开发环境 Cloud9 IDE.zip WordNet的Java包 JWordNet.zip XML解析器 Xerces.rar Yahoo的分布式流计算平台 S4.rar YAML解析器 SnakeYAML.zip zaproxy(Web渗透测试 Zed Attack Proxy).rar zxing(条形码处理类库).rar 业务流程管理(BPM)和工作流系统 Activiti.zip 个人博客软件 PersonalBlog.zip 个人知识库 Piggydb.zip 中国移动短信协议CMPP封装 hicmpp.zip 中文分词工具包 smallseg.jar 中文分词库 IKAnalyzer.zip 中文自然语言处理工具包 FudanNLP.zip 人工智能工具包 OpenAI.zip 企业信息系统开发平台 JBob.zip 使用Redis存放Session RedisManager.zip 入门级j2ee开源项目 simplejee.zip 全文搜索服务器 Solr.tgz 分布式缓存框架 SwarmCache.zip 加密库 BeeCrypt.zip 即时消息传输平台 Openfire.rar 国产Ajax框架 Buffalo.rar 国产纯Java多核体系结构模拟器 Archimulator.zip 在Java中运行Perl脚本 JERL.zip 坦克机器人战斗仿真引擎 Robocode.zip 多播事件总线 Avis.zip 多环境应用程序框架 WebOnSwing.rar 多用户在线游戏服务器端框架 Marauroa.tar.gz 大文件上传的Java Applet mupload.rar 天乙社区.rar 密钥管理工具 Keytool-IUI.zip 富客户端开发框架 Spring Richclient.tar.gz 开放实时数据处理平台 Twitter Storm.zip 开源JSF组件库 JQuery4JSF.rar 开源LDAP浏览器 JXplorer.zip 开源事务管理器 JOTM.zip 开源工作流系统 JWFD.rar 开源搜索系统 Red-Piranha.zip 开源日志管理 Logstash.jar 开源机器人技术中间件 OpenRTM-aist.zip 开源的Swing组件 JIDE.zip 开源足球游戏 Slam Soccer.rar 异步IO框架 Cindy.rar 懒惰者代码生成器 IdlerCodeGenerator.zip 拼写检查器 Hunspell.gz 指纹识别开发包 SourceAFIS.zip 数字图书制作工具 EpubCheck.rar 数据库连接池 C3P0.src.zip 数据持久层框架 Hibernate.zip 文件上传控件 GWTUpload.rar 文件压缩解压缩包 Commons Compress.rar 文件系统API EntityFS.zip 文字识别工具 Eye.zip 文本加密解密工具 ImmediateCrypt.zip 无线消息交换服务 HomerMX.zip 日历同步统计 GCALDaemon.zip 日历控件 Click Calendar.rar 最快速的java代码生成器 rapid-generator.zip 服务框架 Dubbo.rar 服务端JavaScript框架 RingoJS.rar 桌面博客工具 Thingamablog.zip 桌面图形计算器 GraphingCalculator.jar 桌面软件开发框架 joyWindow.zip 游戏引擎 JBox2D.zip 源问答系统 OpenEphyra.zip 漏洞检测程序 Yasca.zip 用户界面框架 XUI.rar 短信收发包 SMSLib.zip 磁盘的KV存储 JDBM2.rar 程序代码编辑器 jEdit.tar.bz2 第三代的P2P网络 ANts 简约的微博同步程序.zip 编程脚本引擎 Fantom.zip 网络应用框架 Netty.tar.bz2 网络抓包工具 jpcap.zip 网络数据包捕获函数库 jNetPcap.zip 网页抽取工具 Krabber.rar 联系人导出 ContactList.zip 表达式解释引擎 JSEL.rar 语音合成系统 FreeTTS.rar 调用远程API规范 XINS.zip 豆瓣OAuth认证示例项目.rar 跨平台的文件同步工具 Capivara.rar 远程文件传输工具 MammothCopy.tar.gz 通用数据底层 Jsa4j.zip 遗传算法包 JGAP.zip 重复数据删除 Duke.zip 面向对象的JavaScript框架 Dojo.rar 面向对象的脚本语言 ObjectScript.tar.gz 高性能Java网络框架 MINA.zip 高性能web代理程序 hyk-proxy.rar 高性能的Java 3D引擎 Xith3D.zip

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值