170 likes | 233 Views
SOURCE 2006. Game Programming Optimization. Presentation by Luke Arntson ArntsonL@cwu.edu. Optimization Research. How important is optimization in games?
E N D
SOURCE 2006 Game Programming Optimization Presentation by Luke Arntson ArntsonL@cwu.edu
Optimization Research How important is optimization in games? Optimization is the most essential part of coding when it comes to game development. Coders must always take into consideration the optimization of their solutions to ensure full-speed games. What types of optimization will we cover? There are many ways to properly optimize programs, including games. In this presentation, we will cover many ways of solving the same problems using optimization as key. The beauty of programming is the ability to be creative with the solutions, and finding new ways to approach old problems.
What Games Are We Going To Cover? • Tetris – the classic puzzle block game • Bullet Dodger – a vertical space shooter • Death Bomberman – a clone of the original Bomberman
Creating and Optimizing Tetris • First, start with the layout The most prevalent type of layout for the Tetris piece is a 4x4 array. This array is used to tell the game where the Tetris blocks will be. By simplifying the Tetris piece itself, we can simplify the problem. I have implemented a system using the Tetris block coordinates in the 4x4 array, rather than the array itself. • Next, let us look at rotations So now that we have determined the Tetris pieces can be created with coordinates, let us observe how we can apply rotations to these pieces.
Layout of Tetris Pieces With permission of Phil Hassey, code from FTetris philhassey – FTetris @ http://www.imitationpickles.org/ftetris/ 1. Box shape 2. Z shape 3. T shape my Tetris example Note: Numbers represent distance from top left corner Numbers are also in order: Left, Top, Right, and Bottom 1. Box shape 1. [(0,1), (0,0), (1,0), (1,1)] 2. Z shape 2. [(0,0), (1,0), (2,1), (1,1)] 3. T shape 3. [(0,0), (1,0), (2,0), (1,1)] See how much code was saved? Not only has this decreased the code amount significantly, but has also lead a path of optimization. 1. [(0,0,0,0), (0,1,1,0), (0,1,1,0), (0,0,0,0),] 2. [(0,0,0,0), (1,1,0,0), (0,1,1,0), (0,0,0,0),] 3.[(0,0,0,0), (1,1,1,0), (0,1,0,0), (0,0,0,0),]
X 0 1 2 3 Y 0 1 2 3 [(0,0,0,0), (1,1,1,0), (0,1,0,0), (0,0,0,0),] Visual Example Of Phil Hassey’s Code • Let us pretend we are building a Tetris piece, and the piece is made of four blocks Here is a visual representation of how the 4x4 array is being drawn in Fractal Tetris by Phil Hassey. • Each block is represented as a 1 or a 0 in the 4x4 array • We can now observe the array and watch how the 1s and 0s fill the grid
X 0 1 2 3 Y 0 1 2 3 (0,0) (1,0) (2,0) (1,1) Visual Example Of Coordinates in Tetris • Let us pretend we are building a Tetris piece, and the piece is made of four blocks Let use now examine the code given for coordinates of the piece, rather than a 4x4 array. • Each block has (x,y) coordinates on a 4x4 grid • We can now match the coordinates given with the code: [(0,0), (1,0), (2,0), (1,1)]
How Do We Represent Rotations? • First, what is a set of rotations? A set of rotations can be defined as a list of pieces. So using (X,Y) coordinates, we can define the following: Z Piece 1st.(0,0), (1,0), (2,1), (1,1) 2nd.(0,1), (1,0), (1,1), (0,2) T Shape Piece 1st.(0,0), (1,0), (2,0), (1,1) 2nd.(0,1), (1,0), (1,1), (1,2) 3rd.(0,1), (1,0), (2,1), (1,1) 4th.(0,1), (0,0), (1,1), (0,2) 7 Shape Piece 1st.(0,0), (1,0), (1,1), (1,2) 2nd.(0,1), (2,0), (2,1), (1,1) 3rd.(0,1), (0,0), (1,2), (0,2) 4th.(0,0), (1,0), (2,0), (0,1)
Optimizing The Rotation • Now that we know our rotation, lets look at how we can optimize Notice that different pieces have a different number of rotations. For example, the large block shape only has one rotation, and the Z shape has two rotations, as where the T shape has four rotations. Now we can break these pieces into sub-groups based on the number of rotations. • Break our shapes into sub-groups, and apply rotation After each sub-group is found, rotation is simple. In high level code, if the shape is in the current state, increment or decrement depending on which function is called. The number of states to rotate is determined by the sub-group given.
Bullet Dodger: How To Optimize All Those Bullets? • Code must be simple yet effective For games such as Bullet Dodger, the speed of the frames are vital. If the game had been written on a console such as the Gameboy Advance, limitations with the number of cycles would always be a factor of programming. • Collision checking only potentials It would be pointless to check every single bullet to every single enemy or player unless there was a potential of harm. By using a grid-collision system, collision checking can be brought down significantly while still maintaining a solid collision checking system.
Simple Code With Effective Results • Bullet patterns in commercial games All space shooting games, old and new, rely on the concept of bullet patterns. In an older game such as Space Invaders, bullets simply flew down in a straight line towards the player. Later games such as Gradius used simple angle calculations to shoot bullets at the player. • Moving the bullets in a linear path Applying simple math skills, it is easy to find the calculation for bullets. The simplest way to sum this up is by imagining there is a velocity vector to each bullet. The vector consists of an angle, and a vector length. By using the following code every frame, bullets can achieve a smooth travel across the playing field: Bullet X Coordinate += cos(vector.angle) * vector.length Bullet Y Coordinate += sin(vector.angle) * vector.length This simple calculation is used in Bullet Dodger to allow for a very nice looking effect not only for the bullets fired, but also for the simple particle engine used when there is a collision.
Simple Yet Effective Bullet Patterns • Applying the unit circle to a bullet spread Currently using Pi/2 + (-Pi/8 < x < Pi/8)
Collision Detection Using Grid-collision • Let’s split our screen into separate grid sections. Notice how the player ship and enemies are only in a few boxes, not ALL boxes. This is the idea we will implement to our grid-collision
Observing Where Objects Can Collide In Our Grid • Areas of collision Now observe the red areas, see that the only places these objects can be hit is within these red sections. So ONLY do tedious collision detection in these boxes areas, saving a vast amount of processor time.
Death Bomberman: World Manager and Optimization • Managing the world is difficult However, eliminating the need for objects to be self-sufficient allows for much cleaner code. If an object tells the world its desired movement or action, the world can then dictate whether or not the object is allowed to do so. This can be applied to many different games, and has been applied to many coding schemes used by major companies. • How world management optimizes games By eliminating unnecessary checks such as wall-collision, game code can run at full speed while the world takes care of all special cases. For example: when bombs explode, they create a fire burst. Instead of each fire burst checking for an object to burn, the world manager tells the object to burn, and the fire burst to die out.
Applying to Death Bomberman • Utilize the manager to make the world function By applying the world manager effectively, each object in the world will behave accordingly. Bombs will be placed correctly, and maps will know which items to destroy and which to leave intact.
Questions? For more information on this presentation, feel free to visit my website at: http://source.eyeforcode.com or email me at ArntsonL@cwu.edu