Also complex features are consequently implemented in a modular way, without compromising the flexibility. New complex, cutting edge features can be added as new components. By this we are able to provide a lasting platform, which evolves with time.
Features are consequently split into independent components. This makes it possible to use, modify or extend features without needing detailed low-level knowledge about all internal details. You can work with the high-end features on a high abstraction level, you can step deeper into a particular component as needed and wanted, and you can add new specialized and optimized components. Our customers, not we, take full advantage of Shark 3D.
|
For example, one object implementation may use the standard mechanism for delayed evaluation, while another object implementation may update its state each frame every time.
|
The Shark 3D component system consists of a sophisticated system of components, interfaces, and messages. The power of the system stems from a well-designed architecture, including all details like choosing the right component interfaces, components, commands, and event flows.
The Shark 3D components can be assembled and configurated without programming. This both includes high-level logic control over network and multiuser management down to shaders and shader components.
The developers can take full advantage of Shark 3D not only on C++-level, but also on a high abstraction level, enhancing productivity to hitherto unknown levels.
The component configuration system includes both object properties and command flow between components.
A lot of time was spent for development of this framework, because it turned out that in the long run a good component design can simplify development a lot, especially if Shark 3D is used for more than one project in parallel.
For example, when including an animation object into a character it can be configured which part of the character it controls. Other important component parameters are command-related parameters. They can be configured to send commands to other components. In this design, configuration resources play an important role besides the usual resources like meshes, animations, textures, sounds etc.
This configuration technique provides a development level higher and easier to use than a scripting level. In practice, it is an important advantage that there is no need to use C++ or a script language for each simple object property. First, this saves time for developers. But it also opens the door for defining new object behaviour for non-programmers.
For example, a character in a world can be combined out of some standard components like low-level walking collision detection, low-animation components, command dispatchers, and standard character scripts, together with character-specific components like special Perch™ scripts. The construction of the particular character can be done completely by configuration. No C++ or script code is needed if all necessary components are already available. And if additional components are needed for the character, only these components need to be implemented, without having to modify other character code.
Component composition improves the re-usability of code very much, especially since the components are universal and not linked to a particular code environment.
All this can be done purely on configuration level, without any scripting or C++ development.
For example, in case of a multiplayer game, each time a new player joins the game, a new player composition object can be created using a factory for this object tree.
So all in all, objects are not only changing their states, but also the object structure, number of objects, and relationships are dynamic.
This is achieved by a universal method invocation technique, which is implemented by using the usual technique of virtual functions. This guarantees easiness and efficiency. The crucial point is a good decoupling of components, a sophisticated design of interfaces, standard commands, and standard methods.
The mechanism how components interact by sending commands can be of course configurated on the component configuration level.
This includes for example that the component configuration technique is also used to define the structure and functionality of a client based on standard components. This includes viewport definitions, state image definitions, and the interaction of all these components. Also the server is built of several components. This includes client connection mechanisms and level management.
For example, if only one level runs at the same time, or if several levels run on the same server and the players can switch between them, it is only a matter of configuration of the corresponding standard components, without any need of scripting or C++ code.
Game application features which can be completely implemented using only configuration without any line of script code or C++ code include for example:
Thus, Shark 3D does not use special universal techniques only for special applications like content within a level, but everywhere. This opens up huge flexibility basically everywhere in Shark 3D.
As consequence, a Shark 3D executable itself is only a very simple loader loading components and instantiating the first component. The rest is done by interaction of all the components.
One sample of the flexibility of the component framework of Shark 3D are displays, displaying for example health points, menus or inventories. From the technical point of view, in the Shark 3D framework, a display is simply an additional 3d state and a corresponding viewport. It uses exactly the same techniques as the main 3d world, but has only some differences on configuration level. For example, in contrast to the main 3d world, a display typically is configured to be managed completely on client-side and to use a parallel projection perspective.
Furthermore, every 3d state, for example a display, can use all features used for the main 3d world. This includes all 3d object management features, TrueType font rendering, all animation techniques, switching objects, and object click features. In the same way as in the main world, you can use all advantages of the component system including scripting, for example to create an advanced inventory system at scripting level.
This is a sample for the flexibility of the component framework, demonstrating how features which at the first moment look very different (like for example the main 3d world and a display) can use the same technologies, and differ only by component configuration and some scripts.
For example, you can log into the SAP of Shark 3D via TCP by simply using a TELNET client. Using the SAP shell, you can interactively access the component objects by sending messages to it and retrieve their answers. For example, you can activate animations or change animation parameters by simply typing the appropriate command into the telnet window. This can the done without preparing the lift component in any special way. The messages you can send using the SAP are the same messages as used internally by Shark 3D when one component communicates with another component. In other words, SAP allows you to access the internal components of Shark 3D at runtime.
This feature is very useful for experimenting and debugging. You may inspect and modify the current state of your dynamic components interactively at runtime.
You can also easily write applications which control Shark 3D using the SAP. The client can run on the same or on a different computer as Shark 3D. For example, you also can easily write custom clients providing a graphical interface for controlling Shark 3D.
Serialization can be also implemented for existing external classes which were not prepared for serialization.
In this way, a proprietary application using Shark 3D runtime modules automatically supports DRU. This includes the standard Shark 3D player as special case.
Due to the design of Shark 3D, proprietary code often automatically supports DRU without any additional work at all. For example, a custom shader module automatically supports DRU without having to take special care of.
The simple format of component description files makes it very easy to generate such files by scripts or tools. This smoothly works together with Live editing the running console and PC game. No involved C++ tools or C++ components are necessary to customize your development environment in this way.
For example, it is straight forward to write a simple 3ds max™ script which allows to edit game-specific properties of 3d objects, and write out component description files. Using Live editing the running console and PC game, you can view the changes in Shark 3D without having to restart Shark 3D.
Usual C++ development contains several risks, causing hard-to-find bugs like illegal pointers and memory leaks. These bugs are particularly dangerous, since they usually don't cause a simple malfunction, but cause instable software. Furthermore, such kind of bugs are usually hard to find.
At some places, such kind of risky C++ code is necessary for performance reasons, needing very special care during development. But such kind of software development is not suited to make complex systems really stable and reliable.
Fortunately, the power of C++ allows to build more secure and more reliable systems upon low-level C++. But even typical modern software projects using C++ use these possibilities only partially.
Shark 3D thoroughly uses several modern techniques to avoid hidden bugs and offer stable software. These techniques are essential to make complex systems with many heterogeneous object relations and references stable and reliable.
To really take advantage, these software techniques are used not somewhere at some places, but thoroughly within Shark 3D.
C++ exceptions are used thoroughly for critical errors. This includes using thoroughly exception save code. This technique allows for robust behaviour of the system in local or global error conditions.