Removing cache from Gleed2D as ContentManager automatically does this

Adding cache
Adding XOR Shift random class
This commit is contained in:
Nathan Adams 2014-12-30 22:07:05 -06:00
parent 1a04355fde
commit 67ab74899f
13 changed files with 147 additions and 14 deletions

View File

@ -164,6 +164,7 @@
<Compile Include="Engine\AxiosBreakableGameObject.cs" /> <Compile Include="Engine\AxiosBreakableGameObject.cs" />
<Compile Include="Engine\ComplexAxiosGameObject.cs" /> <Compile Include="Engine\ComplexAxiosGameObject.cs" />
<Compile Include="Engine\Data\AxiosCSV.cs" /> <Compile Include="Engine\Data\AxiosCSV.cs" />
<Compile Include="Engine\Data\Cache.cs" />
<Compile Include="Engine\Data\DataEvents.cs" /> <Compile Include="Engine\Data\DataEvents.cs" />
<Compile Include="Engine\Data\AxiosDataTable.cs" /> <Compile Include="Engine\Data\AxiosDataTable.cs" />
<Compile Include="Engine\DrawableAxiosGameObject.cs" /> <Compile Include="Engine\DrawableAxiosGameObject.cs" />
@ -179,6 +180,7 @@
<Compile Include="Engine\File\AxiosIsolatedFile.cs" /> <Compile Include="Engine\File\AxiosIsolatedFile.cs" />
<Compile Include="Engine\File\AxiosRegularFile.cs" /> <Compile Include="Engine\File\AxiosRegularFile.cs" />
<Compile Include="Engine\File\AxiosTitleFile.cs" /> <Compile Include="Engine\File\AxiosTitleFile.cs" />
<Compile Include="Engine\GameServices.cs" />
<Compile Include="Engine\Gleed2D\Camera.cs" /> <Compile Include="Engine\Gleed2D\Camera.cs" />
<Compile Include="Engine\Gleed2D\CircleItem.cs" /> <Compile Include="Engine\Gleed2D\CircleItem.cs" />
<Compile Include="Engine\Gleed2D\CustomProperty.cs" /> <Compile Include="Engine\Gleed2D\CustomProperty.cs" />

View File

@ -213,9 +213,11 @@
<Compile Include="Dynamics\World.cs" /> <Compile Include="Dynamics\World.cs" />
<Compile Include="Dynamics\WorldCallbacks.cs" /> <Compile Include="Dynamics\WorldCallbacks.cs" />
<Compile Include="Engine\AxiosGameObject.cs" /> <Compile Include="Engine\AxiosGameObject.cs" />
<Compile Include="Engine\AxiosRandom.cs" />
<Compile Include="Engine\ComplexAxiosGameObject.cs" /> <Compile Include="Engine\ComplexAxiosGameObject.cs" />
<Compile Include="Engine\Data\AxiosCSV.cs" /> <Compile Include="Engine\Data\AxiosCSV.cs" />
<Compile Include="Engine\Data\AxiosDataTable.cs" /> <Compile Include="Engine\Data\AxiosDataTable.cs" />
<Compile Include="Engine\Data\Cache.cs" />
<Compile Include="Engine\Data\DataEvents.cs" /> <Compile Include="Engine\Data\DataEvents.cs" />
<Compile Include="Engine\DrawableAxiosGameObject.cs" /> <Compile Include="Engine\DrawableAxiosGameObject.cs" />
<Compile Include="Engine\DrawableBreakableAxiosGameObject.cs" /> <Compile Include="Engine\DrawableBreakableAxiosGameObject.cs" />
@ -230,6 +232,7 @@
<Compile Include="Engine\File\AxiosIsolatedFile.cs" /> <Compile Include="Engine\File\AxiosIsolatedFile.cs" />
<Compile Include="Engine\File\AxiosRegularFile.cs" /> <Compile Include="Engine\File\AxiosRegularFile.cs" />
<Compile Include="Engine\File\AxiosTitleFile.cs" /> <Compile Include="Engine\File\AxiosTitleFile.cs" />
<Compile Include="Engine\GameServices.cs" />
<Compile Include="Engine\Gleed2D\Item.cs" /> <Compile Include="Engine\Gleed2D\Item.cs" />
<Compile Include="Engine\Gleed2D\PathItem.cs" /> <Compile Include="Engine\Gleed2D\PathItem.cs" />
<Compile Include="Engine\Gleed2D\TextureItem.cs" /> <Compile Include="Engine\Gleed2D\TextureItem.cs" />

View File

@ -158,6 +158,7 @@
<Compile Include="Engine\ComplexAxiosGameObject.cs" /> <Compile Include="Engine\ComplexAxiosGameObject.cs" />
<Compile Include="Engine\Data\AxiosCSV.cs" /> <Compile Include="Engine\Data\AxiosCSV.cs" />
<Compile Include="Engine\Data\AxiosDataTable.cs" /> <Compile Include="Engine\Data\AxiosDataTable.cs" />
<Compile Include="Engine\Data\Cache.cs" />
<Compile Include="Engine\Data\DataEvents.cs" /> <Compile Include="Engine\Data\DataEvents.cs" />
<Compile Include="Engine\DrawableAxiosGameObject.cs" /> <Compile Include="Engine\DrawableAxiosGameObject.cs" />
<Compile Include="Engine\DrawableBreakableAxiosGameObject.cs" /> <Compile Include="Engine\DrawableBreakableAxiosGameObject.cs" />
@ -172,6 +173,7 @@
<Compile Include="Engine\File\AxiosIsolatedFile.cs" /> <Compile Include="Engine\File\AxiosIsolatedFile.cs" />
<Compile Include="Engine\File\AxiosRegularFile.cs" /> <Compile Include="Engine\File\AxiosRegularFile.cs" />
<Compile Include="Engine\File\AxiosTitleFile.cs" /> <Compile Include="Engine\File\AxiosTitleFile.cs" />
<Compile Include="Engine\GameServices.cs" />
<Compile Include="Engine\Gleed2D\Camera.cs" /> <Compile Include="Engine\Gleed2D\Camera.cs" />
<Compile Include="Engine\Gleed2D\CircleItem.cs" /> <Compile Include="Engine\Gleed2D\CircleItem.cs" />
<Compile Include="Engine\Gleed2D\CustomProperty.cs" /> <Compile Include="Engine\Gleed2D\CustomProperty.cs" />

View File

@ -131,6 +131,9 @@
* *
* 1.0.1.11 - * 1.0.1.11 -
* - Adding game services static class * - Adding game services static class
* - Removing cache from Gleed2D as ContentManager automatically does this
* - Adding cache
* - Adding XOR Shift random class
* *
*/ */
#endregion #endregion

View File

@ -78,8 +78,7 @@ namespace Axios.Engine
this._uiobjects = new List<AxiosUIObject>(); this._uiobjects = new List<AxiosUIObject>();
prevuiobj = null; prevuiobj = null;
prevuifocusobj = null; prevuifocusobj = null;
GameServices.AddService<GraphicsDevice>(this.ScreenManager.GraphicsDevice);
GameServices.AddService<ContentManager>(this.ScreenManager.Game.Content);
} }
public void LoadLevelFromStream(Stream s) public void LoadLevelFromStream(Stream s)
@ -494,8 +493,10 @@ namespace Axios.Engine
public override void Unload() public override void Unload()
{ {
//this.IsExiting = true;
//System.Diagnostics.Debugger.Break(); //System.Diagnostics.Debugger.Break();
base.Deactivate(); base.Deactivate();
ScreenState = GameStateManagement.ScreenState.TransitionOff;
AxiosLog.Instance.AddLine("Memory usage before cleanup: " + GC.GetTotalMemory(true).ToString(), LoggingFlag.DEBUG); AxiosLog.Instance.AddLine("Memory usage before cleanup: " + GC.GetTotalMemory(true).ToString(), LoggingFlag.DEBUG);
foreach (AxiosGameObject g in _gameObjects) foreach (AxiosGameObject g in _gameObjects)
g.UnloadContent(this); g.UnloadContent(this);
@ -523,6 +524,7 @@ namespace Axios.Engine
_console = null; _console = null;
} }
#endif #endif
} }
@ -539,7 +541,7 @@ namespace Axios.Engine
public virtual void LoadPathItem(PathItemProperties pathitem, Layer l) public virtual void LoadPathItem(PathItemProperties pathitem, Layer l)
{ {
PathItem p = new PathItem((PathItemProperties)pathitem); PathItem p = new PathItem((PathItemProperties)pathitem);
p.load(this, ref cache); p.load(this);
PathItems[pathitem.Name] = p; PathItems[pathitem.Name] = p;
} }
@ -551,7 +553,7 @@ namespace Axios.Engine
public virtual void LoadTextureItem(TextureItemProperties textureitem, Layer l) public virtual void LoadTextureItem(TextureItemProperties textureitem, Layer l)
{ {
TextureItem i = new TextureItem((TextureItemProperties)textureitem); TextureItem i = new TextureItem((TextureItemProperties)textureitem);
i.load(this, ref cache); i.load(this);
TextureItems[textureitem.Name] = i; TextureItems[textureitem.Name] = i;
} }

View File

@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Axios.Engine
{
// Implemenation of an XORShift
// http://en.wikipedia.org/wiki/Xorshift
// http://stackoverflow.com/questions/6275593/how-to-write-you-own-random-number-algorithm
public class AxiosRandom
{
private static int x;
private static int y;
private static int z;
private static int w;
private static int t = 0;
public void init(int x, int y, int z, int w)
{
AxiosRandom.x = x;
AxiosRandom.y = y;
AxiosRandom.z = z;
AxiosRandom.w = w;
}
public static void init()
{
AxiosRandom.x = generateVector();
AxiosRandom.y = generateVector();
AxiosRandom.z = generateVector();
AxiosRandom.w = generateVector();
}
public static int next()
{
t = x ^ (x << 11);
x = y; y = z; z = w;
return w = w ^ (w >> 19) ^ (t ^ (t >> 8));
}
private static int generateVector()
{
int[] x = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] val = new int[9];
for (int i = 0; i < 9; i++)
val[i] = x[GameServices.GetService<Random>().Next(x.Count() - 1)];
return int.Parse(String.Join("", val));
}
}
}

View File

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Axios.Engine.Data
{
// Q. What is the point of this?
// A. This is not to cache textures loaded by content manager
// but other data/content that isn't. Use cases include:
// - Any graphics generated during runtime (such as dialogs)
// - Any data that is loaded in during run time (such as maps)
// Content manager performs it's own caching so anything loaded by it
// or the Gameservice - then attempted to load again will not be loaded
// again but rather a reference to it will be returned
// ************************************************
// DANGER WILL ROBINSON DANGER
// ************************************************
// Only store stuff here that you want during the FULL lifecycle of your game
// The cache is never cleared - so a reference will exist for the objects you leave
// You MAY clear the cache by using the clear method or unset
//
// You probably don't want this
// There is no cache...
// This is not the cache you are looking for...
//
public class Cache : Singleton<Cache>
{
private Dictionary<string, object> _cache;
public Cache()
{
_cache = new Dictionary<string, object>();
}
public object get(string key)
{
return _cache[key];
}
public void set(string key, object obj)
{
_cache[key] = obj;
}
public void unset(string key)
{
_cache.Remove(key);
}
public void clear()
{
_cache = new Dictionary<string, object>();
}
}
}

View File

@ -5,7 +5,7 @@ namespace Axios.Engine
public static class GameServices public static class GameServices
{ {
private static GameServiceContainer container; private static GameServiceContainer container;
private static object lockobj; private static object lockobj = new object();
public static GameServiceContainer Instance public static GameServiceContainer Instance
{ {
get get

View File

@ -20,7 +20,7 @@ namespace Axios.Engine.Gleed2D
/// Called by Level.FromFile(filename) on each Item after the deserialization process. /// Called by Level.FromFile(filename) on each Item after the deserialization process.
/// Should be overriden and can be used to load anything needed by the Item (e.g. a texture). /// Should be overriden and can be used to load anything needed by the Item (e.g. a texture).
/// </summary> /// </summary>
public virtual void load(AxiosGameScreen gameScreen, ref Dictionary<string, Texture2D> cache) public virtual void load(AxiosGameScreen gameScreen)
{ {
} }

View File

@ -30,9 +30,9 @@ namespace Axios.Engine.Gleed2D
this._item = i; this._item = i;
} }
public override void load(AxiosGameScreen gameScreen, ref Dictionary<string, Texture2D> cache) public override void load(AxiosGameScreen gameScreen)
{ {
base.load(gameScreen, ref cache); base.load(gameScreen);
Vertices v = new Vertices(LayerItem.LocalPoints.Count); Vertices v = new Vertices(LayerItem.LocalPoints.Count);
foreach (Vector2 vec in LayerItem.LocalPoints) foreach (Vector2 vec in LayerItem.LocalPoints)

View File

@ -39,20 +39,20 @@ namespace Axios.Engine.Gleed2D
/// You must provide your own implementation. However, you can rely on all public fields being /// You must provide your own implementation. However, you can rely on all public fields being
/// filled by the level deserialization process. /// filled by the level deserialization process.
/// </summary> /// </summary>
public override void load(AxiosGameScreen gameScreen, ref Dictionary<string, Texture2D> cache) public override void load(AxiosGameScreen gameScreen)
{ {
base.load(gameScreen, ref cache); base.load(gameScreen);
//throw new NotImplementedException(); //throw new NotImplementedException();
//TODO: provide your own implementation of how a TextureItem loads its assets //TODO: provide your own implementation of how a TextureItem loads its assets
//for example: //for example:
//this.texture = Texture2D.FromFile(<GraphicsDevice>, texture_filename); //this.texture = Texture2D.FromFile(<GraphicsDevice>, texture_filename);
//or by using the Content Pipeline: //or by using the Content Pipeline:
if (!cache.ContainsKey(LayerItem.AssetName)) /*if (!cache.ContainsKey(LayerItem.AssetName))
{ {
cache[LayerItem.AssetName] = gameScreen.ScreenManager.Game.Content.Load<Texture2D>(LayerItem.AssetName); cache[LayerItem.AssetName] = gameScreen.ScreenManager.Game.Content.Load<Texture2D>(LayerItem.AssetName);
} }*/
this.texture = cache[LayerItem.AssetName]; this.texture = gameScreen.ScreenManager.Game.Content.Load<Texture2D>(LayerItem.AssetName);
//Visible = gameScreen.LoadTextureItem(this); //Visible = gameScreen.LoadTextureItem(this);
//this.texture = cm.Load<Texture2D>(asset_name); //this.texture = cm.Load<Texture2D>(asset_name);

View File

@ -98,7 +98,7 @@ namespace GameStateManagement
public override void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen) public override void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen)
{ {
if (!coveredByOtherScreen && !otherScreenHasFocus) if (!coveredByOtherScreen && !otherScreenHasFocus && ScreenState != GameStateManagement.ScreenState.TransitionOff)
{ {
// variable time step but never less then 30 Hz // variable time step but never less then 30 Hz
if (UseSecondStep) if (UseSecondStep)

View File

@ -19,6 +19,7 @@ using System.IO;
using System.IO.IsolatedStorage; using System.IO.IsolatedStorage;
using System.Xml.Linq; using System.Xml.Linq;
using FarseerPhysics.SamplesFramework; using FarseerPhysics.SamplesFramework;
using Axios.Engine;
#endregion #endregion
namespace GameStateManagement namespace GameStateManagement
@ -149,6 +150,18 @@ namespace GameStateManagement
spriteBatch = new SpriteBatch(GraphicsDevice); spriteBatch = new SpriteBatch(GraphicsDevice);
font = content.Load<SpriteFont>("menufont"); font = content.Load<SpriteFont>("menufont");
blankTexture = Game.Content.Load<Texture2D>("Materials/blank"); blankTexture = Game.Content.Load<Texture2D>("Materials/blank");
GameServices.AddService<GraphicsDevice>(this.Game.GraphicsDevice);
GameServices.AddService<ContentManager>(this.Game.Content);
// It is advised to use one instance of Random
// because Random is seeded with the current time
// initilizing random objects too quickly can cause
// the impression of generating the same value
// http://stackoverflow.com/questions/2727538/random-encounter-not-so-random
GameServices.AddService<Random>(new Random());
AxiosRandom.init();
input.LoadContent(); input.LoadContent();
// Tell each of the screens to load their content. // Tell each of the screens to load their content.
foreach (GameScreen screen in screens) foreach (GameScreen screen in screens)