Saturday, June 6, 2009

A new focus for Essence

It has been quite a while since my last post. We have been busy working on the world editor tool. This week, I would like to announce a new focus for our project.

As you may already know, Project Essence is a two part project including the development of a Java based 3D graphics engine and an action oriented MMOG. However, so far our focus has always been the actual game development. The engine and tool chain development have always been driven by art team requirements. During the several meetings we had last week, our team has reached a conclusion that it would be a better approach for us to focus on the actual engine development instead of the game development, both in terms of our project and our personal career development. Therefore, starting from this week, we will heavily focus on developing our engine.

So now, let me say a few things about the engine itself. We are trying to develop a true AAA quality 3D graphics engine with all the state of the art features and capabilities. The engine itself is implemented completely on the Java platform with native graphics access provided by LWJGL on top of OpenGL. The engine features a shader oriented, message passing architecture to fully support GLSL shaders and multithreaded processing. Since the engine is still under development, I don't want to go into too much details on the specific features. But we are doing our best to make it support all the possible cutting edge features you can imagine with the highest possible performance.

Hopefully we can soon show off some of the features we've implemented. But now, I should get back to code. Have a nice day.

P.S. We are hoping that one day our engine can make its way onto the consoles along with our MMOG. In fact we specifically designed the game to suit the console environment. So if you have the connections and resources to port Java onto the consoles, please, please please do so! A million thanks!

Monday, May 11, 2009

Essence Editor 0.5 Release

After a few delays, finals, and a couple of bug fixes, the time has finally come for the release of the Essence Editor Character Perspective. This marks the half-way mark of the Essence Editor, which will soon include a world creation tool with terrain sculpting, static object placement, lighting, and more. This is a significant milestone in the completion of the project, and I'm glad to make its announcement my first post.

The Essence Editor Character Perspective is a part of the Project Essence tool chain and is used to create and edit textured, animated, and particle decorated character sets. These character sets can be exported into textured .mesh and decorated .anim binaries for use in Java Monkey Engine 2.0 projects.

You can download Mac and PC versions of the Essence Editor here. There, you will also find links to tutorial videos which guide you through all of the tasks you can perform using the Essence Editor.

Thank you for using the Essence Editor Character Perspective. We look forward to hearing your feedback.

- Weenahmen

Saturday, April 18, 2009

Aeon render module progress (Display List vs. VAO vs. VBO)

It has been quite a while since my last progress report. I have been busy designing, implementing and testing the render module of our graphics engine, Aeon. In this report, I will describe what I have found about several advanced rendering techniques that will be applied to the Aeon render module.

First, the most efficient display lists. Display list is rather an old rendering technique. It is most efficient for rendering pure static objects. It is simply a pre-compiled immediate mode rendering. The obvious disadvantage is that you cannot modify the content once it is compiled and sent to the rendering server. However, it is the most efficient way of rendering static objects. Aeon render module detects the render mode of objects based on developer set hint flags. And if the flag is set to pure static, then the object will be rendered using display list for best raw performance.

Second, VAOs or vertex array objects. VAO is derived from VAR or vertex arrays. Since OpenGL 1.4, buffer objects have been implemented to better support client/server model for use of vertex arrays. VAOs are not as efficient as display lists, however, they do provide the functionality to support dynamic objects whose data content changes over time. VAOs is implemented on top of VARs with buffer objects on the rendering server end. The data content of an object is stored locally in the client memory space and sent to rendering server every time the object is drawn via glXXXPointer(..., dataBuffer/pointer). VAOs are very good for a local rendering system, like a typical game engine where the client and server are on the same machine (Game application as client, graphics card as server). The transfer cost from system memory to VRAM is considered relatively cheap. However, it is not very efficient for distributed rendering where the client and server are located on different physical machines. Since each render call requires the data content to be sent from the client to the server, this implies that the data content needs to be transfered via network for every render invocation, which could easily use up the transfer bandwidth. And the latency of transferring the data content over the network can also hinder performance. Also, if only a small portion of object data changes, VAOs still require all data contents to be transfered including the static portion. This obviously wastes sources and can hinder performance.

Lastly, VBOs or vertex buffer objects. VBOs are very similar to VAOs. The power of VBOs comes from its flexible implementation. Compare to VAOs, VBOs do not require data content to be sent to server for every single render invocation if the data does not change. In fact, for pure or partial static objects, the static portion of an object can be buffered once and referenced using an name ID later on. This allows data to be only transfered to the server when needed, which in turn reduces transfer latency and improves application performance. However, due to the fact that VBOs require more bookkeeping than VAOs (binding buffers via glBindBufferARB(...) calls), it is not as efficient as VAOs if all the data requires to be transfered for every single frame. This implies that for true dynamic objects or even some highly dynamic objects that change multiple times every frame or at lease once every frame, VAOs may be a better choice over VBOs. The true power of VBOs comes into play when rendering objects that change relatively infrequently. In real world game applications, this is usually the case. For instance, an skeletal animated character usually changes its vertex data 24 or 30 frames per second. If the rendering frame rate is higher than this (Typically 60 frames per second with vertical synchronization), the data only needs to be transfered every 2 or 3 frames. By reducing the number of data transfers, VBOs can significantly improve the application performance. Also a big portion of animated character data usually does not change at all. Typically, only the vertex position and normal data need to be transfered when using VBOs, where as VAOs require all data to be transfered every frame.

Aeon render module will support all three rendering methods and apply them as it sees fit based on developer given hint flags. The following is a summary list of what each method is best suited for.

Display Lists: Best for pure static objects that do not change at all. Such as static rocks in the scene.
VAOs (Vertex Array Objects): Best for high resolution dynamic models with update rates significantly higher than the actual rendering frame rate and all or most data contents change frequently.
VBOs (Vertex Buffer Objects): Best for standard resolution dynamic models with update rates lower than the actual rendering frame rate and only a small portion of data contents change over time.

Finally an update on the current status of the editor project. The character perspective has been completed, we are finishing up with some final tests and bug fixes. Once we finish these final touches and a tutorial video, the character perspective will be released to the public open source. I would like to thank Tim for his hard work on the particle system for the past a few weeks.

Saturday, March 28, 2009

Concurrent animator and architectures screen shot

It has been quite a while since the last post. We have been really busy working on pushing the first release of our character editor. The good news is that most of the functionalities have already been implemented and tested, we are just finishing off the particle editing and binary format exporting. Then we should be all set to go.

The quick report for the work that we've done for the past two weeks is as follows: first, I finished implementing the concurrent MD5 animator, which allows concurrent updating of animations for a character. The benchmark with a single character animator running in parallel with the rendering operation shows a 7.3% percent frame rate increase and a 12% CPU utilization increase on an Intel Core 2 Duo processor. The result should scale up very nicely once you introduce hundreds of characters running around on the screen. In our single character test, the total CPU utilization is only about 20%. Second, Tim has been working really hard to finish up implementing the particle editing functionalities for the character editor. Some of the early test cases have shown very impressive effects. The last time I checked, we only have two more functionalities to go.

That's pretty much the shortened version of what we've been doing. And here's a nice treat. Last week we got a screen shot from our art team of some of the environmental architectures. So here it is, the first public screen shot of Project Essence.

04/02/2009

Further testing both by our team and outside sources who also use the import has shown a great performance improvement of the concurrent animator over the single threaded version. Here are some of the testing results:

Single threaded 1 character:   95 FPS
Single threaded 2 characters:  47 FPS
FPS decrease: 102%

Concurrent 1 character:   880 FPS
Concurrent 2 characters:  705 FPS
FPS decrease: 24.8%


04/03/2009

I have made several optimizations to both concurrent and single threaded versions of the MD5Importer animator. The performance of the single threaded version has been significantly improved. The "laggy" problem in the concurrent version has been solved with these optimizations. Also the concurrent version has gained a 4% performance improvement as well. With the help from these new optimizations, the scalability of the concurrent version should be significantly improved. You should see a linear performance decrease with very small slope as you add in a lot of animated characters.

Here are some new testing results:

Single threaded 1 character:   820 FPS
Single threaded 2 characters:  670 FPS
FPS decrease: 22.4%

Concurrent 1 character:   870 FPS
Concurrent 2 characters:  720 FPS
FPS decrease: 20.1%

Notice the result here is largely GPU bound rather than CPU bound. The 2 character case is not enough to show CPU scalability.



Saturday, March 7, 2009

The beginning of Essence

It is exciting that I have finally created the first public portal to Project Essence, a commercial project that I have been working on for the past two years. This blog will be maintained by me and Tim, our talented lead software engineer and gameplay designer. As of me, I am the creative director and lead architect of Project Essence.

Project Essence is a two part commercial project initiated in the fall of 2006. The first part of Project Essence is to develop a next generation commercial quality graphics engine using Java and OpenGL technologies. And the second part of Essence is a revolutionary cross-platform, highly action oriented massive multi-player online game. The project is scheduled to reach its alpha stage in fall 2009, which is about half a year from now. Currently the graphics engine architecture has been implemented. Some essential modules have also been implemented and tested. The team is busy working on the first release of our character editor.

Due to time constraints, Essence is currently utilizing some parts of JavaMonkeyEngine at the lower system level. I would really like to thank the brilliant developers of jME. Without their excellent work, Essence would not be able to reach its current stage. And the team of Essence would also like to contribute back to the jME community. Therefore, we will be releasing our character/world editor to the general public under open source license very soon.

That's it for the first post. Stay tuned for more information on our graphics engine and the current progress of the soon to be released character editor next time.

Thanks
Yi