public ScreenBuffer CreateScreenBuffer(BufferEnum id, Vector2i size) { var bufferFound = ScreenBuffers.TryGetValue(id, out ScreenBuffer buffer); if (!bufferFound || size.Area() * 4 != buffer.Data?.Length) { // different size if (bufferFound && buffer.Allocated()) { // free old buffer SDL2.SDL.SDL_FreeSurface(buffer.SdlSurfacePtr); Marshal.FreeHGlobal(buffer.UnmanagedPtr); } // create new buffer buffer = new ScreenBuffer { Data = new byte[size.Area() * 4] }; buffer.UnmanagedPtr = Marshal.AllocHGlobal(buffer.Data.Length); buffer.SdlSurfacePtr = SDL2.SDL.SDL_CreateRGBSurfaceFrom(buffer.UnmanagedPtr, size.X, size.Y, 32, 4 * size.X, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); if (!bufferFound) { ScreenBuffers.Add(id, buffer); } else { ScreenBuffers[id] = buffer; } Log.Add($"Renderer.ScreenBuffer({ id }, { size })"); } return(buffer); }
protected override void Init() { var n = 100000000; double result = 0; var start = Program.Elapsed(); for (var i = 0; i < n; i++) { var v = new Vector2i(i, i); result += v.Area(); } Log.Add($"AllocTest#new({ n }): { result } { (Program.Elapsed() - start):0.00}ms"); result = 0; start = Program.Elapsed(); for (var i = 0; i < n; i++) { var v = Vector2i.Zero; v.X = i; v.Y = i; result += v.Area(); } Log.Add($"AllocTest#zero+set({ n }): { result } { (Program.Elapsed() - start):0.00}ms"); result = 0; start = Program.Elapsed(); for (var i = 0; i < n; i++) { var v = default(Vector2i); v.X = i; v.Y = i; result += v.Area(); } Log.Add($"AllocTest#default({ n }): { result } { (Program.Elapsed() - start):0.00}ms"); result = 0; start = Program.Elapsed(); for (var i = 0; i < n; i++) { Vector2i v; v.X = i; v.Y = i; result += v.Area(); } Log.Add($"AllocTest#classic({ n }): { result } { (Program.Elapsed() - start):0.00}ms"); result = 0; start = Program.Elapsed(); for (var i = 0; i < n; i++) { var v = default(Vector2i); v.Set(i, i); result += v.Area(); } Log.Add($"AllocTest#default+Set()({ n }): { result } { (Program.Elapsed() - start):0.00}ms"); result = 0; var v2 = Vector2i.Zero; start = Program.Elapsed(); for (var i = 0; i < n; i++) { v2.X = i; v2.Y = i; result += v2.Area(); } Log.Add($"AllocTest#reuse({ n }): { result } { (Program.Elapsed() - start):0.00}ms"); result = 0; start = Program.Elapsed(); Parallel.For(0, n, (i) => { var v = new Vector2i(i, i); result += v.Area(); }); Log.Add($"AllocTest#new+parallel({ n }): { result } { (Program.Elapsed() - start):0.00}ms"); }