Wednesday, September 5, 2012
Thoughts after the RuneEngine V2 Code Review
Going through this I had quite a few thoughts. Absolutely none of them involved considering change. I found that for 210 code files currently they all seem to be in pretty good order and have great readability. But that is aside from the point. The real point is an issue of mentality gained from reviewing the source.
I have spent a lot of time over the past few months procrastinating about not working on the engine. I am getting heavy back in development with it so I decided a cleanup pass was in my best interest. I had been procrastinating because of "how much is left." Well, this review showed me quite a it in the direction of how inaccurate that really is. There are still plenty of unfinished areas and new features that need implementation, but reminding myself that there are systems and features already implemented that push into professional grade quality affected my opinion of where I am at. It would appear that by the end of the week I could have any loose ends taken care of and begin development of new features next week. By new features I specifically mean building the editor.
Now, I've spoken here about the goals of the engine as far as features, but here's a list of what I found that gives me such a confident outlook on the status.
- Deferred Rendering
- Post Processing System
- Dynamic Content system
- Custom material format
- User defined geometry system capable of working to the extent of a simple modeling utility
- Extendable file IO system
- Extendable XNA content resource extensibility (This is small, but huge at the same time, specifically it is built that shaders with custom structs used can be applied via the material file format with some extension to this area)
- Input System, with plugin capabilities
- Updateless and per-frame draw call removed system (huge optimization)
- Custom SpriteBatch which renders into a deferred scene with textures that support the multiple channels.
- Architecture in a way that almost every part of the engine is 100% self reliant.
- Low-Level and High-Level implementations for most features
As a foundation, RuneEngine V2 has all the necessary pieces to be something really impressive. Nearly the entire engine is designed for extendability. This design is going to make moving forward significantly easier than it was in past iterations.
Very soon, after the loose ends are tied up I will be making a post here and on the RuneEngine V2 facebook page. This post is going to be a demonstration of development with RuneEngine V2. I want to showcase, how some of this stuff is compartmentalized and how, as a coder using it, things are going to be done. In many cases a test project only consists of a few RuneEngine lines of code. If it's much more then it is due to setting up parameters of objects for a less "defaulted" test.
Anyways, happy coding.
Thursday, August 30, 2012
My new Development Pattern and why it works
Tuesday, July 24, 2012
Console Game Architecture: Part 1
One crucial part to all games is the While loop. So, in console games many people make this mistake in thinking. Oh it's text based so I don't need that. Sorry, you really do. Granted you can avoid it, but you're only making it harder if you don't use the loop. That means you need a boolean field which determines if the game is running and a while loop which utilizes that value. here is the simplest way to approach this.
Nothing hard about that. Making sure you start here is crucial to saving yourself thousands of headaches later. Now, another big mistake I see is the lack of use for input handler methods. I'm going to write a few examples and show you what I mean by this.
This is our global input handler, you use this one to handle input that you want for any and all input manipulation. Pretty neat concept right? There are two methods one for a one shot call, and the second which actually handles the input so it can be called by other handlers.
The ones below are for handling the concept of room navigation. Same concept of the two methods, but notice in the RoomInputHandler method I call GlobalInputhandle. The nRoomIndex argument is used to update the current room, this handler does all this for you with the room information set up accordingly. The RoomInfo[] is a simple struct which holds the name and description. All the rest of this is the same as the global handler.
The coolest part about all this so far. That's majority of it. The rest is pretty much whatever you want it to be. I'm adding a few other parts to this as a series, but this covers 99% of what most students which consult me are missing.
Hope this helps.
P.S. I used screenshots so you can actually write the code yourself and not just copy it on purpose ;-)
Wednesday, June 6, 2012
State Of RuneEngine V2
RuneEngine V2 is currently somewhere near the 50,000 line mark in C# and C++/CLI code. All Visual Studio 2010 developed. Most of which is 2008 compliant which I intend to update in order to be 100% 2008 compliant. RuneEngine is developed against XNA 4.0 and .NET 4 runtimes. I want to make a few minor changes to allow XNA 3.1 compilation, but I may never do this unless at some point I am asked to do so. The C++ Native build is in a semi skeletal structure, but has no executable implementation at this time.
Recent Changes-
I have recently updated the assemblies and consolidated them to be more concise and promote stronger modularity. The new list of the core dlls is as follows:
- RuneEngine.dll
- RuneEngine.Content.dll
- RuneEngine.Components.dll
- RuneEngine.Components.Baseline.dll
- RuneEngine.Graphics.dll
- RuneEngine.IO.dll
- RuneEngine.Physics.dll
- RuneEngine.Scene.dll
- RuneEngine.Components.Sidescrolling
- RuneEngine.Components.RolePlaying
- RuneEngine.Components.Adventure
- RuneEngine.Components.Strategy
- RuneEngine.Components.FirstPerson
Friday, April 20, 2012
Designing RuneEngine V2
Interfaces and Polymorphism
One of the biggest concepts that have stuck hard in the new structure of the engine is strong use of Polymorphing topics and interfaces. This is extremely important for users who would plan to extend the engine and add objects without having to write crazy wrappers around my rendering and content systems. Almost every object in the engine implements an interface, and almost all of the internal systems use the interfaces and NOT the objects directly to handle core features. For example, all content reference objects are interface driven and apply specific rules that the rendering pipeline requires. So, the rendering pipeline only requires the interface and proper implementation. Therefore, this can be extended very easily so long as the interfaces are implemented correctly. The most recent IO systems are nearly 100% interface driven, and probably show the extensibility of RuneEngine at it’s peak. The physics system exposes no objects, only interfaces and attaches to physics engine wrappers, so to add a new custom engine is trivial(well as far as making it work with RuneEngine goes).
As you can see those are some major area’s and they are very simple to plug into the existing API. This makes my life especially easier, but other’s using the engine could gain the same benefit as these interfaces are not internal and can be used by anyone.
Key reasons for the high focus here are obviously for extensibility and generic behaviors. This benefits mostly programmers, but that high benefit could allow a team to do much more with RuneEngine than what I allow them to.
Internal Code Cleanup/Optimization
This is a huge reason I started restructuring the engine. My goals for what I wanted it to be changed a few times during the first structure so the internals were getting haggard and the calling conventions were inconsistent.
So what are the new guidelines and why? First a little history of what it kept shaping around originally. When I first started the engine it was designed to be built like C++, well I took that a little too seriously. So, I backed off that and went way the other direction for a while. The object oriented model has always been very important through development of this, but some pieces were being written poorly, and as the ideas changed the legacy code was not getting removed. This made the code base fairly hard to work in as there was a mix of all sorts of styles. Before I started the restructure I gained an even better handle over C++ development and stay well practiced with it building many prototypes first in C++. The C++ iteration was started for RuneEngine. This is when I saw how poorly they were going to correlate. Some parts would work fine while others would need full rewrites. Therefore, the engine began restructuring. I use the term restructuring because I have not rewritten much of the internal code, just optimized and sorted it better. Much of it has not changed aside from areas where the objects used were changed greatly.
Ok, so let’s focus more on what has happened internally now. Originally there were a lot of methods calling methods and deeper callstacks, well now unless completely necessary every method is completely self maintained and does not internally call upon another. I’ve made my method argument lists more appropriate for C++ porting. However, I have also added higher level overloads which do not look as much like C++. Naming conventions have been held true, and many fields are marked internal now. Using statements have been cleaned up(this can actually be a huge optimization). All of this has made the performance better and the cleanliness much greater.
Exposure of High Level and Low Level methods
Before I only really exposed high level methods to access features. Although, I did have internal methods to do much of the low level portion as well. The biggest change here is that the low-level methods are now public and cleaned up. This also gets back into extensibility of the engine. If I don’t expose these methods then users of the engine will still have to handle things the XNA way. My methods just make that process a little simpler, even the low level ones.
IO vs Content Pipeline
This is a big change more so than original design at all. Originally there was a high focus on the IO system to load files which were unique to RuneEngine. Well, to adhere better to XNA and what XNA developers are used to, I am extending the ContentPipeline for many proprietary formats. Of course the C++ iteration will need some major differences here, but it should be manageable. So, pretty much all Rune specific content types are extended in the pipeline. And therefore could be used without any feature in RuneEngine at all.
Compartmentalized Design
This has been the plan since day one. Each DLL has been designed to be completely self maintained and features are being better designed in this new structure to hold true that they can work without the rest of the engine. I do this by writing majority of the objects completely independent from the rest of the engine. I had made some mistakes in the original structure, primarily the content systems. The content was reliant on every other part there, and the Graphics wrappers I had built as well. Now they’re self maintained and as stated above can be loaded through the content pipeline and be used with normal XNA projects.
Platform Target considerations
This part is simple, I’ve focused towards XBOX360, because it has more restrictions than PC and it’s not a mobile device. Not to hark on mobile, but just because market studies show it as the better revenue stream doesn’t mean it’s my primary focus. I prefer to focus on maximum quality I’m capable for. I’m not going to downgrade the output by adhering to mobile. This is a personal stubbornness of mine and I admit that, but I am NOT ignoring mobile. Just I will build the engine focused against everything else and make a mobile build later. Adhering to 360 and REACH profiles are going to keep me closer to what mobile will expect, so I am genuinely not concerned.
Development Tools
There is a fairly large concern here as well, but none of this matters if the engine itself behind it is not backing it. So, I’ve rebuilt a lot of the editor and have a lot of plans for working new features into this side of the engine. There is also a strong feel for extensibility here.
That about wraps it all up, there is not much more to point out at this time. Of course there has been a lot of time spent some days determining what a method should be called, and where it should be located. I didn’t think any of that detail was that important ;-D. Anyways, until next time…
Friday, April 6, 2012
Project Organization and File Structure
I was just thinking on this and realized that I preach about
this to everyone, all my student, anyone I get into dialog with about
programming development. This is something
I’ve gotten better about over the years and have also seen how big of a problem
it can be not doing so. ORGANIZE YOUR
FILES!!!!! Make a bulletproof file
structure. I can’t stress that any more
than I am right now. If you do not get
your files organized in a way you can find things quickly, you will hurt
yourself later.
Now, I don’t believe I have taken the time to give some big
tips and tricks that have worked before for me on a regular basis, so I’m going
to put them up here now. When I create a
new project I generally spend about 2-3 hours putting it together BEFORE
writing a single line of code. You may
say “WOW that’s a lot of time for preparation,” but I say 2-3 hours on a
project that you’re going to spend more than a week on… that 2-3 hours is
nothing. And if you didn’t do it I
wouldn’t be far from promising it would take 2 weeks instead of 1.
So, what I start a new project what do I do? First of all first and foremost even before
starting VS. I create a master directory
for the project. Typically on the root C
drive of my PC at home, if I had a D partition it would probably be there. For example RuneEngine V2’s master directory
is located at “C:\RUNE2.” Now what goes
in the master directory? The solution
right? NO!!! I stress that the solution
is not created here because with the rest I’m going to cover creating backups
would be nearly impossible or an extremely painful process otherwise.
The next folder I create is a child folder of the Master
directory “Bin”. This is where ALL my
projects output goes. In C:\RUNE2\Bin I have these sub directories:
REACH
HiDef
XBOX360
Mobile
DOCS (Yes I actually build documentation, it would not be
inappropriate for this go to outside of the bin in the master directory if you
prefer)
Editor
EditorAPI
As you may see above, these are all the platform targets,
not debug and release like VS typically creates. This is entirely intentional; my
Debug/Release folders are contained in these.
And this is where my projects target their output. This is why we do NOT put the solution in the
Master directory. When we create the
projects and configure their target paths we do not have to redo this for any
backups we generate. Also, Source
control is easier to… well control this way.
So, where are the projects created? They’re created in Subdirectories of the
Master Directory. The current working
solution is contained in C:\RUNE2\RuneEngine_2D_MAIN, but there are 4 other
backups and iterations of the engine there as well as the initiation of the
Native code etc etc blah blah. The
Master Directory contains anything and everything related to the project in
this setup, and it isn’t burrowed in C:\Users\Me\Documents\Visual Studio
2010\Projects….. Yep, not my favorite place to put things.
A note on source control, IF YOU ARE NOT CAREFUL YOUR
PROJECT CAN BE CORRUPTED, hence why I have multiple backups at all times. Usually it only gets corrupted if you’re using
it incorrectly, but better safe than sorry with large projects.
A note about creation of code files in the solution explorer
and handling folders. In C# you’ve
probably noticed that it adds namespace when you add to the folder. And sometimes you don’t want that. Of course you can just delete it and fix it
that way, but my tip is to just always add files in the namespace you desire
and if you want to move the file somewhere else to be more organized, it’s a
simple drag operation.
I hope this is a good read for other developers out there,
everyone has their own styles of handling files and I’ve tried quite a few
variations and this is the way I plan to stick to for a while. Below is a pseudo copy of my file structure
in RuneEngine v2’s project directories:
C:\
RUNE2 – Master
Bin
REACH (Debug/Release)
HiDef (Debug/Release)
XBOX360 (Debug/Release)
Mobile (Debug/Release)
DOCS
Editor (Debug/Release)
EditorAPI (Debug/Release) – FYI I’m going to be
talking A LOT about this soon.
Lib
Includes (Lib and
includes are for the native build ignore them if you’re developing fully
managed)
RuneEngine_2D_MAIN
(There are
actually multiple solutions here which load different combinations of the
projects)
RuneEngine
RuneEngine.Graphics
RuneEngine.Content
RuneEngine.Physics
RuneEngine.ContentExtensions
RuneEngine.Math
RuneEngine.Scene
RuneEngine.Threading
RuneEngine.Components
RuneEngineOLD2
RuneEngineOLD1
RuneEngineBACKUP
RENativeDX
I wanted to make one last modification to this, though I suggest this methodology highly if it doesn't work for you don't do it. This ulimatley is a reminder of how important this is and a suggestion in what works for me. It's mostly about what you benefit from most. -Happy coding
Wednesday, April 4, 2012
DevConnections 2012 - Las Vegas
- Intellisense has greatly improved
- Types are now color coded
Aside from that, I really don't have a whole lot here.


