[引擎开发] 渲染架构与高级图形编程

[本文大纲]

概念引入

图形API设计

    OpenGL

    DirectX

GPU驱动架构

    Compute Shader

    Indirect draw   

移动端管线架构

    Subpass

    光照渲染路径

多线程架构

     线程竞争

     独立渲染/图形API线程

     多线程渲染提交

ue4高级图形编程

    ue4中的RHI设计

    ue4中的多线程架构

    ue4中的RDG架构

    ue4中的Indirect draw

    ue4中计算着色器应用

    ue4中的移动端渲染

        (注:本文内容参考了大量公开的技术分享)

概念引入

       图形API提供了GPU硬件的访问接口,因此我们可以通过直接通过调用图形API来进行图形引擎开发。但图形引擎通常会在图形API的基础上做一些封装,要么是对常用方法的简单封装,要么是一套较为完整的封装体系。之所以需要引入渲染框架,往往是出于以下原因考虑:

        (1) 提高复用性

        在图形编程中,我们会有一些比较常用的操作,比如创建屏幕大小的2D纹理,更新顶点等缓冲区的数据等,底层API接口的调用较为繁琐,因此可以对这些常用操作做一些简单封装。

       更进一步的,对于图形编程而言,进行效果开发时,我们往往更关注shader编写时渲染数据的输入和输出,而不希望考虑背后数据拷贝和同步、显存分配等细节。为了将这两者更好地解耦,隐藏底层的实现细节,我们需要封装一套简单易用、性能较好的渲染框架,能够以较少的代码量/甚至图形化的形式完成逻辑的开发。

       (2)通用调用

        为了确保图形引擎能够适配多端,需要支持多套图形API,比如Windows端的DirectX,移动端的OpenGLES, Metal和Vulkan等,为每套API单独维护一套代码是比较繁琐的,因此我们往往考虑在API层进行封装,以便可以用同一套渲染逻辑开发多端的效果。

      (3)应用高级策略

       为了加快渲染数据的准备,从而提高渲染效率,我们通常会使用一些高级策略,比如多线程渲染、GPU驱动等。

图形API设计

        由于渲染架构或多或少都会借鉴一些图形API的设计思想,可能是API的一些名称的沿用,或者是设计的扩展与封装。在对图形API没有基础认知的情况下,可能会难以理解有些架构设计的依据。

OpenGL

种类

        OpenGL在多平台上均有对应的实现,包含Desktop OpenGL,以及适用于移动端的OpenGL ES,适用于网页端的Web GL。

        OpenGL本身只是一套标准,每个硬件厂商都有自己的实现,比如在移动平台设备上就包含Mali, PowerVR, Adreno等,针对不同的实现,会有不同的适配情况。

ogl

        固定渲染管线的代表。管线执行是固定的,无法进行GPU编程,只能通过CPU请求的方式修改GPU的渲染状态,比如修改相机、投影矩阵,请求绘制几何体等。

es3

        最重要的变化就是支持了compute shader。

        新的扩展:

        曲面细分支持

        command list支持:NV_command_list

设计

        OpenGL是基于状态机的设计。具体表现为,每个状态的请求都使用独立的API,对于同一属性,设置的状态会一直生效,直到下一次状态设置。

        我们调用的函数可以划分以下几种类型的:

       ① 创建/删除对象

       如glGenTextures,glGenBuffers,glTextureData,glCreateShader等;

       ② 设置当前缓冲区

        如glActiveTexture,glBindTexture,glBindBuffer等;

       ③ 设置缓冲区状态

       如glEnableXXX,glVertexAttribPointer等;

       ④ 渲染提交

       如glDrawArrays, glDrawElements, glDispatch等;

       无论是哪个具体的模块,OpenGL的API设计都基本遵循类似的流程:

       初始化数据时,创建-绑定-设置,渲染时,绑定-设置-提交。

       OpenGL的语法非常简单直白,相比起Dx, Vulkan这样更偏向工程的设计,非常适合跨平台的应用或者图形算法的快速验证。

DirectX

dx11

       dx11中,参数往往通过上下文结构体传递。

       工作提交

       它包含两种类型的context,一种是即时上下文,这意味着我们的指令会被立刻提交到图形层;另一种是延迟上下文,此时指令将被缓存,在合适的时候才添加到即时上下文并提交到图形层。

       

        资源管理

        在资源管理上,dx11将资源简单划分为如下几个类型:

      (1)Default。仅GPU读写。

      (2)Dynamic。CPU可频繁读写的。

      (3)Staging。CPU可读取GPU显存拷贝。

        显存由dx11内部分配和管理。

dx12

        dx12的几个核心的设计:

        

GPU驱动架构

Compute Shader

        计算着色器没有传统光栅化管线的流程,它的出现主要是为了解决GPU的通用计算问题。我们可以利用计算着色器,使用GPU完成并行计算。计算的结果存储在显存中,可以直接在渲染管线中使用。

        通过计算着色器,我们可以完成GPU加速的物理模拟计算,如GPU粒子模拟,布料模拟等;也可以让原本由CPU负责的渲染数据准备工作转移到GPU上,即使用GPU驱动的渲染架构。

基本概念

        计算着色器可以实现并行计算,它的基本概念包括输入输出(纹理或缓冲区),并行度(工作组和工作组群),并行任务的同步(共享内存和内存屏障);它们的具体含义如下:

        工作组:内部包含了用户定义的工作线程数量,在3D空间中排列,包含三个维度,可以并行执行;

        共享内存:工作组内共享的内存,可读写,一般在16k-32k;

        工作组群:计算着色器可以创建多个工作组,称为工作组群,并行情况取决于硬件设备支持的并行工作单元;

        结果:输出到可写的纹理/缓冲区或结构缓冲区,且任意位置可写;

工作组同步

        工作组同步就是让所有工作线程运行到同一个位置,然后再继续执行。

        比如在共享内存写入的时候,如果下一个计算的输入依赖于上一个计算的写入,为了保证其它线程的写入已经完成,需要使用工作组同步的功能。

GroupMemoryBarrierWithGroupSync();

输入参数

        GroupThreadID

        GroupID 

        DispatchThreadID

        GroupIndex

计算着色器有哪些好处?

        ① 支持任意位置的写入

        相比起PS只能写入当前位置的像素,CS可以写入任意位置的像素。

        ② 显示地控制同步

        通过调用GroupMemoryBarrierWithGroupSync进行主动的线程同步。传统着色器的同步往往是由于并行被打断被动进行同步。

        ③ 可使用共享内存

        使用共享内存有如下优点:

        (1)默认情况下我们会使用RT来缓存一些中间计算结果,这会导致计算需要在多个pass完成,并且会导致RT的切换。共享内存可以缓存一些中间的计算结果,支持在一个pass内完成计算,避免RT切换带来的带宽消耗。

        (2)缓存贴图的采样来避免重复采样。比如图像空间算法Bloom,Blur,需要采样周围的像素,如果使用PS来计算,同一个像素会被多次采样,而使用CS可以把贴图采样的结果缓存到共享内存中,确保工作组内每个像素只会被采样一次。

       (3)缓存复杂的计算结果

        ④ 原子操作

        不同工作线程同时写入同一地址时,原子操作是非常必要的。

        ⑤ 与传统管线并行

         IOS设备上完全并行,Mali设备上可以和Vertex Shader顺序执行,和Pixel Shader并行。可以减少输入输出的依赖,提高并行性。

计算着色器有哪些不足?

        ① 不支持FrameBuffer的压缩

        ② 不具备纹理读取缓存的硬件优化

         在ps中,采样当前uv对应的纹理会更快,因为会预先缓存;

        ③ 纹理输出格式较少

Indirect Draw

        一般情况下,在渲染调用中,我们比较常用的方式是使用CPU来提交渲染指令,准备渲染数据。

        具体来说,当我们调用Draw接口的时候,我们就已经在CPU中明确了绘制对象和对应数据。而对于间接绘制而言,我们指定的并不是具体的数据,而是一个缓冲区,这个缓冲区将由GPU进行填充,一般情况下会使用计算着色器来实现GPU的数据填充。

        完成了缓存区的填充后,数据将直接传递给顶点着色器进行处理。

        Indirect draw的优点

        这种做法的好处是,如果由CPU来准备数据,一方面会消耗CPU准备的时间,另一方面需要进行CPU和GPU的大量交互。CPU的处理任务多,时间较长,如果CPU的处理速度较慢,将会成为渲染流水线的瓶颈,降低绘制效率。如果使用GPU进行调度,就可以避免频繁的数据拷贝,并能够并行处理任务,从而加快数据准备的速度,避免其成为渲染流水线的瓶颈,提升绘制效率。

       OpenGL的Indirect Draw

       直接绘制的情况下,OpenGL提供的非索引版本接口如下:

void glDrawArrays(GLenum mode, GLint first, GLsizei count);

       glDrawArrays在调用时并没有指定对应的渲染数据,而只是指明了调用的模式和绘制的起始位置、数量等。调用者应该确保当前OpenGL上下文已经绑定相关的缓冲区数据/Shader Program/输入输出。绘制指令将根据当前上下文中的数据进行提交。

       而对于非直接绘制而言,OpenGL提供的接口如下:

void glDrawArraysIndirect(GLenum mode​, const void *indirect​);

        此时我们不需要显式传输渲染数据,而只需指定indirect buffer。

        indirect参数对应着GL_DRAW_INDIRECT_BUFFER的偏移位置。Indirect Buffer对应着这样的结构体:

typedef  struct {
   GLuint  count;
   GLuint  instanceCount;
   GLuint  first;
   GLuint  baseInstance;
} DrawArraysIndirectCommand;

        这意味着我们只需要在GPU填充这样的结构体数据即可,可以使用计算着色器来完成这一点。

        对于索引渲染也有类似的接口。

        总体而言,大致的调用逻辑如下:

       (1)并使用计算着色器或其它方法完成非直接绘制缓冲区数据的填充;

       (2)绑定对应的非直接绘制缓冲区;

       (3)调用非直接绘制的接口,指定基元类型以及偏移位置(一般情况不偏移为0);

        DirectX的Indirect Draw

void DrawIndexedInstancedIndirect(
  ID3D11Buffer *pBufferForArgs,
  UINT         AlignedByteOffsetForArgs
);

       在dx11中,我们指定对应的缓冲区,以及缓冲区偏移值。

       缓冲区结构需要设置D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS的标志。

        Indirect Draw的应用

        (1)基于GPU的剔除

         类似基于Hi-Z的遮挡剔除算法是在GPU中实现的,如果物体在CPU中进行收集,那么就涉及到请求GPU执行遮挡剔除,并阻塞等待剔除结果的流程。但在Indirect draw流程中,就无需回读,直接可以将参数传递。

       (2)程序顶点

         我们可能会涉及到程序生成的网格数据,比如海水,草地,它们属于程序化资源,较少依赖美术资源,因此非常适合使用indirect draw。我们可以直接在计算着色器中生成网格数据以及相关顶点动画。

        例子:https://github.com/SaschaWillems/Vulkan/tree/master/examples/indirectdraw

移动端管线架构

        我们会在这一章讨论和移动端特性相关的渲染架构设计思想。

        之所以要单独讨论移动端,而没有单独讨论PC端,是由移动端的特殊硬件决定的。移动端为了降低带宽消耗,减少手机发烫的情况,在架构设计上相对复杂,也做了不少妥协。针对这种特殊的情况,我们在编写图形管线的时候也应该做一些针对性的优化。而在PC端上就没有类似的问题,我们可以尽可能的使用一些高级特性,包括多核架构来提升渲染性能。

Subpass

        subpass是针对移动端TBR/TDBR架构提供的一个渲染优化方案。Vulkan,Metal,OpenGL等图形API对此提供了良好的支持。

        在TBR/TDBR架构中,渲染结果不再直接写入framebuffer,而是将把整块framebuffer空间拆成多个Tile,渲染结果会写入Tile上访问速度更快的on-chip memory,在当前帧绘制完成后,再把数据从Tile写入到framebuffer。通过这种方法优化了带宽消耗。

        把结果从Tile写入framebuffer的过程称为Resolve,将framebuffer的内容载入Tile称为Restore。

        因此,控制什么时候进行on-chip memory和framebuffer的Resolve/Restore能够较好地控制性能。在有些情况下,比如后处理阶段,我们可能需要多个pass来完成后处理操作,并且最终写入的都是同一个渲染目标。此时,我们就可以将后处理的中间结果存储到on-chip memory,等到后处理所有pass完成后,再将数据写入到framebuffer。

       基于这一思路,图形API提供了subpass相关的接口,使得我们能够将一些有关联的pass合并。即使图形API层没有较为直接的接口,我们也可以在应用层通过一些渲染框架的封装来实现类似的思想。

        Vulkan中的subpass 

        subpass这一名字源自于Vulkan图形API,Vulkan对该功能做了比较完善的封装。因此,我们先对Vulkan中subpass的设计做简单介绍。

        Vulkan本身有RenderPass和subpass的概念,subpass的一些定义由VkSubpassDescription结构描述:

VkAttachmentReference colorReference = { 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL }; 
// 1 : Index ..OPTIMAL : attachment type
VkAttachmentReference depthReference = { 2, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL }; 
// 2 : Index ..OPTIMAL : attachment type
VkAttachmentReference inputReference = { 3, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL };
// 3 : Index ..OPTIMAL : input type

subpassDescriptions[0].pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpassDescriptions[0].colorAttachmentCount = 1;
subpassDescriptions[0].pColorAttachments = &colorReference; // Output
subpassDescriptions[0].pDepthStencilAttachment = &depthReference; // Output

subpassDescriptions[0].InputAttachmentCount = 1;
subpassDescriptions[0].pInputAttachment = &inputReference; // Input

        上述代码描述了将一个颜色/深度缓冲区绑定到subpass[0]上,使得subpass内可以写入颜色和深度,并绑定了一个缓冲区的数据作为输入。

        OpenGL中的subpass

        OpenGL没有直接提供subpass的封装,但是它支持了多个和读写相关的扩展,能够让我们做一些上层的封装:

        (1)Framebuffer Fetch:可在Shader中以较低带宽采样MRT,是直接采样的硬件优化版本;

        (2)Depth/Stencil Resolve : 可在Shader中获取深度/模板缓冲区;

        (3)Pixel Local Storage:可在Shader中读写on-chip memory;

       对于subpass而言,我们主要使用Pixel Local Storage扩展。可以在shader中控制数据在on-chip memory读写,从而实现subpass的思想。 

        需要通过如下宏开启扩展:

#extension GL_EXT_shader_pixel_local_storage : enable

        我们可以通过扩展指定的格式来自定义在on-chip memory上读写的结构:

__pixel_localEXT FragLocalData
{
    layout(r11f_g11_b10f) vec3 Normal;
    layout(r11_g11f_b10f) vec3 Color;
} Storage;

       图形API对subpass的支持

       ① 所有Vulkan平台都支持subpass

       ② 所有IOS平台都支持frame_buffer_fetch

       ③ 只有部分OpenGL(Android平台)支持frame_buffer_fetch

       (1)Pixel Local Storage : Mail GPU & ImgTech PowerVR GPU支持,Adreno GPU不支持;

       (2)FrameBuffer Fetch : Adreno GPU支持,Mali GPU不完全支持。

光照渲染路径

        在渲染场景中,我们往往有多种光照和材质,计算不同光照对不同材质的影响是图形编程中非常核心的一个环节。在什么时候,以怎样的形式渲染光照也是渲染架构需要考虑的。

        一般来说,我们会根据项目的实际需求,所处的平台特性进行光照渲染路径(Shading Path)的选择。

        在移动平台上,在早期阶段,由于手机的带宽有限,往往会选用前向渲染的技术方案,forward+在forward的基础上对光照计算进行剔除。延迟光照通常用于pc或主机平台,但目前也已经开始出现基于移动端优化的延迟光照。

        接下来将会对每种渲染路径做一个简单的介绍。

前向光照

        前向光照是一个相对简单的渲染路径,在绘制物体的同时直接进行光照的计算,它的优点如下:

        (1)实现比较简单

        (2)能够实现任意多的着色模型数量

        (3)输入参数的数量限制较小

        (4)没有额外的带宽和显存占用

        (5)能够应用硬件反走样

         缺点如下:

        (1)无法获取足够多的信息,难以应用一些高级效果(如贴花)

        (2)多光照情况下计算量较大,为m(光照数量)* n(物体数量)次,overdraw比较严重

          (3)为了处理不同光照类型,shader代码中需要包含不同光照类型的组合,导致shader代码占用内存过大

Forward+

        前向光照计算在处理有大量光照的场景时性能会快速地达到瓶颈。针对这一问题,我们对forward算法进行了改进,称为forward+。

        场景中主光源的数量是有限的,一般会用到大量光源的情况主要是局部灯光。局部灯光的特点是,只会对场景中的部分物体产生光照影响。因此,我们没有必要对所有物体都计算光照,只需要对受到光照影响的物体进行计算即可。

        但是,着色器无法知晓每个对象具体受到哪些光照影响,这就需要我们预先准备这些数据。

        为了实现这一点,forward+在forward的基础上在着色阶段前新增了light-culling阶段。我们可以在CPU中实现基于对象的光照记录,但是这种方法并行度较低;也可以在GPU中实现光照记录,一般会使用计算着色器实现对应功能。

        由上可见,forward+能够更好地处理多光照的情况,减少不必要的计算,但是也会带来一些管理开销,实现也相对复杂一些。因此我们应该根据场景的实际光照情况选择合适的光照渲染路径。

延迟光照

        通俗来说,延迟光照会在后处理阶段进行光照计算。

        延迟光照主要分为两个阶段:

        第一个阶段,我们渲染所有物体,并将渲染的数据写入到多张渲染目标,称为GBuffer,这些数据包括基本颜色、法线、深度、材质属性等;

        第二个阶段,我们根据GBuffer中的信息,进行屏幕空间的光照计算,得到最终渲染的结果。

        它的优点如下:

        (1)多光照情况下,以较低的复杂度绘制。它的复杂度和物体数量无关,对于m个光源,屏幕空间每个像素只需计算m次。overdraw带来的消耗更低。

        (2)记录了GBuffer信息,对一些高级的屏幕空间算法的实现更友好

        (3)将材质和光照计算的过程分离,减少所需的shader数量

        缺点如下:

        (1)用到多张渲染目标,带来严重的带宽消耗和显存占用

        (2)材质信息需要记录在GBuffer中,限制了材质的多样性

        (3)无法应用硬件反走样,需要自己实现相关AA算法

        (4)对透明物体没有较好的处理办法

Tile-Based延迟光照

        我们知道移动端无法很好地应用延迟光照主要就是因为带宽问题。随着图形API的发展,近几年也出现了针对移动端优化的延迟渲染,也就是基于前文提到的subpass技术实现的延迟光照。

       此时,光照绘制分为两个步骤:

       ① 物体写入GBuffer,GBuffer存储于on chip memory。

       ② 利用GBuffer进行光照计算,将最终颜色写入framebuffer。

      在此过程中,实际上GBuffer只作为中间过程量存在,因此也就在保留延迟渲染减少overdraw的优点的情况下,避免了GBuffer写入带来的带宽消耗。但同时,也失去了传统延迟光照的一些优点,比如后处理阶段无法利用GBuffer信息作为输入,因为此时GBuffer是memoryless的。

混合管线

        在实际的项目中,不同的渲染路径没有绝对的区分,整个管线可能是混合的,比如我们会遇到如下情况:

        ① 在延迟管线中,大部分光照是后处理完成的,但是仍然有一些简单光照计算可能放到前向阶段就完成了,直接写入到SceneColor中;

        ② 在延迟管线中,会单独处理透明物体,让其依然按照forward管线进行绘制;

        在很多情况下,我们会发现,有些渲染算法本身可能并不复杂,有时候真正的难点在于如何使用一套渲染框架描述尽可能多的着色模型,并且保证性能和易用性。因此,在处理渲染管线时,也会为了更好地适配更多效果做或多或少的妥协,加上各种各样的特殊处理。我们也就会吸取不同渲染路径的优点来实现最终的渲染架构。

多线程架构

线程竞争

        在多线程编程中,我们经常会有多线程访问数据的需求,当同一时间有多个线程都想要访问同一个数据时,就会出现线程的竞争。为了解决这一问题,我们主要从两个角度考虑,第一个是针对特定场景从架构上避免线程竞争的发生;另一个是如果无法避免线程竞争应该采用的解决方案。

       我们将在这一章节做一些简单的介绍,并在后续多线程编程中进行更为详细的介绍。

       (1) 加锁 / 线程安全的容器

       这是解决线程之间竞争最通用的一种方法,适用于大部分场景。

       当其中一个线程访问数据时,对其上锁,在此期间,其它线程将阻塞等待锁的释放,并行被打断。线程之间的竞争现象越严重,对性能的影响越大。

    (2)同步点的设置

       我们可以通过设置同步点来确保逻辑的先后执行顺序。较为常见的应用是,当进行多线程数据写入后,应该设置同步点,保证所有数据都已经完成写入。接下来的步骤再访问这些写入的数据才是安全的。

    (3)唯一的访问所有权

      还有一种比较常见的方案是,只能允许一个线程对数据进行直接访问,如果其它线程也希望访问这一数据,需要请求有权限的线程,具体表现为将添加/修改/删除封装为命令,添加到命令队列中。这意味着这些操作是录制的,是异步请求/延迟发生的。

      在图形编程中,我们通常会仅让渲染线程拥有对渲染数据的访问权限。

    (4)拷贝数据 / 双队列

      对于每帧的渲染数据这种无状态的上下文数据(Context),它的数据传递关系比较简单,通常是在主线程将一些原生数据传递给渲染线程处理。这里可能出现线程竞争的地方是,如果主线程和渲染线程共用同一份数据,当渲染线程处理前一帧数据时,主线程对其访问就会发生竞争。

      针对这种情况,我们往往使用双队列(渲染线程和主线程操作自己的队列)或者数据拷贝(每个线程维护自己特定的数据结构)的方式,从根源上避免竞争的问题发生。

     (5)环形队列

       环形队列通常应用于任务提交,如逻辑线程提交任务,渲染线程执行任务。可仅使用栅栏防止两者同时访问一个数据,避免了对每个数据的读写都要进行加锁操作。

独立渲染线程和图形API线程

       独立的渲染线程是指执行准备渲染数据、提交渲染指令过程的线程。这一过程相比起逻辑线程,通常执行时间较长。使用独立的线程可以提高并行度,减少GPU的等待。

       此外,为了减轻渲染线程的压力,也会考虑将提交渲染指令这一过程从渲染线程中分离出来,放入单独的图形API线程中。该线程根据渲染线程准备的数据,调用图形API。图形API线程与渲染线程的交互类似于渲染线程和逻辑线程的交互,因此后文将以逻辑线程和渲染线程的交互为例进行介绍。

      为什么渲染线程能够提升渲染效率

      传统的单线程架构中,我们会在一帧内完成逻辑更新以及渲染绘制。这意味着,当我们在执行逻辑更新时,GPU将进入等待状态。当GPU有机会处于空闲状态时,说明我们没有完全榨干GPU的性能,这带来了资源的浪费。

      而将任务并行化后,渲染线程将一直处于活跃状态,此时GPU等待的概率降低,渲染效率得到提升。

      另一方面,对于多核CPU硬件,当我们在执行逻辑更新时,有些CPU可能也处于空闲状态,此时并行地执行渲染任务,也能提升CPU的利用率。

      概括来说,就是让CPU和GPU时刻都处于高速运转的状态。

      逻辑线程和渲染线程

       逻辑线程和渲染线程并不是完全独立的,它们存在一定的依赖关系:

    (1)渲染线程需要接收来自逻辑线程的指令和数据并执行

    (2)逻辑线程有时需要阻塞等待渲染线程的完成

      数据访问

      在数据访问上,参考线程竞争章节,一般会遵循唯一的访问所有权,并维护拷贝数据或双队列结构。

      (1) 双队列结构

      其中,双队列结构意味着当逻辑线程往队列A写入的时候,渲染线程读取队列B的内容,等逻辑线程完成了队列A的写入后,交换两个队列。也就是渲染线程读取队列A的内容,而逻辑线程写入队列B。

      这样的数据结构可以确保两个线程不会同时访问同一队列,但是,这也意味着两者必须有严格的先后执行顺序。

      (2) 拷贝数据

      逻辑线程的数据提交到渲染线程时,渲染线程会维护一份独立的数据拷贝。在牺牲一部分空间的情况下,避免数据的竞争。并且该方法对先后执行顺序没有过多限制。

      需要注意的情况是指针的拷贝。我们应该尽可能避免指针的浅拷贝,而是直接缓存对应的数据,或者为指针添加引用计数。除非我们能够确保逻辑线程不会直接对指针做修改或销毁的操作,或者确保正确的先后执行顺序。

      渲染线程资源访问权

      在渲染线程架构里,数据的传输绝大部分都是单向的,也就是只应该从逻辑线程传往渲染线程。当一个数据提交到渲染线程,我们就认为它应该归渲染线程管理,如果想要访问或者修改渲染数据,应该请求渲染线程执行这一操作。

      数据的生命周期

      在渲染提交过程中,存在两部分数据:

     (1)跨帧存储的数据。主要是场景对象数据,包括几何体、灯光等。

     (2)每帧的上下文数据。比如当前相机、投影矩阵,渲染状态等。这类数据要么是每帧计算得到的,要么是每次提交指令时重新构造的非缓存状态。

      在设计渲染线程的时候,应该合理管理并区分这两种不同生命周期的数据类型。

     逻辑线程和渲染线程同步

      逻辑线程向渲染线程通过添加指令的方式进行数据和逻辑的交互,命令队列通常由环形队列进行维护。

      我们往往用类来封装每个命令,并且将类的结构以字节码(Buffer)的形式进行管道数据传输。

      请求分为不需要返回值/同步和需要返回值/同步两种情况。对于前者,通常适用于添加灯光/几何体等简单的请求指令;对于后者,我们可能需要返回值,比如,我们在逻辑层请求渲染线程对当前画面进行拍摄,并能在逻辑线程读取这张快照。

      返回值的读取分为同步和异步两种。同步意味着我们将堵塞等待,异步意味着我们将设置一个同步点,当渲染线程完成当前命令后,发起异步回调。 

多线程渲染提交

       多线程渲染提交是指渲染指令的异步提交,这需要图形API和硬件的支持。

       这意味着我们可以异步地通过图形API渲染指令提交到不同的命令队列。

       多线程渲染提交能够很好地减轻CPU到GPU传输数据的压力,提升drawcall效率。

       如图所示,独立的渲染线程意味着Command Queue的提交在渲染线程上完成,而多线程渲染意味着可以有多个CommandQueue同时运行。

ue4高级图形编程

ue4中的RHI设计

       RHI,即Render Hardware Interface,它基于不同的图形API以及硬件,封装了统一的渲染逻辑,隐藏了图形API的底层实现逻辑。ue4的渲染接口封装风格语法更接近现代语法的DirectX,渲染指令将通过RHICommandList设置。

统一封装

       对于调用者而言,只需执行RHI层提供的统一图形接口,函数内部将通过GDynamicRHI指针索引到对应的图形API实例。对于相同的代码,GDynamicRHI在不同平台下将会实例化为不同的对象,比如,在pc机上将调用directX,在移动设备上则会调用metal/OpenGL等。

       以纹理创建为例,DynamicRHI就包含了如下多种实现:

      

       RHI的封装从封装粒度来区分,包含两种不同的类型:一种是对图形API的直接转发,另一种是对图形API的简单二次封装。

ue4中的多线程渲染

数据的线程安全

(1)几何体独立的线程数据

        对于每个对象的几何体数据,在不同线程有各自的数据结构,分别是MeshComponent,Scene Proxy和Vertex Factory:

        ① UPrimitiveComponent对应游戏线程私有的几何体数据;

        ② FPrimitiveSceneProxy/FPrimitiveSceneInfo对应渲染线程中的几何体数据,它用于准备渲染数据时,组装几何体数据,以便生成对应的渲染指令;

        其中,Proxy用于数据从游戏线程到渲染线程的交互,而SceneInfo是渲染线程私有的。

        ③ FVertexFactory对应于RHI层的网格数据,FMatertial对应于RHI层的着色器数据

        之所以要封装多个结构,并在不同结构之间拷贝数据,是出于线程安全考虑。为了避免资源竞争,ue4采取的办法就是在不同线程进行数据交互时,记录独立的数据拷贝。

(2)独立线程数据结构间数据的传递

        初始化:

        在游戏线程中,我们通过调用FScene::AddPrimtives(RendererScene.cpp),创建FPrimitiveSceneProxy,再基于SceneProxy创建对应的SceneInfo。

        在渲染线程中,将SceneInfo加入到对应的Primitives数组中。

        修改:

        游戏线程修改了PrimitiveComponent属性后,需要调用MarkRenderStateDirty来通知渲染线程更新数据。

        渲染线程检测到RenderState状态发生变化后,会先销毁原有RenderState并请求创建新的RenderState。

 (3)线程竞争

       虽然ue4已经提供了线程独立的数据结构,但是如果在Proxy中传递指针或引用,依然存在风险。

       比如我们将一个UObject传递给Proxy结构,此时如果在渲染线程中访问这个数据,就可能会有线程竞争的问题,因为这个数据可能已经被游戏线程回收了。

       为了避免这个情况,我们可以:

       ① 尽量存储对应的数据而不是使用指针的直接复制;

         比如我们想要在渲染线程访问AActor的一个值属性,可以直接在Proxy中镜像这个属性,而不是缓存AActor指针。

       ② 尽可能从设计上避免在游戏线程和渲染线程访问同一份数据;

         一些渲染线程特有的函数使用_RenderThread的后缀,这些函数操作渲染线程私有的数据。

       ③ 确保渲染线程引用数据的时候,数据不会被删除;

         比如在UPrimitiveComponent准备销毁自身的时候,可以添加一个DetachFence,等到渲染线程完成后,gc再去真正销毁数据。

(4)其余独立的线程数据

       除了几何体有独立的线程数据外,大多数常见的结构也有各自对应的结构。一般而言,游戏线程数据结构以U开头,渲染线程数据结构以F开头。

       比如,UWorld对应于FScene,FSceneView对应于FViewInfo。

        

(5)显存数据管理

       如上所提,ue4维护了以F开头的显存数据。这些数据是仅渲染线程可访问的。如果游戏线程希望访问渲染数据,需要使用间接的方式,即通过命令队列来完成。

       举例而言,如果我们希望释放纹理资源,应该通知渲染线程来完成这一操作。这个操作不是立即执行的,而是会加入到渲染队列,按序执行。

void UTexture::ReleaseResource()
{
	if (Resource)
	{
		
        // ...
		ENQUEUE_RENDER_COMMAND(DeleteResource)([ToDelete = Resource](FRHICommandListImmediate& RHICmdList)
		{
			ToDelete->ReleaseResource();
			delete ToDelete;
		});
		Resource = nullptr;
	}
}

渲染线程

        ue4包含了主线程,渲染线程以及(可选的)RHI线程。

        主线程通过抽象的命令队列向渲染线程添加命令,渲染线程通过图形API的命令队列向图形管线添加命令。

        由于渲染线程较为耗时,它往往大幅落后于游戏线程,为了减少两者的差距,游戏线程在Tick结束后会阻塞等待,直到渲染线程仅落后于游戏线程一两帧左右。

        线程通讯

        我们通过如下宏从主线程向渲染线程添加命令:

	ENQUEUE_RENDER_COMMAND(CommandName)(LambdaFunction);

        较早的ue4版本中,添加命令的宏还有_ONEPARAM, _TWOPARAM的后缀,目前已经借助匿名函数实现了无需指定参数数量的通用形式。需要注意的是,匿名函数的传参应该为值传递。

        可以看出相当于调用了EnqueueUniqueRenderCommand函数,并传入lambda函数作为函数参数:

#define ENQUEUE_RENDER_COMMAND(Type) \
	struct Type##Name \
	{  \
		static const char* CStr() { return #Type; } \
		static const TCHAR* TStr() { return TEXT(#Type); } \
	}; \
	EnqueueUniqueRenderCommand<Type##Name>

        在实际调用中,如果支持独立的渲染线程,则会根据传入的CommandName生成一个继承自FRenderCommand的渲染指令类,并基于这个类请求TaskGraph构造一个任务。

template<typename TSTR, typename LAMBDA>
FORCEINLINE_DEBUGGABLE void EnqueueUniqueRenderCommand(LAMBDA&& Lambda)
{
	QUICK_SCOPE_CYCLE_COUNTER(STAT_EnqueueUniqueRenderCommand);
	typedef TEnqueueUniqueRenderCommandType<TSTR, LAMBDA> EURCType;

	if (IsInRenderingThread())
	{
		// ...
	}
	else
	{
		if (ShouldExecuteOnRenderThread())
		{
			CheckNotBlockedOnRenderThread();
			TGraphTask<EURCType>::CreateTask().ConstructAndDispatchWhenReady(Forward<LAMBDA>(Lambda));
		}
		else
		{
			// ...
		}
	}
}

        线程同步

        当我们希望同步游戏线程和渲染线程时,可以在游戏线程中新建一个fence,即 FRenderCommandFence::BeginFence,此时,相当于往命令队列里添加了一个任务;然后调用FRenderCommandFence::Wait进行阻塞,相当于等待刚刚加入的任务被触发;或者调用IsFenceCompleteGetNumPendingFences去查询当前任务是否已经完成。如果新加入的空任务被触发,意味着同步完成了。

        此外,也可以调用FlushRenderingCommands阻塞游戏线程,使得渲染线程完全赶上游戏线程。

并行提交

       ue4支持并行地提交渲染指令。

      常用的资源屏障设置,设置Shader参数,创建缓冲区或缓冲区等都属于渲染指令。

      并行提交包含了两个模块,一个是CPU端支持任务的并行提交,这可以通过ue4的TaskGraph系统完成,根据预设的每个任务处理最少指令数和线程数进行任务分配;

      另一部分是GPU端需要支持任务的并行处理,这需要图形API的支持。比如dx11的延迟提交,dx12的多个command list。

      当我们调用CommandList的函数RenderFunction时,内部通常会根据当前是否支持并行渲染,来选择立即执行渲染指令,或是添加渲染指令到渲染队列中。

	void RenderFunction()
	{
		if (Bypass())
		{
			GetContext().FunctionName();
		}
		else
		{
			ALLOC_COMMAND(PassClassName)();
		}
	}

       通过ALLOC_COMMAND宏,我们从内存管理器申请了新的指令空间,并将指令添加到CommandLink链表结构中。

       添加到队列中的指令,将在FRHICommandListExecutor::ExecuteList调用后执行。

      

      并行提交包含异步提交和非异步提交。

      对于异步提交而言,将创建一个“分发任务”的任务,该任务将作为调度者,异步创建RHI相关的异步任务;而对于非异步提交而言,则会立刻创建RHI相关的异步任务。

       线程同步 

       和游戏线程调用FlushRenderingCommands一样,如果希望RHI完全追上渲染线程的速度,也可以调用ImmediateFlush函数进行同步。

       根据同步的情况不同,分为几个等级的同步策略:

       ① 仅等待WaitOutstandingTasks队列里的任务完成;

       ② 强制执行命令队列里的命令;

       ③ 强制执行命令队列里的命令,并等待异步分发任务完成;

       ④ 强制执行命令队列里的命令,并等待异步分发任务和RHI任务完成。

       ⑤ 强制执行命令队列里的命令,并等待异步分发任务完成和RHI任务完成,且刷新资源和PSO状态。

        可以看出,从③到以上才开始涉及到线程间的同步,而这样的同步在渲染逻辑中并不会过多的出现。更多会被使用到的是第②级的强制执行命令,这使得渲染端可以主动地控制指令执行的时间点,因此它会在整个主渲染流程中被反复调用。

       其中强制执行命令分为两个情况,一个是RHI位于独立线程,一个是无独立线程。

       对于独立的RHI线程,我们需要执行如下几个步骤:

     (1)清空已经完成的任务事件;

              其中RHIThreadTask和PrevRHIThreadTask记录普通的分发任务,RenderThreadSublistDispatchTask记录异步分发任务的任务

     (2)缓存获取当前的任务队列,并创建新的任务队列用于下次使用;

     (3)如果支持异步提交,那么我们创建异步提交的任务,并且需要标记每个分发任务与事件的对应关系,使得同步时能够知道应该等待哪个事件来确保执行完成;否则,直接添加RHI的任务,并记录上一个RHI任务;

     (4)如果需要强制刷新队列,则应该分别等待SublistDispatchTask和所有RHIThreadTask;

        而对于非独立的RHI线程,我们直接等待所有任务完成后,清空任务队列。

ue4中的Indirect draw

       Indirect draw更适用于一些程序化资源,比如地形、水体、植被等。ue4中也有少量的indirectdraw的实例,可以作为参考。

      绘制时调用的核心API为RHI层的DrawPrimitiveIndirect/DrawIndexedIndirect。

      一个使用的实例就是应用于水面上的Tiled Screen Space Reflection。

      首先使用一个计算着色器,将屏幕划分为多个tile,并判断每个tile中是否包含水体(通过shadingmodel),接下来利用输出的多个tile信息,通过indirect draw,只对包含水体的tile进行屏幕空间反射的计算,最后再将反射/天光/IBL等和水体效果结合。

      概括而言,indirect draw的实现主要包含两步,一步是使用cs生成水体的TileBuffer,另一步是利用TileBuffer进行indirect draw的SSR。使用indirect draw主要的好处在于可以仅在一个drawcall期间完成多个Tile的处理,而无需逐Tile进行drawcall。

ue4中的RDG架构

        RDG,也就是渲染依赖性图表(Rendering Dependency Graph),这是一个基于图表的调度系统,是ue4提供的一套渲染框架解决方案。

       它开放和传统渲染框架类似的接口,比如创建纹理、缓冲区等。但和传统渲染框架即时执行不同,RDG是延迟的,它会在收集完当前帧的所有指令后,再根据已有信息进行合理的调度和执行。

       例如,RDG会考虑到如下细节:合理调度计算密集型和带宽密集型的渲染指令,合理的资源屏障设置和同步策略,合理的内存和生命周期管理等。

RDG的原理简介

        我们在图形编程,尤其是在有多个pass阶段的情况下,会遇到比较复杂的引用关系,比如我们需要在一些pass中写入某些数据,并在另一些pass中读入这些数据,形成资源读写依赖关系;又比如两个pass可能都只需要同一个只读数据的输入,形成非依赖但引用资源的关系。这就需要我们仔细地考虑pass顺序的先后,资源引用带来的屏障设置,避免同一资源引用时每个pass都反复解析等等。

        RDG框架的诞生就是为了自动处理这些繁琐的操作,让图形编程者从复杂的依赖引用关系中解放出来,更好地关注于图形算法本身的实现细节。

RDG使用例子

       RDG架构模拟了即时调用模式的接口设计,两次Execute调用间不会保留任何状态,每次调用都将重建整个图形依赖关系。

       对于使用者而言,只需定义RDG实例,设置相关数据并执行。举例来说,对于绘制深度的Pass而言:

	if (bShouldRenderCustomDepth)
	{
		FRDGBuilder GraphBuilder(RHICmdList); // 1.定义RDG
		RenderCustomDepthPass(GraphBuilder); // 2.设置相关数据
		GraphBuilder.Execute(); // 3.执行
	}

       对于深度绘制这一pass,设置相关数据包含了这些操作:

       ① 请求分配当前pass的参数:

FCustomDepthPassParameters* PassParameters = GraphBuilder.AllocParameters<FCustomDepthPassParameters>();

        ② 绑定pass的参数:

PassParameters->RenderTargets[0] = FRenderTargetBinding(CustomDepthTextures.MobileCustomDepth, DepthLoadAction);
PassParameters->RenderTargets[1] = FRenderTargetBinding(CustomDepthTextures.MobileCustomStencil, StencilLoadAction);

PassParameters->RenderTargets.DepthStencil = FDepthStencilBinding(
    CustomDepthTextures.CustomDepth,
    DepthLoadAction,
    StencilLoadAction,
    FExclusiveDepthStencil::DepthWrite_StencilWrite);

        ③ 请求分配场景纹理:

PassParameters->MobileSceneTextures = CreateMobileSceneTextureUniformBuffer(GraphBuilder, EMobileSceneTextureSetupMode::None);

        ④ 添加pass。可以发现具体的渲染调用封装在lambda函数中,这意味着当前设置只是进行了操作的记录,而调用将在Execute函数执行后才被真正执行。

GraphBuilder.AddPass(
    RDG_EVENT_NAME("CustomDepth"),
    PassParameters,
	ERDGPassFlags::Raster,
	[this, &View](FRHICommandListImmediate& RHICmdList) 
    { 
        //... 
    });

        以上几个步骤基本概述了如何使用RDG框架去定义一个渲染pass。

RDG接口设计

        总而言之,RDG框架提供了如下接口:

        ① 创建新纹理 / UAV / SRV / Buffer

        使用RDG创建的数据仅在RDGBuilder生存期内有效,因此这些数据只用于创建一些临时数据。

        由于RDG创建的纹理并不会立即分配,因此不能使用原有的纹理类型。

FRDGTexture* Texture = GraphBuilder.CreateTexture(TextureDesc, TEXT("NAME")); // 创建纹理
FRDGTextureUAV* TextureUAV = GraphBuilder.CreateUAV(TextureUAVDesc); // 从纹理创建UAV
FRDGTextureSRV* TextureSRV = GraphBuilder.CreateSRV(TextureSRVDesc); // 从纹理创建SRV 

FRDGBuffer* DrawIndiretParametersBuffer = GraphBuilder.CreateBuffer(IndirectArgBufferDesc, TEXT("DOFIndirectDrawParameters")); // 创建Buffer
PassParameter->OutScatterDrawIndirectParameters = GraphBuilder.CreateUAV(DrawIndirectParametersBuffer); // 从Buffer创建UAV

       ② 定义,分配和设置pass参数

        定义pass参数可以使RDG资源和pass产生关联,如果仅分配pass参数而不进行关联,那么pass参数将是无效的。

        它和着色器参数结构的定义放到一起,仅在名字上有一定差别,多了一个RDG的标识:

BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
    // SHADER_PARAMETER_TEXTURE(Texture2D, MyTexture) // 原有的纹理声明方式
    SHADER_PARAMETER_RDG_TEXTURE(Texture2D, MyTexture) // RDG纹理生命方式

    SHADER_PARAMETER_RDG_TEXTURE_UAV(RWTexture2D<float4>, MyOutputUAV) // 像素着色器绑定UAV

    SHADER_PARAMETER_RDG_BUFFER(StructuredBuffer<float4>, ScatterDrawList) // 使用SRV从Buffer读取数据

    RENDER_TARGET_BINDING_SLOT() // 提供渲染目标和深度模板的输入
END_SHADER_PARAMETER_STRUCT()

        通过相关的shader宏,我们可以获取pass关联的RDG资源,并对pass进行相关的资源注册。RDG能够基于使用情况来推断资源的生命周期,并了解到pass是如何使用该资源(作为输入或输出),从而进行资源屏障的自动设置。

       ③ 添加Pass

       和上述演示的深度绘制pass类似,主要分为以下三步:

// 1.分配参数 
FMyShaderCS::FParameters* PassParameters = GraphBuilder.AllocParameters<FMyShaderCS::FParameters>();

// 2.设置参数
Parameters->SceneColor = SceneColor;
// ...

// 3.添加pass
GraphBuidler.AddPass(
    RDG_EVENT_NAME("MyShader %dx%d", View.ViewRect.Width(), View.ViewRect.Height()),
    PassParameters,
    ERenderGraphPassFlags::Compute,
[PassParameters, ComputeShader, GroupCount] (FRHICommandList& RHICmdList)
{
    // ...
});

        添加pass时,参数包含一个可用于调试分析的事件名(发行版本将去除),pass相关的参数,pass类型标记,以及对应的绘制Lambda函数。

        在lambda函数调用期间,可以认为RDG资源是已分配且可安全访问的。由于lambda函数将延迟执行,为了避免引用失效,需要显式单独捕获参数。

        ④ 绑定深度渲染目标/颜色渲染目标

        对于一些渲染目标而言,它的创建独立于RDG系统外。RDG支持对外部渲染目标进行绑定,同时我们可以指定外部渲染目标的加载(是否清空)/存储的特性。

PassParameters->RenderTargets[0] = FRenderTargetBinding(
     Outputs.SceneColor,
     ERenderTargetLoadAction::ENoAction,
     ERenderTargetStoreAction::EStore); // 绑定颜色渲染目标

PassParameters->RenderTargets.DepthStencil = FDepthStencilBinding(
     SceneBlackboard.SceneDepthBuffer,
     ERenderTargetLoadAction::ENoAction, ERenderTargetStoreAction::ENoAction,
     ERenderTargetLoadAction::ELoad, ERenderTargetStoreAction::EStore,
     FExclusiveDepthStencil::DepthRead_StencilWrite); // 绑定深度渲染目标

      另外一些渲染对象可能是由ue4中的渲染对象池,即IPooledRenderTarget接口分配的,RDG如果需要引用到这些资源,可以调用相关的注册接口建立外部引用关系:

TRefCountPtr<IPooledRenderTarget> RawSceneColorPtr = ...
FRDGTexture* SceneColor = GraphBuilder.RegisterExternalTexture(RawSceneColorPtr, TEXT("SceneColor"));

        ⑤ 屏幕空间的pass

        有许多图形算法是基于屏幕空间,比如SSS,SSR,TAA等,它们之间纹理输入输出上存在一些共性。为了使得这一类算法的调用更加简单,ue4提供了针对屏幕空间算法的封装。

class FScreenPassTextureViewport
{
// ...
FIntRect Rect;  // 视口矩阵,定义了位于[0, extent]的子矩形
FIntPoint Extent = FIntPoint::ZeroValue; // 矩形宽度
}

        对于屏幕空间的算法而言,它的输入输出纹理和屏幕分辨率是关联的,因此应该提供相关类来简化输入输出纹理的操作;此外,输入和输出视口不一定是完全一致的,举例来说,有时我们需要写入降分辨率(1/2屏幕分辨率或1/4屏幕分辨率)的纹理。

        ue4定义了一个针对屏幕空间pass的着色器参数结构FScreenPassTextureViewportParameters,我们可以在着色器参数结构中直接引用这一结构:

BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
    SHADER_PARAEMETER_STRUCT(FScreenPassTextureViewportParameters, Velocity)
END_SHADER_PARAMETER_STRUCT()

        接下来,调用GetScreenPassTextureViewportParameters,将其添加到pass参数:

FVelocityFlattenCS::FParameters* PassParameters = GraphBuilder.AllocParamaters<FVelocityFlattenCS::FParameters>();
PassParameters->Velocity = GetSreenPassTextureViewportParameters(VelocityViewport);

        在shader中,只需要一个宏(定义于ScreenPass.ush)就可以引入当前纹理:

// 定义纹理视口参数
SCREEN_PASS_TEXTURE_VIEWPORT(Velocity)

        上面描述的大部分细节,都封装在绘制屏幕空间pass的API中,在我们不需要比较细致的控制时,可以直接调用这一函数:

template<typename TPixelShaderType>
inline void AddDrawScreenPass(
    FRDGBuilder& GraphBuilder,
    FRDGEventName&& PassName,
    const FScreenPassViewInfo& ScreenPassView,
    const FScreenPassTextureViewport& OutputViewport,
    const FScreenPassTextureViewport& InputViewport,
    TPixelShaderType* PixelShader,
    typename TPixelShaderType::FParameters* PixelShaderParameters) { }

        此外,框架提供了简单的类型转换,可以将uv坐标从一个视口空间映射到另一个视口空间。

FScreenPassTextureViewportTransform GetScreenPassTextureViewportTransform(
    const FScreenPassTextureViewportParameters& Source, 
    const FScreenPassTextureViewportParameters& Destination);

      在shader中,通过scale和bias进行计算:

SCREEN_PASS_TEXTURE_VIEWPORT_TRANSFORM(ScreenColorToVelocity)

float2 VelocityUV = ScreenColorUV * SceneColorToVelocity_Scale + SceneolorToVelocity_Bias;

实现细节

       

       了解了RDG的基本使用后,我们可以关注一下RDG系统做了哪些事情。整个系统主要分为两个模块,一个是RDG对资源的二次封装,另一个是RDG的调度系统。如上图所示,当我们收集完成所有的pass信息后,在最终的执行阶段,RDG系统依次完成了编译、创建显存资源和资源屏障以及执行渲染逻辑的过程。

       RDG资源结构 

       

       ue4中实际的显存资源主要是通过RHI接口创建的。而对于RDG系统而言,为了更好地管理资源,它单独封装了RDG的资源,比如FRDGTexture, FRDGBuffer等。

       RDG资源内部包含了RHI显存资源,也包含了RDG相关的一些资源属性。当我们调用RDG的创建资源接口时,只填充了它的资源属性,在实际调用执行时,才会去填充RHI显存资源相关的内容。

       就资源属性而言,一部分属性是资源本身的属性,比如大小、类型等;另一部分是为了计算生命周期、引用关系而记录的属性。

       pass引用资源

       当pass被设置的时候,RDG框架需要做一些预处理,比如初始化pass的访问数据和关联pass信息等,以及收集当前pass引用的所有资源。

       如前文所提及,我们通过shader parameter框架设置RDG的参数,并在初始化pass时将pass和对应shader参数绑定。在做了前面一系列准备操作的情况下,RDG框架能够很方便地通过解析RDGParameterStruct的数据来获取RDG引用的资源。

       编译/预处理

       

       在完成了pass的收集后,RDG首先需要对所有pass做一遍处理:

       ① 遍历所有图中的Pass,构建生产者/消费者的依赖关系;初始化光栅化、异步计算等Pass列表。

       pass之间会构造出一个有向拓扑图的关系,为了便于管理,还添加了两个特殊的pass,即ProloguePass和EpiloguePass。

        ProloguePass和EpiloguePass是标记位,用于简化屏障和遍历的图形逻辑。Prologue pass用于处理图执行之前的屏障,而Epilogue pass用于资源提取屏障——这也使得它可以作为剔除节点时的搜索入口。Epilogue pass被添加到passs数组的结尾,以便于进行遍历。prologue pass不需要参与任何遍历。

       ② 根据构建好的依赖关系,以特殊的从不剔除的pass,和有离开图的输出的pass作为根节点,进行深度搜索。未访问到的Pass将被剔除。

       ③ 遍历剔除后的图,并对所有子资源设置合适的屏障。以一种相对保守的策略对一些冗余的屏障进行合并。

        我们会记录每个pass中引用的texture, buffer以及这些资源在当前pass的状态。

        这个状态包含资源的访问屏障,所处管线,以及当前屏障下的第一个pass和最后一个pass等。

        我们要做的事情是,检查资源在当前pass的状态和资源原本的状态能否合并。

        以下状态是不能被合并的:

        (1)原本只读,之后可写状态

        (2)原本只写,之后可读状态

        (3)对于纹理,前后状态包含了任一除只读以外的状态

        (4)前后有一个为UAV状态

        (5)前后不出在同一个管线,或者转换状态不一致

       如果不能合并的话,就意味着我们要标记创建一个新的资源屏障。此外,如果前后的管线也发生了变化的话,我们还需要新增前后两个pass的生产者/消费者依赖关系(从资源的上一个引用pass到当前pass)。

        ④ 异步计算预处理

        为了合理地调度异步计算,我们应该找到异步计算与图形管线的依赖关系,具体而言,即异步计算依赖于哪些图形管线的输出作为输入(生产者),哪些图形管线依赖异步计算的输出作为输入(消费者),我们把前者过程称为fork,后者过程称为join。

        我们无需收集所有的生产者和消费者,而只需找到每个异步计算pass中最早的跨管线消费者和最近的跨管线生产者。这样有助于构建计算重叠区域时缩小搜索空间。

        建立fork/join重叠区域以进行异步计算。这用于同步屏障以及资源分配和释放。直到fork/join完成之后,异步计算过程才分配或释放资源引用。因为两个管道是并行运行的,因此,异步计算上所有资源生存期都得到扩展,以覆盖整个异步区域。

        ⑤ 遍历图形管线,将具有相同渲染对象的图形pass合并到单一RHI渲染pass。

       创建资源

        调用者调用资源创建接口时,并没有真正地去申请相关资源,只是留了下需要创建资源的记录。因此,接下来RDG系统需要遍历所有的申请记录,并逐一创建对应的显存资源。

        显存资源的创建依然使用了ue4的标准接口,如下:

// UniformBuffer的创建
FRDGUniformBuffer* UniformBuffer;
UniformBufer->UniformBufferRHI = RHICreateUniformBuffer(PassParameters.GetContents(), PassParameters.GetLayout(), UniformBuffer_SingleFrame, Validation);

// Texture的创建
FRDGTextureRef Texture;
TRefCountPtr<FPooledRenderTarget> PooledRenderTarget = GRenderTargetPool.FindFreeElementForRDG(RHICmdList, Texture->Desc, Texture->Name);
Texture->SetRHI(PooledRenderTarget, PreviousOwner);

// SRV的创建
FRDGTextureSRVRef SRV;
FShaderResourceViewRHIRef RHIShaderResourceView = RHICreateShaderResourceView(PooledTexture->Texture, SRV->Desc);
SRV->ResourceRHI = RHIShaderResourceView;

// Buffer的创建
FRDGBufferRef Buffer;
TRefCountPtr<FRDGPooledBuffer> PooledBuffer = GRenderGraphResourcePool.FindFreeBuffer(RHICmdList, Buffer->Desc, Buffer->Name);
Buffer->SetRHI(PooledBuffer, PreviousOwner);

        由上可以看出,SRV,UAV等资源是通过RHI相关的接口直接创建的,因为是新分配的对象,因此处理起来比较简单。

        Texture,Buffer等资源是通过全局的渲染目标对象池创建的,这里的创建是基于名字查询的,如果已经存在于资源池,会返回原有的结果,而不会创建新的资源。

        对于已经存在于对象池的资源,如果这个资源是常驻的,那么我们无需做过多处理。但如果资源是临时的,这就涉及到了资源的生命周期问题。

        对象池创建的资源的生命周期原本应由对象池本身管理。如果RDG系统引用了这一资源,为了避免对象池在RDG仍然引用资源时将其销毁,资源的管理应该交由RDG来负责。

if (Texture->bTransient)
{
	// We will handle the discard behavior ourselves.
    PooledRenderTarget->bAutoDiscard = false;
    // ...
}

      特别地,RDG主要处理有输入输出依赖的资源,比如Render Target。普通的美术纹理资产主要作为SRV使用,往往不存在复杂的依赖关系,因此可以不走RDG控制。

       创建屏障

       根据编译期间处理好的资源引用关系(记录在每个pass的TextureStates/BufferStates等结构中),对每个pass逐一创建资源屏障。

       由于资源包含子资源的概念,因此创建资源屏障的时候,根据前后转换的资源状态组合,我们需要特别处理一对一,一对多,多对一和多对多四种情况。

       执行pass

       对于所有未被剔除的pass,我们逐一执行pass。

       在设置pass的时候,我们同时设置了一个回调函数,在这一阶段,我们将真正执行原先设置的回调函数。

       但在调用之前和之后,RDG框架还会执行一些额外的逻辑。

       在调用前,RDG系统需要提交需要开始的资源屏障和需要结束的资源屏障,初始化Uniform buffer数据,对于异步计算或光栅化过程,标记开始渲染。

       在调用后,RDG系统需要标记结束渲染,销毁临时资源,记录引用资源,提交图形管线和异步计算管线需要开始的资源屏障。

       特别地,对于所有异步计算中的最后一个pass,它需要执行最终的Dispatch逻辑。

ue4中计算着色器应用

       计算着色器支持我们在GPU端实现并行计算,它可以有非常多的应用。比如,自动曝光,屏幕空间环境光遮蔽,屏幕空间平面反射,Niagara等。

      接下来,将会介绍一些ue4对计算着色器的应用。

自动曝光

        当我们从暗处到亮处(或从亮处到暗处),人眼会有一个自适应的过程,具体表现为光的强度不是瞬间变化的,而是渐变的。

        为了判断当前是否需要进行自动曝光,我们需要计算屏幕像素的平均亮度,由于这需要读取屏幕上的像素。直接读取屏幕上的像素效率较低,我们会先做多次降采样,在低分辨率的图像上计算平均亮度。但这样就会带来RT切换和带宽消耗。因此我们可以使用计算着色器,将屏幕划分为多个区域,每个区域作为一个工作组。我们把每个工作组的平均亮度计算完成后存储在共享内存中,再利用原子操作把结果汇总,在一个pass内完成计算。

        相关的代码位于PostProcessMobile.usf中的AverageLuminance_MainCS中。

        累加运算是一个可以高度并行化的计算,它的具体实现可以分为以下两个步骤:

       

       首先,我们可以把屏幕空间分为多个Tile,并以Tile的长宽个数来建立计算着色器的线程组。然后,我们计算每个Tile中所有像素的累加。累加的结果记录在共享内存中。我们添加一个同步点,等所有线程计算完毕后,再进入下一步。

       

       接下来,我们需要把每个Tile的结果继续累加。这可以通过额外一个计算着色器完成,但是为了避免RT切换带来的带宽消耗,我们更希望在原来的计算着色器上继续完成。这就需要我们把累加的任务分摊给每个线程,保证没有重复也没有遗漏。

       我们可以使用一种类似于二分法的方法进行数据累加,分为多步完成,每步之间将设置同步点,对于包含n个线程组的累加计算,需要log2(n)个步骤完成。每一趟将有2的幂次个数的线程组处于工作状态,随着步数的增加,当前工作的线程组会越来越少。

       以上方案的一个好处是它能够确保连续地访问内存,能够提高效率。

       可以看到,第二步Tile累加的过程中,计算着色器负载并不均衡,因此这里依然有优化的空间。

屏幕空间平面反射

        在屏幕空间平面反射中,我们使用计算着色器,根据反射平面,计算一个像素被反射后的位置。

        在计算反射的时候,会遇到如下几个精度的问题:

        ① 一个像素反射后的位置不一定是一个准确的像素位置,而可能是一个覆盖了四个像素的位置。这个时候需要记录四个像素的颜色值。

        ② 多个像素可能会反射到同一个位置。这个时候我们需要在计算着色器中模拟深度测试,选择离最近的一个像素。

        使用原子比较的InterlockedMin来实现,由于原子比较只支持int值,需要将比较的数据压缩到int数据。

void ProjectionBufferWrite(int2 BufferPos, uint BufferValue)
{
    int2 WriteOffset = BufferPos + ViewRectMin.xy;
    uint OriginalValue = 0;
    InterlockedMin(OutputProjection[WriteOffset], BufferValue, OriginalValue);
}

ue4中的移动端延迟渲染

        ue4.26中实现了一个比较简单的移动端渲染框架。

        

Subpass

        和传统的延迟渲染管线不一样,移动端的延迟管线的光照渲染部分在一个pass内完成,这个pass包含了三个模块,即物体的渲染和GBuffer写入,贴花的渲染和GBUffer写入,以及读取GBuffer进行光照计算和透明物体渲染。

        也就是说,GBuffer的写入和读取都是在同一个pass内完成的。GBuffer作为中间数据,暂存在on-chip memory中,最终没有被输出到系统内存。因此我们认为GBuffer是Memoryless的,它可以有虚拟内存的标记,但不会实际分配系统内存。

        为了避免PSO数量的增加,无论场景中是否存在贴花,我们总是保留第二个pass。

Device & Platform

       Vulkan原生支持subpass,因此可以直接进行移动端延迟管线的开发。

       Metal支持将attachment作为着色器输入,可利用这一特性实现移动端延迟管线,但Metal不支持Depth的读取,需要手动存储32位精度的场景深度。

       OpenGL中,扩展Pixel Local Storage和Framebuffer fetch可以支持我们实现这一点。Android设备比较复杂,426暂时还没有应用。

×
Pixel Local StorageMali, ImgTech PowerVRAdreno
Framebuffer FetchAdrenoMali(Only One Framebuffer)

GBuffer

        SceneColor使用R11G11B10格式。

        3个GBuffer附件,格式为RGBA8。存储材质数据。

        SceneDepth,格式为R32F。

        每个像素占用160bit(20字节)

Lighting

      移动端针对光照渲染,做了如下几点优化:

        ① Shading model masking

       使用模板缓冲记录Shading Model ID,可以对不同的ID运行不同的着色器,也可以跳过无光照的像素。

        ② Light Volume Culling

        默认开启的优化,r.Mobile.UseLightStencilCulling = 1。

        针对局部光,如聚光灯,只计算体积内的可见像素的光照。这是通过两个pass实现的。这会带来额外渲染调用和状态切换,但大多数情况下时有益的。

        第一个pass,绘制体积正面,深度测试失败时写入模板。

        第二个pass,绘制体积背面,反向深度测试以及模板测试,只绘制通过深度和模板测试的像素。

        ③ Clustered deferred Shading

        默认关闭的优化,r.Mobile.UseClusteredDeferredShading = 0。

        只有在局部光数量比较多(如大于100)时有比较好的优化效果。

        在渲染前使用计算着色器生成每个Cluster引用的光源列表,可在一次绘制调用中应用所有局部光源的光照。

        在未做优化的情况下,绘制次数与光源个数线性相关,重叠光源也会带来大量overdraw。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印   util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以改进做成小工具。 Java右键弹出菜单源码 简单 Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟   用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例   Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式   //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener   在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话……   还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对文本进行少量修改,发送end-of-messages消息,最后关闭连接。 Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器   Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例   各种EJB之间的调用源码示例,用远程接口的引用访问EJB、函数将被FirstEJB调用,同时它将调用secondEJB 基于JAVA的UDP服务器模型源代码 2个目标文件 摘要:Java源码,网络相关,UDP   基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实世界模型   基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理   这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu   Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码,文件操作,压缩包查看   Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,系统相关,数字签名,数字证书   Java 数字签名、数字证书的相关实例。   关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,使用公钥初始化签名对象,用于验证签名。   数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录   一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器   Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:   可直接输入文件名或网络地址,但必需事先连入网络。 Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序   Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构,   当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。   QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新好友列表,响应用户双击的事件,并得到好友的编号,把聊天界面加入到管理类,设置密码保护等。 Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏   Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容索引:JAVA源码,系统相关,系统信息检测   用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字   Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。 Java吃豆子游戏源代码 6个目标文件 内容索引:JAVA源码,游戏娱乐,JAVA游戏源码   JAVA编写的吃豆子游戏,类似疯狂坦克一样,至少界面有点像。大家可以看截图。 Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板   使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制   Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制   Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰效果   Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标,Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密   WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。 Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书   Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和客户端 2个目标文件,如题。 Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视   用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择   Java语言开发的简洁实用的日期选择控件,源码文件功能说明:   [DateChooser.java] Java 日期选择控件(主体类) [public]   [TablePanel.java] 日历表格面板   [ConfigLine.java] 控制条类   [RoundBox.java] 限定选择控件   [MonthMaker.java] 月份表算法类   [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP   Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP   Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。   部分源代码摘录:   ftpClient = new FtpClient(); //实例化FtpClient对象   String serverAddr=jtfServer.getText(); //得到服务器地址   String user=jtfUser.getText(); //得到用户名   String pass=jtfPass.getPassword().toString(); //得到密码   ftpClient.openServer(serverAddr); //连接到服务器   ftpClient.login(user,pass); //在服务器上注册   InputStream is=ftpClient.list(); //得到服务器目录与文件列表输入流   StringBuffer info=new StringBuffer(); //实例化StringBuffer对象,用于输出信息   int ch;   while ((ch=is.read())>=0){ //未读完列表,则继续   info.append((char)ch); //增加信息   …… Java实现的点对点短消息发送协议(smpp)开发包源码 70个目标文件,如题。 Java实现的放大镜效果附有源文件 1个目标文件 内容索引:Java源码,初学实例,放大镜,哈哈镜   Java实现的放大镜效果附有源文件,编译环境最近出了问题,因此没有测试,也没有抓到图,希望各位自行测试一下。 Java实现跟踪鼠标运行坐标的源码 1个目标文件 内容索引:JAVA源码,系统相关,鼠标钩子   Java编写的一个小程序,用以实现跟踪鼠标的运行位置(坐标),程序很小,很实用,暂时抓不到截图。 Java实现移动的遮照效果 1个目标文件 摘要:Java源码,初学实例,遮照效果   Java实现移动的遮照效果,先实现椭圆形的遮罩,实例化媒体加载器,最后在创建缓冲区中的图像形成遮罩效果,而且它是会移动的。 Java鼠标拖拽功能 1个目标文件 Netbeans平台下实现的JAVA 拖放效果的一个实例,包括源代码和所需的图片资源。 (运行后会全屏显示窗体,没有关闭按钮,可使用快捷键Ctrl + F4关闭~) Java图片倒影效果实例源码 1个目标文件 摘要:Java源码,图形操作,图片倒影   Java图片倒影效果实例源码,有意思也很有参考价值的一个Java图像处理小程序,先读取图像然后进行图像重绘,产生倒影的效果,仅供参考。 java网络五子棋的源代码 7个目标文件 AVA网络五子棋,实现基本功能,无多余花哨内容,适合大学生课程设计学习使用,内含完整可运行源代码及运行指导视频,Eclipse环境。 Java文件选择器源代码 2个目标文件 摘要:Java源码,文件操作,文件选择器   Java文件选择器源代码 Java文字跑马灯与信息窗口 1个目标文件 摘要:Java源码,文件操作,跑马灯   Java文字跑马灯效果与信息窗口,将一段文字按照滚动的方式显示出来,在网页设计中比较常见,本例使用Java实现文字跑马灯效果。 Java写的ATM机取款模拟程序 9个目标文件 内容索引:JAVA源码,综合应用,ATM,JAVA,模拟   基于Java技术,只实现了ATM机的取款过程,有兴趣和有能力的高手可以再加以改进,这样就更完美了。可作为Java初学者《面向对象》编程的一个很好范例。     在这个程序中,用到以下JAVA类库:      dataAccess(数据操作)类:包含用于数据库的相关操作   atmScreen(ATM屏幕)类:主要创建各操作窗体和相应按钮事件   Account(用户帐户)类:包含用户信息的验证、余额查询和扣钱等方法   readCard(读卡机)类:包含读取用户卡号和退卡(退出系统)   moneyMac(取钱机)类:只用于打印清单   Atm(系统)类:系统主方法的开始,负责调用其他类 Java写的巨型LCD液晶时钟显示屏 8个目标文件 内容索引:JAVA源码,综合应用,电子钟,LCD,液晶   一个巨型LCD数字电子时钟,用JAVA写的,运行截图如上示。它还带有右键菜单,LCD颜色可以变换等。 Java用GZIP压缩解压文件 1个目标文件 摘要:Java源码,文件操作,GZIP   Java使用GZIP压缩解压文件,如果你正在使用Java开发文件压缩或解压的功能,那么Gzip应该来说是比较值得参考的,那么本实例或许正是您需要的,Java基于Gzip的文件压缩与解压程序源代码,供源码下载者参考。 Java用Zip压缩多个文件实例源码 1个目标文件 摘要:Java源码,文件操作,压缩文件   Java用Zip压缩多个文件,一个Java文件操作小实例,用ZIP同进压缩多个文件,实际是打开文件读取,然后再利用ZipEntry实例化待压缩的条目列表,将ZIP条目列表写入输出流,从源文件得到文件输入流,写入缓冲数据等。 Java游戏使命的召唤源码 5个目标文件 内容索引:JAVA源码,游戏娱乐,Java游戏源码,使命的召唤   Java游戏使命的召唤源码,又名:Call of Duty,MFORMA超精典游戏,有兴趣的可以重新编译学习一下。 Java源码的仿QQ聊天程序 如题 Java中的Blowfish对称密钥加密算法类和实例 2个目标文件 内容索引:Java源码,算法相关,Blowfish,JAVA加密,对称密钥算法   JAVA中的Blowfish加密属于对称密钥算法,如果知道密钥,则可以对加密后的数据解密,但如果如果不知道密钥,基本上是不可能的,因此,这就决定了它的先天不足,就是带来的密钥的管理问题。 Java中的SSL及HTTPS协议实例源码 1个目标文件 摘要:Java源码,网络相关,HTTPS协议   Java中的SSL及HTTPS协议实例源码,使用SSL套接字的HTTPS服务器端,接受客户端的一个连接,并返回Hello,world.   本例中使用8080端口创建SSL服务器套接字,返回缺省的SocketFactory对象,生成PrintWriter对象,用于输出信息。 Java自定义光标程序源码 1个目标文件 摘要:Java源码,窗体界面,自定义光标   Java自定义光标程序源码,将光标定义成其它形式的图标,利用ToolKit对象得到图像,实例化自定义光标对象,增加组件等。 Jav动画图标源码(显示GIF图像) 1个目标文件 摘要:Java源码,图形操作,动画图标   Jav动画图标源码(显示GIF图像),学习如何连续加载GIF图像从而生成动画图标,先创建一个用于显示动画图标的数组,创建构造函数,初始化数组,重载组件绘制方法,实例化Timer对象显示动画,增加组件到窗口上。 JSP树型菜单 DTree html+js实现 Notebook源码,Java记事本 2个目标文件 摘要:Java源码,文字字符,Java记事本   Java记事本:Notebook源码下载,虽然是个功能不多的记事本,但通过这个Java程序你可以学习到不少小技巧呢!比如创建界面、安装各种监听器,在窗体上布局主菜单,保存用户编辑的文件,以及如何使用"另存为"对话框保存文件,如何新建和打开一个文档等,源代码内包括了相当多的注释,是Java新手学习JAVA编程的好范例。   当用户按下窗口的“关闭”时,会自动调用此方法。 PDF分割与合并源代码 3个目标文件 能把一个PDF分割成多个单页的PDF,把多个PDF合并成一个PDF。 QR解码的Java实现程序 25个目标文件 内容索引:JAVA源码,媒体网络,QR解码,Java   用Java实现QR解码的源程序代码。 编译原理--LR(1)分析表构造(JAVA) 8个目标文件 如题 传奇私服登录器Java版附源代码 2个目标文件,如题。 单机版java五子棋V1.1 5个目标文件 完整的单机版java五子棋游戏,主要是判定胜负的算法,使用数组进行遍历,很容易理解。 很强的Java加密解密算法源码 3个目标文件 内容索引:Java源码,算法相关,JAVA算法,加密解密   很强的JAVA加密、解密算法源码,一共有6种算法可供选择,另外还可以直接生成ZIP压缩文件。 简单的注册与登录功能 6个目标文件 一个简单的用户登录界面 要连接数据库的 有登陆 注册功能 仅供初学者学习 简单模拟的J2ME潜艇大战源代码 4个目标文件 内容索引:JAVA源码,游戏娱乐,J2ME手机游戏,潜艇大战   简单模拟的J2ME手机游戏潜艇大战的源代码,界面有些粗糙,不过基本功能都实现了,发弹,躲闪等,可以帮助新手提高J2ME技术。 局域网广播系统java源码 如题 java游戏 可实现网上对战和人机对战 7个目标文件 雷电游戏JAVA版源程序 8个目标文件 这是一个简单的Java仿雷电游戏(源码见包内),共设置有三关三个小BOSS。采用有GreenJVM发布,因此可以运行在未装载JRE的Windows系统之上。 网络蚂蚁Java版 14个目标文件 用Java实现的网络蚂蚁,功能强大,方便上传下载,断点续传等操作 网页浏览器 如题 java学生成绩系统(图形界面) 14个目标文件 如题。 java学生课程管理系统 6个目标文件 如题。 一个较初级的EJB商业应用的例子 如题 一个支持servlet的web服务器 14个目标文件 如题。 用Java加密类实现DES、RSA及SHA的加密算法 9个目标文件 如题。 用java写的SFTP代码 用java实现的Tftp(Sftp)客户端与服务器程序。在这个程序中用到了一个“状态”的机制:客户端与服务器端在开始运行时有相同的状态,通过用户的输入或程序内部运行的机制,程序可以转到不同的状态,在不同的状态下程序实现了不同的功能。 用jdom解析xml 1个目标文件 要使用jdom解析xml文件,需要下载jdom的包,我使用的是jdom-1.1。解压之后,将lib文件夹下的.jar文件以及build文件夹下的jdom.jar拷贝到工程文件夹下,然后就可以使用jdom操作xml文件了。 copass源代码 Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架. Compass实现了通过注册Hibernate的相关事件实现了数据的实时索引.. DataBuffer在Java中使用ADO.NET 本源码的作者对ADO.Net有着相当深厚的感情,有着对JAVA中DataBuffer类库运用的出色理解。它是开源项目javadesktop中的一个子项目,通过它你可以真正的理解DataSet、DataTable、DataRow……类库的使用。对这方面不太熟的开发者绝对有帮助。 HAHA CHAT Java仿QQ聊天程序源代码 iCHAT聊天室基于Java 内容索引:JAVA源码,媒体网络,iChat,Java聊天室   iChat LE 1.1版源码,一个比较大型的JAVA版聊天室程序,可能要用到DLL文件,压缩包内已经有了,一年前的程序。 IP定位器 J2ME黑白棋游戏手机版 v2.1完整源码 J2ME冒险游戏CASPER源代码 J2me月光战机游戏源码 JasperReports 报表类库v3.5 Java24点游戏逼真图形版代码 Java 3D魔方游戏源码及中文注释包 内容索引:JAVA源码,游戏娱乐,JAVA3D,魔方游戏   很强的JAVA 3D魔方游戏,这是源码及中文注释包,作者的开发文档和思路都在里面,对学习很有帮助! allin.dev 重载了ListView,更好的实现! copass源代码 Java (Jsp)制作简单的表单程序 java Socket通信实现 Java 版的酒店系统,貌似完整 Java 电梯模拟程序 v2.0 Java 飞机订票 Java 高考信息管理系统 SQL数据库 java 一个消息发布网站 Java+MsSQL超市进销存(毕业设计及答辩资料) Java+sqlserver2000做的员工管理系统 Java+SQL信用卡管理系统源代码 Java+XML日程提醒系统 Java+XML写的RSS阅读器 JAVA版Swing星际争霸游戏源代码 Java半透明图片实现的步骤及源代码 JAVA帮助视图组件库 Help GUI 1.1源代码 Java毕业论文:搜索引擎系统附源代码 JAVA毕业设计_员工管理系统含文档 Java毕业设计一款J2me飞行射击游戏 Java仓库管理系统,Access数据库 Java超市管理,SQL2000+源代码 Java超市进销存系统 Java大型CERP进销存系统 Java电子相册源码 Java赌神游戏网络版源代码 JAVA短信网关平台(值得一看) Java多用户聊天室程序(毕业设计) Java仿Vista界面风格的登录窗口 Java仿千千静听音乐播放器源代码 Java火影忍者游戏源代码 Java机车狂飙源代码 JAVA开发的打字软件源程序 Java开发的简单WEB服务器源码 Java聊天程序(JBuilder) Java聊天软件Visual Chat v1.91源码 Java模仿的MSN聊天软件 Java企业人事管理系统源码 JAVA轻量级的MVC框架应用实例 Java软件度量源码 Java声音播放程序源代码 JAVA实现CLDC与MIDP底层编程的代码 JAVA实现超级玛丽 Java实现的视频播放程序源码 Java手机短信项目源码 Java手机游戏大富翁源代码+注释 Java手机与计算机互发彩信源码 Java坦克大战网络对战版源代码 Java跳棋(基于SWT) Java通讯录手机版源码 Java图片翻折,将图像压扁 Java图书馆管理系统源程序 JAVA图书馆管理系统源码 Java图像文件的缩小与放大 Java推箱子游戏(50关+音效) JAVA网络抓包程序 Java文件切割器源代码 java项目源码在线相册系统 Java写的天气预报软件 Java写的图片幻灯片切换特效 Java写的一个mp3播放器 Java学生信息管理系统源码包 Java用的在线地图浏览模块 Java游戏沙丘城堡源代码 Java游戏中斜视角编辑器及引擎源代码 Java约瑟夫环演示Applet源码 Java中的EJB编程实例代码 Java转换xml JLoading Java版的Mp3下载工具 JSP 动态数据菜单 JSP 学生管理系统(全部代码+数据库) jsp+servlet+javabean+mysql党员信息管理系统 jsp高校科研项目管理系统 JSP开发的项目跟踪系统 jsp生产管理系统 msn聊天程序Java仿真代码 P2P--多用户在线聊天室(Java源码) P2P源码 Azureus 2.5.0.2(JAVA) Skype 4.0 Java版源码及开发文档 SnakeScript Java游戏脚本引擎 v1.1 Tsinghua IP 清华大学学生写的一个有关IP的Java程序 Visualvm 基于JAVA的CPU硬件资源管理器源程序 weblogic+j2ee构建音乐网站(原代码+数据库) web综合教学管理系统 YOYOPlayer 基于Java的网络播放器源代码 宾馆管理系统 餐饮门户 超市购物系统 车间管控 打地鼠游戏 单位固定资产登记管理系统JAVA版 电子书店管理系统 分离SQL Server数据库 基于BS结构的Java可视化工作流定制软件 基于J2ME的Java游戏梦幻炸弹人源程序 基于JAVA的ICQ系统 基于Java的mp3播放器源代码 基于JAVA的日程提醒簿 基于Java的小型人事管理系统,带数据库 基于Java的邮件服务器源程序 基于MVC的Java资源管理器 v2.0 季风进销存管理系统(JSP版) 家庭多媒体播放器 开源Winzip压缩工具Java版源码 客户管理系统 Alfresco Content Management 乐趣大型购物系统 类似QQ的聊天软件JAVA版源码(附设计文档) 连接postsql数据库的java代码 泡泡堂战车游戏JAVA版源码 配置ODBC数据源 企业进销存管理系统 轻松商城系统 手机游戏J2ME毕业设计 书籍管理系统 网络电视源代码TV-Browser 蜀山剑侠传游戏J2ME手机版源代码 网上书店 物业管理系统毕业设计+源码 销售预测系统PDP系统 选修课程管理系统V1.2.3 阳光酒店管理系统 一款Java网络格斗游戏源码 用iText类库制作PDF文档 用JAVA做的聊天软件,有安装程序和源代码 在Servlet中连接数据库的Java代码 中国移动业务管理系统源码(SSH框架) JAVA开源包 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 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 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
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
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 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 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
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
《OPhone应用开发权威指南》2010 黄晓庆 博文视点 broadview 第1章 OPhone平台概述 1 1.1 OPhone的架构 1 1.1.1 Linux内核 2 1.1.2 本地库 2 1.1.3 OPhone运行环境 3 1.1.4 Widget运行环境 3 1.1.5 应用程序框架 4 1.1.6 应用程序 5 1.2 开发OPhone应用程序 5 1.2.1 开发语言 5 1.2.2 OPhone SDK 5 1.2.3 OPhone开发者社区 6 1.3 将OPhone应用上传到Mobile Market 7 1.3.1 Mobile Market的商业模式 7 1.3.2 Mobile Market发布流程 8 1.4 小结 11 第2章 OPhone开发环境和流程 12 2.1 安装Eclipse和ODT 12 2.1.1 安装Java SDK 12 2.1.2 安装Eclipse 13 2.1.3 安装OPhone SDK 13 2.1.4 安装和配置ODT插件 14 2.2 第一个OPhone应用程序 16 2.2.1 新建OPhone项目 16 2.2.2 运行OPhone项目 18 2.2.3 更新资源文件 21 2.3 调试OPhone应用程序 24 2.3.1 设置断点 25 2.3.2 启动调试 25 2.3.3 单步跟踪 26 2.4 在命令行下开发OPhone程序 27 2.4.1 创建项目 27 2.4.2 用Ant编译项目 28 2.4.3 运行应用程序 28 2.5 OPhone SDK介绍 30 2.5.1 OPhone模拟器 30 2.5.2 模拟SD卡 32 2.5.3 ADB 32 2.5.4 DDMS 33 2.6 小结 34 第3章 OPhone应用程序模型 35 3.1 OPhone应用程序基础 35 3.1.1 OPhone应用程序运行环境 35 3.1.2 OPhone应用程序的组成 36 3.2 Activity 43 3.2.1 Activity创建与声明 44 3.2.2 Activity的生命周期 48 3.2.3 启动Activity 55 3.2.4 Activity和Task 58 3.3 Content Provider 61 3.4 BroadcastReceiver 64 3.5 Service 66 3.6 安全与许可 66 3.6.1 安全架构 66 3.6.2 许可 67 3.7 数字签名 70 3.7.1 签名策略 70 3.7.2 签名步骤 71 3.8 小结 72 第4章 图形用户界面 73 4.1 用户界面概述 73 4.1.1 手机软硬件特性的发展 73 4.1.2 如何影响应用程序开发 74 4.1.3 OPhone图形引擎 74 4.2 用户界面设计 75 4.2.1 声明布局文件 75 4.2.2 编写XML文件 75 4.2.3 加载XML文件 76 4.2.4 将数据绑定到AdapterView 77 4.2.5 创建菜单 79 4.2.6 创建Dialog 81 4.2.7 通知用户 83 4.2.8 处理用户输入 84 4.2.9 样式与主题 84 4.3 常用Widget 86 4.3.1 TextView 86 4.3.2 Button 89 4.3.3 ImageView 90 4.3.4 ProgressBar 92 4.3.5 DatePicker/TimePicker 94 4.3.6 GridView 96 4.3.7 Spinner 98 4.3.8 Gallery 100 4.3.9 TabHost 101 4.4 高级图形用户界面技术 104 4.4.1 图形系统类结构 104 4.4.2 常用布局类 107 4.4.3 绘制图形 114 4.4.4 构建自己的组件 123 4.5 图形动画 130 4.5.1 Animation 131 4.5.2 Interpolator 136 4.5.3 AnimationSet 137 4.5.4 自定义动画 138 4.6 Resource介绍 143 4.6.1 资源类型 143 4.6.2 使用资源 144 4.6.3 资源适配 146 4.7 俄罗斯方块实例 147 4.7.1 方块的数据结构 147 4.7.2 方块渲染 150 4.7.3 游戏区域设计 152 4.7.4 碰撞检测 156 4.7.5 输入处理 158 4.7.6 积分排行榜 160 4.8 小结 161 第5章 OpenGL ES编程 162 5.1 OpenGL ES概述 162 5.1.1 OpenGL ES设计准则 162 5.1.2 OpenGL ES 与OpenGL的不同 163 5.1.3 一个简单的OpenGL ES程序 166 5.2 3D观察与变换 169 5.2.1 一个简单的例子:绘制立方体 169 5.2.2 理解变换 175 5.2.3 投影变换 177 5.2.4 视口变换 179 5.2.5 矩阵堆栈 180 5.3 绘制图元 180 5.3.1 图元种类 180 5.3.2 指定顶点数据 182 5.3.3 绘制图元 186 5.4 颜色和光照 186 5.4.1 设置颜色和材质 187 5.4.2 光照 188 5.5 光栅化和片元处理 193 5.5.1 背面剪裁 193 5.5.2 纹理映射 193 5.5.3 雾 205 5.5.4 反走样 207 5.5.5 像素测试 209 5.5.6 将片元合并到颜色缓存 212 5.6 帧缓存操作 216 5.6.1 清空缓存 216 5.6.2 读取颜色缓存 216 5.6.3 强制完成绘图指令 217 5.7 其他 217 5.7.1 行为控制函数 217 5.7.2 状态查询 218 5.8 EGL简介 218 5.9 小结 222 第6章 数据持久化存储 223 6.1 文件存储 223 6.1.1 存储至默认文件夹 224 6.1.2 存储至指定文件夹 226 6.1.3 存储至SD卡 227 6.1.4 读取资源文件 228 6.2 SharePreference 229 6.3 SQLite 233 6.3.1 创建数据库 234 6.3.2 SQLiteOpenHelper 236 6.3.3 创建触发器 240 6.3.4 创建索引 241 6.3.5 创建视图 241 6.3.6 操作数据 243 6.3.7 将Cursor绑定到AdapterView 250 6.4 Content Provider 254 6.4.1 概述 254 6.4.2 Content Provider加载机制 256 6.4.3 创建Content Provider 257 6.4.4 Content Provider更新的通知机制 267 6.4.5 DAO接口及实现 269 6.4.6 在新线程内处理数据 270 6.5 小结 273 第7章 移动多媒体编程 274 7.1 多媒体文件格式与编码 274 7.1.1 多媒体文件格式 274 7.1.2 编码 275 7.1.3 OPhone平台支持的媒体格式 276 7.1.4 选择合适的媒体文件 277 7.2 音频和视频播放 277 7.2.1 三种不同的数据源 278 7.2.2 MediaPlayer的状态 281 7.2.3 音乐播放器实例 284 7.2.4 播放视频 296 7.3 录制音频 299 7.3.1 MediaRecorder的状态图 299 7.3.2 录音器实例 301 7.4 MP3文件格式分析 306 7.4.1 MP3文件介绍 307 7.4.2 ID3V1标签 307 7.4.3 ID3V2标签 310 7.4.4 MP3帧结构 316 7.4.5 分割MP3文件 323 7.5 案例分析——铃声DIY 327 7.6 小结 329 第8章 让程序在后台运行 330 8.1 Service概述 330 8.2 Service编程实践 331 8.2.1 创建Service 331 8.2.2 启动和停止Service 333 8.2.3 通知用户 335 8.2.4 不阻塞用户操作 337 8.2.5 Service与Activity通信 343 8.3 后台播放音乐 345 8.3.1 跨进程调用 345 8.3.2 创建AIDL接口文件 346 8.3.3 实现AIDL接口 347 8.3.4 绑定Service 351 8.3.5 调用IPC方法 352 8.4 小结 353 第9章 访问网络数据和服务 354 9.1 HTTP协议简介 354 9.1.1 HTTP协议的主要特点 354 9.1.2 HTTP连接过程 355 9.1.3 HTTP消息格式 355 9.2 线程管理 358 9.2.1 匿名Thread 358 9.2.2 java.util.concurrent框架 359 9.2.3 AsyncTask 369 9.3 网络编程接口 373 9.3.1 HttpClient API介绍 373 9.3.2 GET方法的使用和限制 378 9.3.3 使用POST方法上传附件 382 9.3.4 从服务器端下载图片 390 9.4 设计C/S通信数据格式 392 9.4.1 对象序列化 396 9.4.2 使用XML传输对象 401 9.5 小结 409 第10章 高级通信技术 410 10.1 电话 410 10.1.1 电话呼叫 410 10.1.2 监听电话状态 412 10.1.3 查询电话属性 416 10.1.4 读取通话记录 416 10.2 短消息 420 10.2.1 发送短信 421 10.2.2 接收短消息 423 10.3 小结 426 第11章 访问硬件层 427 11.1 访问相机 427 11.1.1 创建Camera对象 427 11.1.2 设置Camera参数 428 11.1.3 预览 429 11.1.4 拍摄照片 429 11.2 访问位置服务 431 11.2.1 创建LocationManager 431 11.2.2 LocationProvider类 432 11.2.3 监听位置更新 433 11.2.4 接近警报 434 11.3 访问传感器 435 11.3.1 SensorManager类 435 11.3.2 监听传感器事件 436 11.3.3 方向传感器应用—指南针 437 11.3.4 模拟传感器 440 11.4 小结 443 附录A 如何导入源代码 444 附录B Resin安装与Servlet部署 446 参考文献 450
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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值