Пример #1
0
        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);
        }
Пример #2
0
        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");
        }