Сетка прокрутки плитки с SlimDX Direct2D - PullRequest
0 голосов
/ 21 декабря 2018

Я пишу плитку 2D сверху вниз и хочу, чтобы плитки прокручивались на экране, когда игрок двигается.Из соображений производительности я хотел бы «сместить» изображение с предыдущего кадра и рисовать только отдельные плитки для новых областей для этого кадра.

В данный момент игра перерисовывает все плитки.(много плиток, то есть полноэкранный режим цветных блоков 10px * 10px) в каждом кадре, который не дает удовлетворительных кадров.Чтобы избежать этого, я планировал «сохранить» каждый кадр (например, в растровом изображении) после того, как он был нарисован, а затем повторно вставить его в следующий кадр с учетом того, как игрок переместился, однако я не нашел способасделайте «экономию» с SlimDX.

Мой текущий подход, который кажется более обнадеживающим, состоит в том, чтобы иметь 2 Direct2D.BitmapRenderTarget с (созданных с CreateCompatibleRenderTarget() на цели рендеринга окна), которые переключают роли в каждом кадре между «текущими» и «предыдущими» целями.,Изображение из изображения «предыдущей» цели будет нарисовано на «текущей» цели, а затем новые плитки будут отображены на «текущей» цели, а затем «текущая» цель будет отображена в окне.Проблема, с которой я сталкиваюсь сейчас, заключается в том, что рисование «предыдущего» изображения на «текущей» цели вызывает исключение Direct2DException, я полагаю, из-за того, что оно было создано из оконной цели и поэтому не совместимо с другим BitmapRenderTarget.

Это код для метода, описанного выше, с использованием 2 BitmapRenderTargets:

public void draw(RenderTarget target) { //target is a WindowRenderTarget

    BitmapRenderTarget currentBuffer;
    BitmapRenderTarget previousBuffer;

    int[] distance; //the distance the player has moved [0]=x, [1]=y            
    previousBuffer.BeginDraw();         
        if(backgroundBuffer.Bitmap != null) {

            currentBuffer.DrawBitmap(previousBuffer.Bitmap, //draw the previous frame onto the current frame
                new Rectangle( //target rectangle
                    new Point(
                        -1*distance[0]*getZoomLevel(),//xpos of previous frame image
                        -1*distance[1]*getZoomLevel()//ypos of previous frame image
                    ),
                    currentBuffer.Size.ToSize() //the size of the image
                ),
                1,//opacity
                InterpolationMode.Linear,
                new Rectangle( //source rectangle (covers whole image)
                    new Point(0,0),
                    previousBuffer.Size.ToSize()
                )
            );
        }   

        drawChangeToTarget(currentBuffer); //draw the new tiles onto the current Buffer

    currentBuffer.EndDraw(); //throws Direct2DException here


    target.DrawBitmap(currentBuffer.Bitmap, //draw the result to the screen
        new Rectangle ( //destination rectangle
            new Point (0,0),
            target.Size.ToSize()
        ),
        1, //opacity
        InterpolationMode.Linear,
        new Rectangle( //target rectangle
            new Point(0,0),
            currentBuffer.Size.ToSize()
        )
    );
}
...