Я пишу плитку 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()
)
);
}