|
Another problem is that using the VCS is inherently a manual process. When a designer is working on a level, she'll check it out, perform her work, and eventually check it back in. During that time, no one else can actually work on it. But the designer who has the level checked out is unlikely to be working on it every minute she has it checked out.
There might be long periods of time when she's working on something related. If the designer has to keep track of all the pieces of the level she might want to edit, then she might be tempted to check out large chunks, just to make things easier. In other words, designers will start checking out sections they are not in fact editing.
If instead the check-in and check-out procedures are handled automatically, then in theory you could set up your tools so that as soon as the level designer started to edit a particular piece of the level, then that section would be checked out from the VCS; and as soon as the designer stops editing (for example, the file is saved or successfully viewed in the game), then that piece is checked in.
Various problems obviously arise from using this automated method. Most notably, you're going to end up with people checking in things that are broken, so perhaps it's better to still rely on a manual commit at some point.
Still, checking out sections automatically can work well if the level is fine grained enough that conflicts are minimized. The level designer need not specifically be aware of the parts of the level that he has checked out -- simply that he's made a set of changes and needs to check them in. The tools will keep track of what has been changed, allowing him to simply check in everything with a single click.
The Ideal Process
In designing any toolset, it's useful to imagine the most desirable possible end result, regardless of how practical it seems. Such blue-sky designing can uncover possibilities that might not be considered with a more traditional incremental approach to adding features to an existing tool or process.
With our level-editing problem, we have a two sided problem: edit conflicts and edit bottlenecks. Fixing one problem can mean making the other problem worse, so we end up simply balancing them as best as possible, accepting the inevitable manual resolutions and underutilized resources that come from this.
But in an ideal world, there would be neither conflicts nor bottlenecks. Anyone would be able to edit in any area of the game at any time; nobody would have to wait to start working, and all changes would be merged automatically. In addition, all changes would be visible immediately in the game as they're made, with no delay and no "exporting" of files.
Sure, that would be great, but can we get there? If we can't, then how far can we get in that direction?
Second Life
In some respects, the online virtual world Second Life is already there. Players in the game exist in a large continuous world, which they can edit in real time.
Multiple people can edit in the same area of the world at the same time, and their changes are visible instantly, both to themselves and to others.
They can edit 3D models and scripts simultaneously, editing, testing, and playing all at the same time in a truly collaborative editing environment.
That does sound somewhat like our ideal, but if you've ever edited something in Second Life, you'll see it's not quite perfect. The editing process is based on you editing objects that exist in a remote database. But working over the internet introduces some annoying delays. The tools themselves are rather primitive, which is to be expected.
But the most glaring omission from a game developer's perspective is the lack of version control. When you edit something, that's it. You've edited it. No rolling back to the version from yesterday (or five minutes ago) if you accidentally delete half your script or mess up your UV coordinates.
|
Building a real-time collaborative game asset editor will take time, especially if you consider the computing, storage, and bandwidth problems that would be encountered in the process. In the meantime, it would be more practical to reduce the amount of edit conflicts by reducing the dependencies and increasing the orthogonality of modules (as fine grained module division is usually not enough), and by improving the communication between team members.
When you think about it, VCSs shouldn't take the blame for most of the problems in version control (unless, of course, we're talking about VSS :P ).
Consider two *entwined* editing sessions, then ask yourself how you are going to "undo" some changes. Do you undo your own edits? The other guy's? The other guy's that happen to touch the objects you touched?
I'm betting these hard questions would result in the same solutions we have today. Keep out of my backyard.
I understand that in Hero, the recommendation is to put up yellow police-tape around the area you are working in so these collaborative-conflicts don't happen.
Thanks for the thoughtful and balanced analysis of this problem. I'm trying to keep an open mind about it, but there is a lot of disagreement about where it lands on the usefullness scale. And what size team it makes sense for, what genre of game...
@Eric Slick and others, The article was actually written for Game Developer a few years ago, this is a reprint, so HeroEngine was not so well known back then. But it does sound just like what I was suggesting.
Different granularity comes with tradeoffs, as the article describes; with low granularity, conflicts are hard(people problem), and with high granularity, scalability is hard(computer problem). Note that DVCS mostly arises of the "people problem," and horizontal-scaling, non-relational databases arise from the "computer problem." Most of the obvious ground seems to have been covered by a VCS or database system in some form, so unless there's a radical improvement in our concepts, probably the best working practice is to go for the maximum level of granularity and then work out ways to optimize it, given that computers are cheaper than people.
I politely disagree. On the last page, you stress that "We are in the latest version. We don't need to check things in or out, as we simply start editing them, and they get locked."
That is in my eyes a very simple source control paradigm. Subversion-like systems perform better than that, and the concepts behind distributed systems such as Git are even more flexible.
Granted, those systems lend themselves better to code control. Merging changes to binary data is all but impossible in most cases, so in game development, the criteria are mostly different from many other software projects.