/// <summary> /// LoadContent will be called once per game and is the place to load\\ /// all of your content. /// </summary> protected override void LoadContent() { GraphicsDevice.PresentationParameters.MultiSampleCount = 8; // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); Standard = Content.Load <Effect>("Standard"); Half = Content.Load <Effect>("Half"); Console.WriteLine("LOADING TEXTURES"); var sw = new Stopwatch(); { sw.Start(); NewModelRocks = ModelLoader.LoadStandardModel(GraphicsDevice, "Assets/Models/rocks.smod"); NewModelPipe = ModelLoader.LoadStandardModel(GraphicsDevice, "Assets/Models/pipe.smod"); sw.Stop(); Console.WriteLine("Time taken to load model via file:" + sw.ElapsedMilliseconds + "ms"); sw.Reset(); } { // This way appears slightly faster (~10%) but I don't think it's worth the trade off of loading the entire chunk into memory var jobScheduler = new JobScheduler(); var chunkReader = new AssetChunkReader(); var chunkFileName = "Assets/Chunk/textures.chunk"; chunkReader.AssociateChunk(chunkFileName); sw.Start(); var fs1 = new FileStream(chunkFileName, FileMode.Open, FileAccess.Read, FileShare.Read); var fs2 = new FileStream(chunkFileName, FileMode.Open, FileAccess.Read, FileShare.Read); var fs3 = new FileStream(chunkFileName, FileMode.Open, FileAccess.Read, FileShare.Read); var fs4 = new FileStream(chunkFileName, FileMode.Open, FileAccess.Read, FileShare.Read); var fs5 = new FileStream(chunkFileName, FileMode.Open, FileAccess.Read, FileShare.Read); var fs6 = new FileStream(chunkFileName, FileMode.Open, FileAccess.Read, FileShare.Read); var fs7 = new FileStream(chunkFileName, FileMode.Open, FileAccess.Read, FileShare.Read); var fs8 = new FileStream(chunkFileName, FileMode.Open, FileAccess.Read, FileShare.Read); jobScheduler.QueueJob("Assets/Textures/tex16/walls.tex16", () => { WallTexture = chunkReader.LoadTextureFromStream(GraphicsDevice, "Assets/Textures/tex16/walls.tex16", fs1); }); jobScheduler.QueueJob("Assets/Textures/tex16/rocks.tex16", () => { RockTexture = chunkReader.LoadTextureFromStream(GraphicsDevice, "Assets/Textures/tex16/rocks.tex16", fs2); }); jobScheduler.QueueJob("Assets/Textures/tex16/doorbars.tex16", () => { DoorBarsTexture = chunkReader.LoadTextureFromStream(GraphicsDevice, "Assets/Textures/tex16/doorbars.tex16", fs3); }); jobScheduler.QueueJob("Assets/Textures/tex16/floor.tex16", () => { FloorTexture = chunkReader.LoadTextureFromStream(GraphicsDevice, "Assets/Textures/tex16/floor.tex16", fs4); }); jobScheduler.QueueJob("Assets/Textures/tex16/goat.tex16", () => { GoatTexture = chunkReader.LoadTextureFromStream(GraphicsDevice, "Assets/Textures/tex16/goat.tex16", fs5); }); jobScheduler.QueueJob("Assets/Textures/tex16/ice.tex16", () => { IceTexture = chunkReader.LoadTextureFromStream(GraphicsDevice, "Assets/Textures/tex16/ice.tex16", fs6); }); jobScheduler.QueueJob("Assets/Textures/tex16/torch.tex16", () => { TorchTexture = chunkReader.LoadTextureFromStream(GraphicsDevice, "Assets/Textures/tex16/torch.tex16", fs7); }); jobScheduler.QueueJob("Assets/Textures/tex16/water.tex16", () => { WaterTexture = chunkReader.LoadTextureFromStream(GraphicsDevice, "Assets/Textures/tex16/water.tex16", fs8); }); jobScheduler.ExecuteAll(() => { fs1.Close(); fs2.Close(); fs3.Close(); fs4.Close(); fs5.Close(); fs6.Close(); fs7.Close(); fs8.Close(); sw.Stop(); Console.WriteLine("Time taken to load tex16 (multithreaded) from Chunk file: " + sw.ElapsedMilliseconds + "ms"); sw.Reset(); }); } }