Оболочка c# SDL2-быстрее просмотра метод/Sprite рендеринга?


Я использую этот SDL2 обертку для C#, но так как это не реализовать такие классы, как спрайты, видах или растровые изображения, я пытался сделать их сам. Все хорошо и работает как я хочу, но рендерер не так быстро.

Фактический рендеринг кода в вопрос выглядит следующим образом:

public void Update()
{
    SDL_RenderClear(this.SDL_Renderer);
    this.Viewports.Sort(delegate (Viewport vp1, Viewport vp2) { return vp1.Z.CompareTo(vp2.Z); });
    for (int i = 0; i < Viewports.Count; i++)
    {
        Viewport vp = Viewports[i];
        if (vp.Disposed)
        {
            this.Viewports.RemoveAt(i);
        }
        else if (vp.Visible && vp.Sprites.Count > 0)
        {
            SDL_Rect ViewportRect = new SDL_Rect();
            SDL_RenderGetViewport(this.SDL_Renderer, out ViewportRect);
            ViewportRect.x = vp.X;
            ViewportRect.y = vp.Y;
            if (vp.Width == -1) vp.Width = ViewportRect.w;
            if (vp.Height == -1) vp.Height = ViewportRect.h;
            ViewportRect.w = vp.Width;
            ViewportRect.h = vp.Height;
            SDL_RenderSetViewport(this.SDL_Renderer, ref ViewportRect);
            vp.Sprites.Sort(delegate (Sprite s1, Sprite s2) { return s1.Z.CompareTo(s2.Z); });
            for (int j = 0; j < vp.Sprites.Count; j++)
            {
                Sprite s = vp.Sprites[j];
                if (s.Disposed)
                {
                    vp.Sprites.RemoveAt(j);
                }
                else if (s.Visible && s.Bitmap != null)
                {
                    IntPtr Texture = SDL_CreateTextureFromSurface(this.SDL_Renderer, s.Bitmap.Surface);

                    SDL_Rect Src;
                    SDL_Rect Dest;
                    if (s.SrcRect == null)
                    {
                        Src = new SDL_Rect();
                        Src.w = s.Bitmap.SurfaceObject.w;
                        Src.h = s.Bitmap.SurfaceObject.h;
                    }
                    else
                    {
                        Src = s.SrcRect.SDL_Rect;
                    }
                    Dest = new SDL_Rect();
                    Dest.x = s.X;
                    Dest.y = s.Y;
                    Dest.w = (int) Math.Round(s.Bitmap.Width * s.Zoom_X);
                    Dest.h = (int) Math.Round(s.Bitmap.Height * s.Zoom_Y);

                    SDL_RenderCopy(this.SDL_Renderer, Texture, ref Src, ref Dest);
                    SDL_DestroyTexture(Texture);
                }
            }
        }
    }
    SDL_RenderPresent(this.SDL_Renderer);
}

Это в настоящее время называется каждый тик в петлю.

Есть ли способ я могу улучшить этот способ рендеринга растровых изображений на экране, по сути?

Более подробную информацию о классах:

Просмотра в основном просто набор спрайтов, а также некоторые свойства (Х, У, Z, ширина, высота, видно, утилизировать) и ссылку на Renderer объект. Спрайт так же. Фактические данные изображения хранятся в Bitmap Как SDL_Surface. В IntPtr что относится к поверхности сама Bitmap#Surface. Bitmap#SurfaceObject фактический SDL_Surface объект, полученный с помощью Marshal.PtrToStructure<SDL_Surface>(Surface).

Я думаю, что это должно быть достаточно информации, но я буду включать мой код растрового изображения, а также:

public class Bitmap
{
    public IntPtr Surface;
    public SDL_Surface SurfaceObject;
    public int Width { get; set; } = 0;
    public int Height { get; set; } = 0;
    public bool Disposed { get; set; } = false;
    public Renderer Renderer { get; set; }

    public Bitmap(Renderer Renderer, string Filename)
    {
        this.Renderer = Renderer;
        this.Surface = SDL2.SDL_image.IMG_Load(Filename);
        this.SurfaceObject = Marshal.PtrToStructure<SDL_Surface>(this.Surface);
        this.Width = SurfaceObject.w;
        this.Height = SurfaceObject.h;
    }

    public Bitmap(Renderer Renderer, int Width, int Height)
    {
        this.Renderer = Renderer;
        this.Surface = SDL_CreateRGBSurface(0, Width, Height, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
        this.SurfaceObject = Marshal.PtrToStructure<SDL_Surface>(this.Surface);
        this.Width = Width;
        this.Height = Height;
    }

    public Bitmap(Renderer Renderer, Size Size)
    {
        this.Renderer = Renderer;
        this.Surface = SDL_CreateRGBSurface(0, Size.Width, Size.Height, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
        this.SurfaceObject = Marshal.PtrToStructure<SDL_Surface>(this.Surface);
        this.Width = Size.Width;
        this.Height = Size.Height;
    }

    public void Dispose()
    {
        SDL_FreeSurface(this.Surface);
        this.Disposed = true;
    }
}

В SLD_Renderer сам создается с помощью SDL_CreateRenderer(this.SDL_Window, -1, SDL_RendererFlags.SDL_RENDERER_TARGETTEXTURE)кстати.

Почему я спросил Это потому, что я собираюсь писать интерфейс весь двигатель с этим, и я хочу знать, если это достаточно или не надежный.



146
3
задан 20 февраля 2018 в 08:02 Источник Поделиться
Комментарии