<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[LWJGL Blog]]></title><description><![CDATA[The official Lightweight Java Game Library blog]]></description><link>https://blog.lwjgl.org/</link><image><url>https://blog.lwjgl.org/favicon.png</url><title>LWJGL Blog</title><link>https://blog.lwjgl.org/</link></image><generator>Ghost 4.34</generator><lastBuildDate>Tue, 14 Apr 2026 13:06:01 GMT</lastBuildDate><atom:link href="https://blog.lwjgl.org/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[LWJGL 3.1.2 Released!]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h3 id="312">3.1.2</h3>
<p><em>Released 2017 May 15</em></p>
<p>This build includes the following changes:</p>
<h4 id="bindings">Bindings</h4>
<ul>
<li>Added <a href="https://github.com/ValveSoftware/openvr">OpenVR</a> bindings.</li>
<li>Added <a href="https://github.com/syoyo/tinyexr">Tiny OpenEXR</a> bindings.</li>
<li>Added <a href="https://facebook.github.io/yoga/">Yoga</a> bindings.</li>
<li>bgfx: Updated to API version 41 (up from 34)</li>
<li>glfw: Updated to pre-release 3.3.0 version (up from 3.2.1). Includes many fixes and</li></ul>]]></description><link>https://blog.lwjgl.org/lwjgl-3-1-2-released/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce43</guid><category><![CDATA[Releases]]></category><dc:creator><![CDATA[kappaOne]]></dc:creator><pubDate>Mon, 15 May 2017 20:52:59 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h3 id="312">3.1.2</h3>
<p><em>Released 2017 May 15</em></p>
<p>This build includes the following changes:</p>
<h4 id="bindings">Bindings</h4>
<ul>
<li>Added <a href="https://github.com/ValveSoftware/openvr">OpenVR</a> bindings.</li>
<li>Added <a href="https://github.com/syoyo/tinyexr">Tiny OpenEXR</a> bindings.</li>
<li>Added <a href="https://facebook.github.io/yoga/">Yoga</a> bindings.</li>
<li>bgfx: Updated to API version 41 (up from 34)</li>
<li>glfw: Updated to pre-release 3.3.0 version (up from 3.2.1). Includes many fixes and new features:
<ul>
<li>Last error code query (<code>glfwGetError</code>)</li>
<li>Requesting attention from the user (<code>glfwRequestWindowAttention</code>)</li>
<li>Platform dependent scancodes for keys (<code>glfwGetKeyScancode</code>)</li>
<li>Window maximization events (<code>glfwSetWindowMaximizeCallback</code>)</li>
<li>Window attribute modification (<code>glfwSetWindowAttrib</code>)</li>
<li>Joystick hats (<code>glfwGetJoystickHats</code>)</li>
<li>Library initialization hints (<code>glfwInitHint</code>)</li>
<li>Headless <a href="https://www.mesa3d.org/osmesa.html">OSMesa</a> backend</li>
<li>Cursor centering control (<code>GLFW_CENTER_CURSOR</code>)</li>
<li>macOS: Cocoa hints (<code>GLFW_COCOA_RETINA_FRAMEBUFFER</code>, <code>GLFW_COCOA_FRAME_AUTOSAVE</code>, <code>GLFW_COCOA_GRAPHICS_SWITCHING</code>, <code>GLFW_COCOA_CHDIR_RESOURCES</code>, <code>GLFW_COCOA_MENUBAR</code>)</li>
<li>macOS: Vulkan support via <a href="https://moltengl.com/moltenvk/">MoltenVK</a></li>
<li>X11: Moved to XI2 <code>XI_RawMotion</code> for disabled cursor mode motion input</li>
<li>EGL: Added support for <code>EGL_KHR_get_all_proc_addresses</code> and <code>EGL_KHR_context_flush_control</code></li>
</ul>
</li>
<li>jemalloc: Updated to 4.5.0 (up from 4.4.0)</li>
<li>LibOVR: Update to 1.14.0 (up from 1.10.0)</li>
<li>lmdb: Updated to 0.9.20 (up from 0.9.18)</li>
<li>NanoVG: Added support for fallback fonts.</li>
<li>nuklear: Updated to 1.37.0 (up from 1.29.1, with the new versioning)</li>
<li>OpenAL: Added <code>AL_SOFT_source_resampler</code> extension.</li>
<li>stb
<ul>
<li>Updated <code>stb_dxt</code> to 1.0.6 (up from 1.0.4)</li>
<li>Updated <code>stb_easy_font</code> to 1.0 (up from 0.7)</li>
<li>Updated <code>stb_image</code> to 2.15 (up from 2.13)</li>
<li>Updated <code>stb_image_resize</code> to 0.94 (up from 0.91)</li>
<li>Updated <code>stb_image_write</code> to 1.05 (up from 1.02)</li>
<li>Updated <code>stb_perlin</code> to 0.3 (up from 0.2)</li>
<li>Updated <code>stb_rect_pack</code> to 0.11 (up from 0.10)</li>
<li>Updated <code>stb_truetype</code> to 1.15 (up from 1.12)</li>
<li>Updated <code>stb_vorbis</code> to 1.10 (up from 1.09)</li>
</ul>
</li>
<li>tinyfiledialogs: Updated to 2.8.3 (up from 2.7.2)</li>
<li>Vulkan: Updated to 1.0.49 (up from 1.0.38)</li>
</ul>
<h4 id="improvements">Improvements</h4>
<ul>
<li><code>MemoryStack</code>: Increased default stack size to 64kb (up from 32kb)</li>
<li>Shared library loading can now utilize a <code>ClassLoader</code> specified by the caller. (#277)</li>
<li>Significantly reduced <code>DEBUG_MEMORY_ALLOCATOR</code> and <code>DEBUG_STACK</code> overhead in Java 9 using the new <code>StackWalker</code> API.</li>
<li>Migrated windows builds to <a href="https://ci.appveyor.com/project/LWJGL-CI/lwjgl3">appveyor</a> and updated to Visual Studio 2017 (up from 2015)</li>
<li>EGL: The core API now includes javadoc links to the Khronos references pages</li>
<li>OpenGL ES: The core API now includes javadoc links to the Khronos references pages</li>
</ul>
<h4 id="fixes">Fixes</h4>
<ul>
<li>Assimp: Struct member nullability fixes</li>
<li>Linux: Removed dependencies to newer GLIBC versions.</li>
<li>LibOVR: Fixed layout of the <code>ovrInputState</code> struct.</li>
<li>OpenAL: Removed buffer auto-sizing from <code>alcCaptureSamples</code>. The number of samples must now be specified explicitly, similar to <code>alcRenderSamplesSOFT</code>.</li>
<li>Vulkan: Function addresses are now retrieved only once, using the optimal method for each function type.
<ul>
<li>This avoids warnings on pedantic validation layers.</li>
</ul>
</li>
<li>Fixed callback invocation bugs on 32-bit architectures.</li>
<li>Fixed various javadoc formatting issues (#308)</li>
</ul>
<h3 id="breakingchanges">Breaking Changes</h3>
<ul>
<li>Mapped more integer parameters and return values to Java <code>boolean</code>, that were missed while working on #181.
<ul>
<li>Xlib&apos;s <code>Bool</code></li>
<li>OpenCL&apos;s <code>cl_bool</code></li>
<li>DynCall&apos;s <code>DCbool</code></li>
</ul>
</li>
<li>Moved JNI global reference functions from <code>MemoryUtil</code> to the generated <code>org.lwjgl.system.jni.JNINativeInterface</code>.</li>
<li>The Vulkan capabilities have been split into two classes: <code>VKCapabilitiesInstance</code> and <code>VKCapabilitiesDevice</code>.
<ul>
<li>Flags for core Vulkan versions exist in both classes.</li>
<li>Flags for instance extensions exist only in <code>VKCapabilitiesInstance</code>.</li>
<li>Flags for device extensions exist only in <code>VKCapabilitiesDevice</code>.</li>
<li>Functions that dispatch on <code>VkInstance</code> or <code>VkPhysicalDevice</code> exist only in <code>VKCapabilitiesInstance</code>.</li>
<li>Functions that dispatch on <code>VkDevice</code> and device-derived handles exist only in <code>VKCapabilitiesDevice</code>.</li>
<li>Bootstrapping functions can be retrieved with <code>VK.getFunctionProvider()</code>.</li>
</ul>
</li>
</ul>
<h3 id="download">Download</h3>
<p>Full change log since the last release can be found <a href="https://github.com/LWJGL/lwjgl3/releases/tag/3.1.2">here</a>.</p>
<p>You can download LWJGL from the download page at <a href="https://www.lwjgl.org/download">lwjgl.org/download</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[LWJGL 3.1.0 Released!]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>After hundreds of commits including additions, updates, performance improvements and bug fixes, we are proud to announce the release of LWJGL 3.1.0.</p>
<p>The significant updates include a <a href="https://github.com/LWJGL/lwjgl3/issues/100">new module distribution structure</a> and new bindings for:</p>
<ul>
<li><a href="https://github.com/bkaradzic/bgfx">BGFX</a> (special thanks to <a href="https://twitter.com/code_disaster">@code_disaster</a>)</li>
<li><a href="https://symas.com/products/lightning-memory-mapped-database/">LMDB</a></li>
<li><a href="https://sourceforge.net/projects/tinyfiledialogs/">Tiny File Dialogs</a></li>
<li><a href="https://github.com/vurtun/nuklear">Nuklear</a></li>
</ul>
<p>A more</p>]]></description><link>https://blog.lwjgl.org/lwjgl-3-1-0-released/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce42</guid><category><![CDATA[Releases]]></category><dc:creator><![CDATA[kappaOne]]></dc:creator><pubDate>Sun, 30 Oct 2016 20:44:07 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>After hundreds of commits including additions, updates, performance improvements and bug fixes, we are proud to announce the release of LWJGL 3.1.0.</p>
<p>The significant updates include a <a href="https://github.com/LWJGL/lwjgl3/issues/100">new module distribution structure</a> and new bindings for:</p>
<ul>
<li><a href="https://github.com/bkaradzic/bgfx">BGFX</a> (special thanks to <a href="https://twitter.com/code_disaster">@code_disaster</a>)</li>
<li><a href="https://symas.com/products/lightning-memory-mapped-database/">LMDB</a></li>
<li><a href="https://sourceforge.net/projects/tinyfiledialogs/">Tiny File Dialogs</a></li>
<li><a href="https://github.com/vurtun/nuklear">Nuklear</a></li>
</ul>
<p>A more detailed change log since the last release can be found <a href="https://github.com/LWJGL/lwjgl3/releases/tag/3.1.0">here</a>.</p>
<p>You can download LWJGL from the really cool new download page at <a href="https://www.lwjgl.org/download">lwjgl.org/download</a></p>
<p>The download page now includes the ability to generate custom download builds of LWJGL (meaning a build that includes only the bindings you need), special thanks to <a href="https://twitter.com/apostolos">@apostolos</a> for the nice build configurator.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Memory management in LWJGL]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Java 1.4 was released in early 2002. LWJGL was created a few months later.</p>
<p>This was not a coincidence. Java 1.4 finally made it possible to access off-heap memory from Java and efficiently inter-operate with native code. Using <code>java.nio</code> and direct <code>ByteBuffer</code> instances, Java developers could:</p>
<ul>
<li>Allocate</li></ul>]]></description><link>https://blog.lwjgl.org/memory-management-in-lwjgl-3/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce41</guid><category><![CDATA[Tutorials]]></category><dc:creator><![CDATA[Ioannis Tsakpinis]]></dc:creator><pubDate>Sat, 16 Jul 2016 16:07:16 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Java 1.4 was released in early 2002. LWJGL was created a few months later.</p>
<p>This was not a coincidence. Java 1.4 finally made it possible to access off-heap memory from Java and efficiently inter-operate with native code. Using <code>java.nio</code> and direct <code>ByteBuffer</code> instances, Java developers could:</p>
<ul>
<li>Allocate off-heap memory.</li>
<li>Fill buffers with data and pass them down to native code, without expensive copies.</li>
<li>Access the contents of buffers managed by external libraries.</li>
</ul>
<p>LWJGL 3 was born in late 2012. It is a clean rewrite of LWJGL, officially released on June 2016. Like its predecessor, it provides bindings to popular native libraries via JNI and uses NIO buffers to pass data around. The primary goal of the library is to provide the best performance/usability/safety balance possible, at least until <a href="http://openjdk.java.net/projects/panama/">Project Panama</a> is released (hopefully) in Java 10.</p>
<p>In the meantime, NIO buffers have been getting a lot of bad rep, which is mostly justified. There are a lot of complains about how they&apos;re designed, how they&apos;re used (or not used) in various APIs, how they perform. The purpose of this post is to explain how LWJGL 3 addresses these issues.</p>
<p><em>Disclaimer:</em></p>
<p>The following applies to the platforms LWJGL supports: Linux, MacOS, Windows. LWJGL requires Java 8 and we have tested with OpenJDK, Oracle JDK, Azul Zulu, IBM JDK. Decisions made may or may not be optimal on other JDKs/JVMs. LWJGL does not support (or even work on) Android yet, but it&apos;s almost certain that different strategies will have to be used there.</p>
<h3 id="strategy1">Strategy #1</h3>
<blockquote>
<p>Heap buffers are strictly forbidden. All buffers must be off-heap (<code>DirectByteBuffer</code> and derivatives) to be accepted by the LWJGL API.</p>
</blockquote>
<p>Heap buffers might be cheap to allocate and trivial to cleanup (via standard GC), but they force data copies when passed to native code.</p>
<p>They needlessly complicate all code paths that accept NIO buffers.</p>
<p>They make a lot of call sites bimorphic or even megamorphic. An application that uses direct buffers exclusively can do anything. An application that allows heap buffers cannot avoid direct buffers (e.g. when dealing with data managed by native libraries). This mix of concrete types means the JVM will have a harder job optimizing code.</p>
<p>All <code>ByteBuffer</code> instances created by LWJGL are in the native byte order. Views are always naturally aligned to the element type. If users are also careful with alignment, all buffers will be instantiated from the same concrete class on all platforms (e.g. <code>DirectIntBufferU</code> for the <code>IntBuffer</code> abstract class). You can easily have an application where all buffer call sites are monomorphic.</p>
<h3 id="strategy2">Strategy #2</h3>
<blockquote>
<p>Buffer instances passed to LWJGL APIs are never mutated.</p>
</blockquote>
<p>This applies to the POJO wrappers themselves, not the off-heap memory they point to. In C terms, we treat e.g. an <code>IntBuffer</code> argument as a <code>const pointer to int</code>, not as a <code>pointer to const int</code>.</p>
<p>Standard NIO code typically changes the position of buffers it consumes, up to the point where data reads or writes occurred. This causes redundant (heap) mutations and requires a lot of <code>flip()</code>, <code>reset()</code> and <code>clear()</code> calls in user code.</p>
<p>Buffers passed to LWJGL APIs are never mutated. The values returned by <code>position()</code> and <code>limit()</code> after an LWJGL call are exactly the same as before. This leads to cleaner, easier to understand, code.</p>
<p>For the same reason, the use of absolute gets and puts is encouraged when writing LWJGL code.</p>
<h3 id="strategy3">Strategy #3</h3>
<blockquote>
<p>The JNI functions <code>NewDirectByteBuffer</code>, <code>GetDirectBufferAddress</code> and <code>GetDirectBufferCapacity</code> are never used.</p>
</blockquote>
<p>In pure Java, you cannot:</p>
<ul>
<li>create direct <code>ByteBuffer</code> instances at arbitrary memory addresses and</li>
<li>retrieve the memory address of a direct buffer instance.</li>
</ul>
<p>The officially supported way to do this is in JNI code, using the above functions. This is a serious problem.</p>
<p>In LWJGL, buffer instances are never passed to or from native code:</p>
<ul>
<li>The address of a buffer at its current <code>position()</code> is extracted using <code>Unsafe</code> and passed to JNI code as a <code>jlong</code>, not as a <code>jobject</code>. Then it is cast to the appropriate pointer type and used directly.</li>
<li>The address of buffers managed by native libraries is returned to Java code as <code>jlong</code> values, not as <code>jobject</code>. In Java, it is wrapped into the appropriate buffer instance (using <code>Unsafe</code>) and used directly.</li>
</ul>
<p>First, lets address the elephant in the room. Yes, we do use <code>Unsafe</code> for this. We&apos;re not happy about it either, but there is no alternative. <code>VarHandles</code> in Java 9 will not help, because we&apos;re accessing private implementation details. Unless a pure Java alternative is provided in Java 9, this is the best we can do until Java 10 and Project Panama (looks like we&apos;ll stop using NIO buffers then anyway).</p>
<p>So, why go through all this trouble? Well, actually it&apos;s no trouble at all, because it greatly reduces the amount of JNI code required. Not only because the above functions are never called, but it also moves all pointer arithmetic to Java code (<code>GetDirectBufferAddress</code> returns the base buffer address, regardless of current <code>position()</code> and buffer element type). In addition to smaller JNI functions, LWJGL is able to generate Java method overloads with different buffer types, all reusing the same native method. Fixing bugs is also easier. Using standard Java tools and debuggers you can easily identify issues since the native code basically does nothing and all the relevant information is on the Java side.</p>
<p>But the greatest benefit is another and it is what differentiates LWJGL from other libraries. Passing Java objects to and from native code makes them <strong>escape</strong>, by definition. This means that <strong>escape analysis</strong> can <strong>never eliminate allocations</strong> of such objects when dealing with standard JNI code.</p>
<p>LWJGL&apos;s approach on the other hand lets escape analysis do its job. In the vast majority of cases, where buffers are allocated locally, used in native methods, then discarded, EA works great and eliminates the Java-side allocations. When it doesn&apos;t work, the JVM provides sufficient diagnostic flags (e.g. <code>-XX:+PrintEscapeAnalysis</code>) that enable troubleshooting. Usually a little bit of refactoring and writing cleaner code resolves the issue.</p>
<h3 id="strategy4">Strategy #4</h3>
<blockquote>
<p>Use of <code>ByteBuffer.allocateDirect()</code> is highly discouraged.</p>
</blockquote>
<p>LWJGL versions before 3 relied exclusively on <code>allocateDirect()</code>, via the <code>org.lwjgl.BufferUtils</code> class. This class is still there in 3, for backwards-compatibility, but its use is highly discouraged. The reason is simple, <code>allocateDirect()</code> is horrible:</p>
<ul>
<li>It is slow, much slower than the raw <code>malloc()</code> call. A lot of overhead on top of a function that is already slow.</li>
<li>It scales badly under contention.</li>
<li>It arbitrarily limits the amount of allocated memory (<code>-XX:MaxDirectMemorySize</code>).</li>
<li>Like Java arrays, the allocated memory is always zeroed-out. This is not necessarily bad, but having the option would be better.</li>
<li>There&apos;s no way to deallocate the allocated memory on demand (without JDK-specific reflection hacks). Instead, a reference queue is used that usually requires two GC cycles to free the native memory. This quite often leads to OOM errors under pressure.</li>
</ul>
<p>All of that contributed to users adopting one or more bad practices when dealing with LWJGL code:</p>
<ul>
<li>Using buffer instance pools.</li>
<li>Using global buffer instances, often not in a concurrent-safe way.</li>
<li>Allocating big buffers and writing their own &quot;memory allocator&quot; on top, often with far from optimal results with respect to performance, memory utilization &amp; fragmentation, etc.</li>
</ul>
<p>The recommended way to deal with these issues in LWJGL 3 is via explicit memory management. We have the <code>org.lwjgl.system.MemoryUtil</code> class that uses a configurable memory allocator and exposes a user-friendly API, but other allocators can be used directly, as dictated by application requirements.</p>
<p>We have the <code>org.lwjgl.system.libc.Stdlib</code> class that basically exposes the system default memory allocator. It provides the functions you would expect: <code>malloc</code>, <code>calloc</code>, <code>realloc</code>, <code>free</code>, <code>aligned_alloc</code>, <code>aligned_free</code>.</p>
<p>We also bundle the <code>jemalloc</code> library with LWJGL. It provides the same functions as above and many more for specialized use-cases. This is the default allocator used in <code>MemoryUtil</code> (when available and not overridden), because:</p>
<ul>
<li>It is generally faster than the system default.</li>
<li>It scales better under concurrent allocations.</li>
<li>It is highly configurable and tunable for specific applications.</li>
<li>The build that comes with LWJGL is tuned for performance, but it can easily be replaced with a custom build that enables more features: statistics, debugging, leak detection, etc.</li>
</ul>
<p>I will not discuss here how explicit memory management is not the &quot;Java way&quot;, it&apos;s a topic for another post. Hint: I mostly agree, but not in the context of inter-operating with native systems.</p>
<h3 id="strategy5">Strategy #5</h3>
<blockquote>
<p>Always prefer stack allocation.</p>
</blockquote>
<p>As fast as <code>jemalloc</code> is, stack allocation is always faster. This has always been an aspect in which Java could never compete with C code. Fortunately, LWJGL offers a solution for that too.</p>
<p>The solution is the <code>org.lwjgl.system.MemoryStack</code> class that exposes an API for stack allocations. The recommendation is that any small buffer/struct allocation that is shortly-lived, should happen via the stack API. This approach shines even in tight loops and shows how important strategy #3 is. Example code (using try-with-resources, one of the possible code styles):</p>
<pre><code class="language-java">// OpenGL code
try ( MemoryStack stack = stackPush() ) { // thread-local lookup
    IntBuffer ip = stack.mallocInt(1); // ip instance eliminated
    glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, ip);

    IntBuffer formats = stack.mallocInt(ip.get(0)); // formats instance eliminated
    glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats);

    // ...
} // stack is automatically popped, buffers are freed
</code></pre>
<p>Applicable to structs as well:</p>
<pre><code class="language-java">// Vulkan code
try ( MemoryStack stack = stackPush() ) {
    VkCommandBufferBeginInfo cbi = VkCommandBufferBeginInfo.mallocStack(stack)
        .sType(VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO)
        .pNext(NULL)
        .flags(0)
        .pInheritanceInfo(
            VkCommandBufferInheritanceInfo.mallocStack(stack) // nested struct
                .sType(VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO)
                .pNext(NULL)
                .renderPass(VK_NULL_HANDLE)
                .subpass(0)
                .framebuffer(VK_NULL_HANDLE)
                .occlusionQueryEnable(false)
                .queryFlags(0)
                .pipelineStatistics(0)
        );

    int err = vkBeginCommandBuffer(cmd, cbi);
    check(err);

    // ...
} // structs are automatically freed
</code></pre>
<h3 id="strategy6">Strategy #6</h3>
<blockquote>
<p>Offer tools for debugging.</p>
</blockquote>
<p>Having great performance is nice, but bugs related to explicit memory management can be hard to track down. LWJGL helps with:</p>
<ul>
<li>Basic checks. These are enabled by default and ensure basic invariants with respect to API usage. The most important are related to buffers that cannot be <code>NULL</code> and buffer sizes that must be within certain ranges. This applies to both method parameters and struct members.</li>
<li>A debug mode. When enabled, LWJGL performs additional checks, that may be too expensive to perform by default.</li>
<li>A debug memory allocator. When enabled, all allocations are tracked and any leaks are reported when the JVM process ends. Each leak includes how many bytes where allocated and where exactly (with a full stack trace). Tracking is enabled for allocations via <code>MemoryUtil</code> as well as native-to-Java callback instances.</li>
<li>A stack allocation debugger. When enabled, LWJGL reports methods that have a broken symmetry between stack <code>push</code> &amp; <code>pop</code>.</li>
</ul>
<h3 id="summary">Summary</h3>
<p>All of the above strategies contribute to the final &quot;look and feel&quot; of writing code for LWJGL, which can be summed up as: clean and efficient.</p>
<p>The greatest insight we gained while working on LWJGL 3 is that escape analysis works fantastically well in Java 8+. After several iterations, the final API does very little to encourage buffer instance reuse; it&apos;s simply not needed. Writing clean Java code, short and simple, does wonders not only for pure Java, but also when interacting with native libraries.</p>
<p>There are several, very useful native libraries out there. Waiting for a pure Java port or an abstraction in the JDK just because of how ugly and inefficient JNI code usually is, should be a thing of the past. LWJGL&apos;s approach works right now. Soon, Project Panama will eliminate most (if not all) remaining overhead and together with value types and any-generics will provide an extra level of type safety, bringing to Java a very strong FFI solution.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[LWJGL 3.0.0 Released!]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>After more than 3 years of development, the LWJGL team is proud to announce the official release of LWJGL 3.0.0.</p>
<p>It contains bindings for the following libraries:</p>
<ul>
<li>
<p>EGL -	An interface between Khronos rendering APIs such as OpenGL ES or OpenVG and the underlying native platform window system.</p></li></ul>]]></description><link>https://blog.lwjgl.org/lwjgl-3-0-0-released/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce3e</guid><category><![CDATA[Releases]]></category><dc:creator><![CDATA[kappaOne]]></dc:creator><pubDate>Sat, 04 Jun 2016 11:26:47 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>After more than 3 years of development, the LWJGL team is proud to announce the official release of LWJGL 3.0.0.</p>
<p>It contains bindings for the following libraries:</p>
<ul>
<li>
<p>EGL -	An interface between Khronos rendering APIs such as OpenGL ES or OpenVG and the underlying native platform window system.</p>
</li>
<li>
<p>OpenCL - An open, royalty-free standard for cross-platform, parallel programming of diverse processors found in personal computers, servers, mobile devices and embedded platforms.</p>
</li>
<li>
<p>OpenGL - The most widely adopted 2D and 3D graphics API in the industry, bringing thousands of applications to a wide variety of computer platforms.</p>
</li>
<li>
<p>OpenGL ES - A royalty-free, cross-platform API for full-function 2D and 3D graphics on embedded systems - including consoles, phones, appliances and vehicles.</p>
</li>
<li>
<p>Vulkan - A new generation graphics and compute API that provides high-efficiency, cross-platform access to modern GPUs used in a wide variety of devices from PCs and consoles to mobile phones and embedded platforms.</p>
</li>
<li>
<p>GLFW - Create multiple windows, handle user input (keyboard, mouse, gaming peripherals) and manage contexts. Also features multi-monitor support, clipboard access, file drag-n-drop, and much more.</p>
</li>
<li>
<p>JAWT - The AWT native interface.</p>
</li>
<li>
<p>LibOVR - The API of the Oculus SDK.</p>
</li>
<li>
<p>nfd - A tiny, neat C library that portably invokes native file open and save dialogs.</p>
</li>
<li>
<p>OpenAL - A cross-platform 3D audio API appropriate for use with gaming applications and many other types of audio applications.<br>
OpenAL Soft	An LGPL-licensed, cross-platform, software implementation of the OpenAL 3D audio API.</p>
</li>
<li>
<p>NanoVG - A small antialiased vector graphics rendering library for OpenGL.</p>
</li>
<li>
<p>par_shapes - Generate parametric surfaces and other simple shapes.</p>
</li>
<li>
<p>stb - single-file public domain libraries for C/C++</p>
</li>
<li>
<p>stb_easy_font - Quick-and-dirty easy-to-deploy bitmap font for printing frame rate, etc.</p>
</li>
<li>
<p>stb_image - Image loading/decoding from file/memory: JPG, PNG, TGA, BMP, PSD, GIF, HDR, PIC</p>
</li>
<li>
<p>stb_image_resize - Resize images larger/smaller with good quality.</p>
</li>
<li>
<p>stb_image_write - Image writing to disk: PNG, TGA, BMP</p>
</li>
<li>
<p>stb_perlin - Revised Perlin noise (3D input, 1D output).</p>
</li>
<li>
<p>stb_rect_pack - Simple 2D rectangle packer with decent quality.</p>
</li>
<li>
<p>stb_truetype - Parse, decode, and rasterize characters from truetype fonts.</p>
</li>
<li>
<p>stb_vorbis	Decode ogg vorbis files from file/memory to float/16-bit signed output.</p>
</li>
<li>
<p>dyncall - Encapsulates architecture-, OS- and compiler-specific function call semantics in a virtual bind argument parameters from left to right and then call interface allowing programmers to call C functions in a completely dynamic manner.</p>
</li>
<li>
<p>jemalloc - A general purpose malloc implementation that emphasizes fragmentation avoidance and scalable concurrency support.</p>
</li>
<li>
<p>xxHash - An Extremely fast Hash algorithm, running at RAM speed limits.</p>
</li>
</ul>
<p>A full change log since the LWJGL 3 beta can be found <a href="https://github.com/LWJGL/lwjgl3/blob/47a4d8d65cdb697f7d16ac7f75987c706dc14d21/doc/notes/3.0.0.md">here</a>.</p>
<p>Visit the <a href="https://www.lwjgl.org/download">download</a> page to get LWJGL 3.0.0. You can also grab it from Maven Central or this <a href="http://build.lwjgl.org/release/3.0.0/lwjgl-3.0.0.zip">direct link</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Java OpenGL Math Library (JOML) 1.8.0 Released]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>In time for the <a href="https://blog.lwjgl.org/lwjgl-3-0-0-released/">LWJGL3 release</a>, version 1.8.0 of JOML (Java OpenGL Math Library) has been released.</p>
<p>There have been a lot of improvements since we last covered it in a previous blog post <a href="https://blog.lwjgl.org/maths-library/">here</a>.</p>
<p>Check out the change log and grab it <a href="https://github.com/JOML-CI/JOML/releases/tag/1.8.0">here</a></p>
<!--kg-card-end: markdown-->]]></description><link>https://blog.lwjgl.org/joml-1-8-0-release/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce40</guid><category><![CDATA[Releases]]></category><dc:creator><![CDATA[kappaOne]]></dc:creator><pubDate>Sat, 04 Jun 2016 11:26:09 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>In time for the <a href="https://blog.lwjgl.org/lwjgl-3-0-0-released/">LWJGL3 release</a>, version 1.8.0 of JOML (Java OpenGL Math Library) has been released.</p>
<p>There have been a lot of improvements since we last covered it in a previous blog post <a href="https://blog.lwjgl.org/maths-library/">here</a>.</p>
<p>Check out the change log and grab it <a href="https://github.com/JOML-CI/JOML/releases/tag/1.8.0">here</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Book - 3D Game Development with LWJGL 3]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I recently came across a really well written and free guide/book for using LWJGL 3 titled <strong>3D Game Development with LWJGL 3</strong>. It&apos;s a good read, especially for new users who want to get up to speed quickly.</p>
<p>It covers a number of topics including:</p>
<pre><code>1 First</code></pre>]]></description><link>https://blog.lwjgl.org/3d-game-development-with-lwjgl-3/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce3d</guid><category><![CDATA[Tutorials]]></category><dc:creator><![CDATA[kappaOne]]></dc:creator><pubDate>Tue, 29 Mar 2016 12:06:35 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I recently came across a really well written and free guide/book for using LWJGL 3 titled <strong>3D Game Development with LWJGL 3</strong>. It&apos;s a good read, especially for new users who want to get up to speed quickly.</p>
<p>It covers a number of topics including:</p>
<pre><code>1 First steps
2 The Game Loop
3 A brief about coordinates
4 Rendering
5 More on Rendering
6 Transformations
7 Textures
8 Camera
9 Loading more complex models
10 Let there be light
11 Let there be even more light
12 HUD
13 Sky Box and some optimizations
14 Height Maps
15 Terrain Collisions
16 Fog
17 Normal Mapping
18 Shadows
19 Animations
</code></pre>
<p>The book can be found <a href="https://www.gitbook.com/book/lwjglgamedev/3d-game-development-with-lwjgl/details">here</a>.</p>
<p>It can be read online or downloaded in one of the several available formats (.pdf, .epub, .mobi).</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Java OpenGL Math Library (JOML)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>A common question being asked by many people who are moving from LWJGL2 to LWJGL3 is what they should use as a math library for their project as the old lwjgl_util.jar is no longer part of LWJGL3.</p>
<p>A rather good solution is the Java OpenGL Math Library (aka</p>]]></description><link>https://blog.lwjgl.org/maths-library/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce3c</guid><category><![CDATA[Releases]]></category><dc:creator><![CDATA[kappaOne]]></dc:creator><pubDate>Mon, 01 Jun 2015 11:25:12 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>A common question being asked by many people who are moving from LWJGL2 to LWJGL3 is what they should use as a math library for their project as the old lwjgl_util.jar is no longer part of LWJGL3.</p>
<p>A rather good solution is the Java OpenGL Math Library (aka JOML). Its small, fast, supports NIO buffers (compatible with how LWJGL handles buffer arguments), multi-threading and is allocation free (i.e. will not allocate any memory unless specifically requested to do so).</p>
<p>It can be found at <a href="https://github.com/JOML-CI/JOML">https://github.com/JOML-CI/JOML</a></p>
<p>The latest release can be downloaded from <a href="https://github.com/JOML-CI/JOML/releases/">here</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[UPX compression]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The LWJGL native libraries for Windows and Linux are now compressed using <a href="http://upx.sourceforge.net/">UPX</a>, making the binary distributable about 2 MB (or 33%) smaller.</p>
<p>The LWJGL 3.0.0a release has been updated with the compressed binaries. In the near future, we will also provide separate downloads for binaries, source and</p>]]></description><link>https://blog.lwjgl.org/upx-compression/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce3b</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[Ioannis Tsakpinis]]></dc:creator><pubDate>Wed, 29 Apr 2015 10:37:36 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>The LWJGL native libraries for Windows and Linux are now compressed using <a href="http://upx.sourceforge.net/">UPX</a>, making the binary distributable about 2 MB (or 33%) smaller.</p>
<p>The LWJGL 3.0.0a release has been updated with the compressed binaries. In the near future, we will also provide separate downloads for binaries, source and documentation.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[LWJGL 3.0.0a released]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The LWJGL team is proud to announce the first official release of LWJGL 3!</p>
<p>Many thanks to all the enthusiastic LWJGL users that have been trying the nightly builds since last November, it helped us immensely with improving the quality of the library. Keep the feedback coming!</p>
<p>The <strong>3.0.</strong></p>]]></description><link>https://blog.lwjgl.org/lwjgl-3-0a-released/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce3a</guid><category><![CDATA[Releases]]></category><dc:creator><![CDATA[Ioannis Tsakpinis]]></dc:creator><pubDate>Mon, 27 Apr 2015 19:44:15 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>The LWJGL team is proud to announce the first official release of LWJGL 3!</p>
<p>Many thanks to all the enthusiastic LWJGL users that have been trying the nightly builds since last November, it helped us immensely with improving the quality of the library. Keep the feedback coming!</p>
<p>The <strong>3.0.0a</strong> release includes the following changes:</p>
<ul>
<li>Updated <a href="http://www.glfw.org/">GLFW</a> to <strong>3.1.1</strong></li>
<li>Updated <a href="http://kcat.strangesoft.net/openal.html">OpenAL Soft</a> with the latest changes</li>
<li>Added <a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/index.html">Objective-C Runtime</a> bindings<br>
Used together with the LibFFI bindings, the Objective-C Runtime enables you to interface JVM applications with <strong>Cocoa APIs</strong> on Mac OS X.</li>
<li>Added <strong>LibOVR</strong> bindings<br>
Got a Rift? Download the <a href="https://developer.oculus.com/">Oculus VR SDK</a>, build LWJGL on your favorite platform and you&apos;re ready to design wonderful virtual reality experiences!</li>
<li>Restored <strong>type postfixes</strong> in Java method names, so that they always match with the corresponding native function. This change breaks compatibility with LWJGL 2 in several places, but it&apos;s trivial to fix existing code. See <a href="http://forum.lwjgl.org/index.php?topic=5746.0">this thread</a> for details.</li>
<li>Cleaned-up the build scripts and made them more robust. Also, the included IntelliJ project now works almost out of the box, with minimal configuration. If you&apos;re looking to <strong>contribute</strong> to LWJGL, it should now be painless.</li>
<li>Added support for <strong>modules</strong>. All bindings that LWJGL supports can now be conditionally included or excluded during the build process. If you have a need for lighter binaries, it&apos;s now very easy to deploy a customized build.<br>
This feature also allows us to support as many bindings as we like, assuming at least some users find them useful, without worrying about the distribution size of the official release.</li>
<li>Native binaries for all OSes and architectures now live in the <strong>same directory</strong>. The previous structure, with different subdirectories for each OS/arch, was causing trouble with popular application launchers and tools that create/extract JARs.</li>
<li>Added new demos and tests. If you can build LWJGL locally, make sure to run the fantastic ray tracing demos contributed by <a href="https://github.com/httpdigest">Kai Burjack</a>!</li>
<li>Many bug fixes and API improvements of course!</li>
</ul>
<p>So, what&apos;s coming next?</p>
<ul>
<li>Support for <a href="https://gradle.org/">Gradle</a> and deployment to Maven Central.<br>
Ant is showing its age and we need something modern and more easily maintainable. Depending on how this goes, we&apos;ll probably drop Ant support at some point.</li>
<li><a href="http://www.amd.com/en-us/innovations/software-technologies/technologies-gaming/mantle">Mantle</a> bindings<br>
Everyone is excited about Vulkan, but it will be a while before the specification is released and stable drivers are available. AMD&apos;s Mantle is the API that Vulkan was based on and you can use it right now to start designing a next-generation rendering application. Obviously it will be an optional module, since it&apos;s Windows-only and requires GCN hardware.</li>
</ul>
<p>After that we&apos;ll get:</p>
<ul>
<li>Support for all (still relevant) OpenGL extensions. If you have time to contribute, this is what we need more help with.</li>
<li><a href="https://www.khronos.org/egl">EGL</a> and <a href="https://www.khronos.org/opengles/">OpenGL|ES</a> bindings</li>
</ul>
<p>Around that time we should do a beta release. Moving on:</p>
<ul>
<li><a href="https://www.khronos.org/vulkan">Vulkan</a> bindings, when the spec is released. You can&apos;t wait, we know!</li>
<li><a href="https://msdn.microsoft.com/en-us/library/dn899121(v=vs.85).aspx">D3D 12</a> bindings. Hey, why not, we have modules now. :)</li>
<li>Video decoding bindings.<br>
We promised that before, but it has been postponed due to technical difficulties. We&apos;re still discussing what the best approach should be, if you have any input please post a topic on the forum.</li>
<li>Font rendering functionality.<br>
This is another very commonly requested feature and we really want to avoid any AWT dependencies. There are several options here as well, so feel free to offer suggestions.</li>
</ul>
<p>Enjoy the first LWJGL 3 release!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[LWJGL 2.9.3 Released]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The LWJGL team is proud to present the latest and final release of the now legacy LWJGL 2 series.</p>
<p>Full details and changelog for the release can be found <a href="http://forum.lwjgl.org/index.php?topic=5617.0">here</a> (LWJGL 2.9.2).<br>
<em>Update Jan 19, 2015:</em> There has been another bugfix release. Details <a href="http://forum.lwjgl.org/index.php?topic=5655.0">here</a> (LWJGL 2.9.3)</p>]]></description><link>https://blog.lwjgl.org/lwjgl-2-9-2-released/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce38</guid><category><![CDATA[Releases]]></category><dc:creator><![CDATA[kappaOne]]></dc:creator><pubDate>Mon, 29 Dec 2014 16:06:44 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>The LWJGL team is proud to present the latest and final release of the now legacy LWJGL 2 series.</p>
<p>Full details and changelog for the release can be found <a href="http://forum.lwjgl.org/index.php?topic=5617.0">here</a> (LWJGL 2.9.2).<br>
<em>Update Jan 19, 2015:</em> There has been another bugfix release. Details <a href="http://forum.lwjgl.org/index.php?topic=5655.0">here</a> (LWJGL 2.9.3).</p>
<p>Pull requests that are well-written and properly tested will still be accepted and the nightly build server will continue to run for the time being.</p>
<p>If anyone is interested in taking over maintenance of the LWJGL 2 project, they should contact spasi via PM on the forums.</p>
<p>Many thanks to everyone that has <a href="http://legacy.lwjgl.org/credits.php">contributed</a> to LWJGL over the years!</p>
<p>From hereon the focus will be on LWJGL 3+.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Ray tracing with OpenGL Compute Shaders (Part I)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>An excellent first part article/tutorial of a series on &apos;Ray tracing with OpenGL Compute Shaders&apos; by Kai Burjack.</p>
<p>Its pretty rare to find good tutorials covering such topics especially using modern OpenGL techniques.</p>
<p>By the end of the tutorial series its expected that you&apos;ll be</p>]]></description><link>https://blog.lwjgl.org/ray-tracing-with-opengl-compute-shaders-part-i/</link><guid isPermaLink="false">5a629fb5468e5e0b4cc5ce36</guid><category><![CDATA[Tutorials]]></category><dc:creator><![CDATA[kappaOne]]></dc:creator><pubDate>Mon, 08 Dec 2014 17:11:40 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>An excellent first part article/tutorial of a series on &apos;Ray tracing with OpenGL Compute Shaders&apos; by Kai Burjack.</p>
<p>Its pretty rare to find good tutorials covering such topics especially using modern OpenGL techniques.</p>
<p>By the end of the tutorial series its expected that you&apos;ll be able to produce cool results like the following image:</p>
<p><img src="https://camo.githubusercontent.com/2765eb4375e77929d9527c70c8a10f0c0d5c1b55/687474703a2f2f63646e2e6c776a676c2e6f72672f7475746f7269616c732f3134313230385f676c736c5f636f6d707574652f66696e616c72656e6465722e6a7067" alt="alt" loading="lazy"></p>
<p>Read the full article/tutorial on the LWJGL3 wiki <a href="https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-%28Part-I%29">here</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[OpenAL Performance Improvements]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>LWJGL uses the OpenAL-Soft library for its OpenAL support.</p>
<p>One of the MESA developers, Timothy Arceri, while profiling OpenArena noticed that about 14% of the CPU usage was being used for processing sound. After looking into the situation he implemented SSE2 and SSE4.1 linear resamplers in OpenAL-Soft which in</p>]]></description><link>https://blog.lwjgl.org/openal-performance-improvements/</link><guid isPermaLink="false">5a629fb4468e5e0b4cc5ce32</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[kappaOne]]></dc:creator><pubDate>Sun, 07 Dec 2014 22:16:04 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>LWJGL uses the OpenAL-Soft library for its OpenAL support.</p>
<p>One of the MESA developers, Timothy Arceri, while profiling OpenArena noticed that about 14% of the CPU usage was being used for processing sound. After looking into the situation he implemented SSE2 and SSE4.1 linear resamplers in OpenAL-Soft which in some cases have halved its CPU usage (or made it twice as fast).</p>
<p>The optimisation was included in the 1.16 release of OpenAL-Soft and as a result is passed onto LWJGL users.</p>
<p>Gotta love open source development.</p>
<p><img src="https://www.lwjgl.org/svg/OpenAL_Logo.svg" alt="alt" loading="lazy"></p>
<p>The full details of the change can be read on Timothy&apos;s blog <a href="http://www.itsqueeze.com/2014/10/how-you-can-help-reduce-cpu-usage-in-mesa/">here</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[First 10 days]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Nov 08, 2014 was a huge milestone for LWJGL 3. It was the first time anyone could download a nightly build of the library and start playing with it. A few days later the new site was deployed and suddenly there was so much interest for the project. Not that</p>]]></description><link>https://blog.lwjgl.org/20141118_first_10_days/</link><guid isPermaLink="false">5a629fb4468e5e0b4cc5ce34</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[Ioannis Tsakpinis]]></dc:creator><pubDate>Tue, 18 Nov 2014 22:39:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Nov 08, 2014 was a huge milestone for LWJGL 3. It was the first time anyone could download a nightly build of the library and start playing with it. A few days later the new site was deployed and suddenly there was so much interest for the project. Not that surprising I guess, LWJGL is used extensively and everyone&apos;s been waiting for a better version, but it did come as a shock after two years of silently working towards the next big release. Yes, it&apos;s been almost two years, our first LWJGL 3 commit was on Dec 23, 2012!</p>
<p>Initial feedback has been surprisingly positive. Seems everyone&apos;s favorite feature is the GLFW bindings and I&apos;d like to take the opportunity to publicly thank Camilla Berglund (aka elmindreda) for the fantastic job she&apos;s doing with the project. It&apos;s really been wonderful to finally be able to rely on a well-designed and well-implemented windowing system.</p>
<p>The site seems to also have left a positive impression, though it&apos;s light on content at the moment. As we get closer to an official release, more information will be added and we hope that we&apos;ll also be able to feature the first projects that use LWJGL 3!</p>
<p>The community excitement did also result in a flurry of activity inside the project. Issues had to be fixed, design choices and technical problems explained, new usability features implemented. Change log for the past week or so:</p>
<ul>
<li><strong>Bug fixes</strong>, lots of them! The library was suddenly exposed to a wide variety of hardware and operating systems, so some friction was expected. That&apos;s what nightly builds are for. :)</li>
<li>The <strong>minimum required Java version is now 6</strong> (down from 7). Java 7 was only a minor convenience and was painless to drop. In return, we made deployment of applications that use LWJGL a lot easier for some of our users.</li>
<li>Resolved <a href="https://github.com/LWJGL/lwjgl3/issues/17">#17</a>, which was affecting a lot of users.</li>
<li>Re-implemented <strong>native library loading</strong>, so that using LWJGL 3 is as simple as LWJGL 2. Both <code>-Djava.library.path</code> and <code>-Dorg.lwjgl.librarypath</code> are now supported and users do not have to specify a specific OS and architecture anymore.</li>
<li>Added <strong>new OpenAL extensions</strong> and refactored the API to allow for <a href="http://kcat.strangesoft.net/openal-extensions/EXT_thread_local_context.txt">thread-local OpenAL contexts</a>.</li>
<li>Made building LWJGL locally less painful. <strong>JAVA6_HOME</strong> is now optional, added a <strong>release</strong> Ant target and an override for where the <strong>generated files</strong> are stored.</li>
</ul>
<p>The greatest news though was that we already have an offer for a contribution to LWJGL 3, bindings to a new API! Stay tuned!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Welcome to LWJGL 3]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>It&apos;s finally here! LW<strong>JGL 3</strong> has a new, modern <a href="http://www.lwjgl.org">home</a>, an updated <a href="http://forum.lwjgl.org">forum</a>, nightly build <a href="http://new.lwjgl.org/source">infrastructure</a> and... <strong>a blog</strong>! This will be a fun new way to stay up-to-date with LWJGL and the latest developments in the world of Java gaming and computing. Don&apos;t forget</p>]]></description><link>https://blog.lwjgl.org/welcome-to-lwjgl-3/</link><guid isPermaLink="false">5a629fb4468e5e0b4cc5ce30</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[Ioannis Tsakpinis]]></dc:creator><pubDate>Thu, 13 Nov 2014 20:53:29 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>It&apos;s finally here! LW<strong>JGL 3</strong> has a new, modern <a href="http://www.lwjgl.org">home</a>, an updated <a href="http://forum.lwjgl.org">forum</a>, nightly build <a href="http://new.lwjgl.org/source">infrastructure</a> and... <strong>a blog</strong>! This will be a fun new way to stay up-to-date with LWJGL and the latest developments in the world of Java gaming and computing. Don&apos;t forget to subscribe to the <a href="https://blog.lwjgl.org/rss/">RSS feed</a>!</p>
<p>It&apos;s been a long time since the decision was made to <strong>completely rewrite</strong> LWJGL, something that very often results in doomed projects. But we&apos;re still here and now getting close to the very first official release! This release will have <em>alpha</em> status, but the most important functionality is already in place. For the <em>beta</em>, we want to have feature parity with LWJGL 2, which at the time of writing this means adding support for OpenGL|ES (and EGL of course), as well some of the most popular vendor-specific OpenGL extensions currently missing.</p>
<p>With that said, feel free to download a nightly build and do some testing, or even start porting your applications. We&apos;re very confident that you&apos;ll love the new feel and power of LWJGL 3, the robust new <a href="http://www.glfw.org/docs/latest/">windowing system</a> and, <em>our favorite feature</em>, the amazing productivity boost from the built-in <a href="http://javadoc.lwjgl.org">documentation</a>! Initial feedback has been extremely positive and quite a few developers are using it already!</p>
<p>We also have a new logo, that symbolizes the project&apos;s fresh start. We wanted a modern, yet familiar design, something that stays close in concept to the legacy logo. So, here it is:</p>
<p><img src="http://cdn.lwjgl.org/logo/lwjgl3-dark.png" alt="LWJGL 3 Logo" loading="lazy"></p>
<p>Love it? Hate it? Let us know on the forum!</p>
<p>The roadmap ahead is pretty straightforward. But like all open source projects, the bottleneck is the availability of contributors, their day jobs and other obligations, that keep the project from getting there sooner, rather than later. If you&apos;d like to help, the <a href="https://github.com/LWJGL/lwjgl3">codebase</a> is mature enough and you can jump right in. Go through the <a href="https://github.com/LWJGL/lwjgl3-wiki/wiki">wiki</a> and don&apos;t hesitate to ask for help. We&apos;d love to receive a contribution from you!</p>
<p>Until next time!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>