XNA для рендеринга 3D видео (исправлено FPS!) - PullRequest
1 голос
/ 01 сентября 2010

Мне нужно разработать приложение, в котором последний шаг - экспорт видео (или одного кадра) трехмерной анимации, сгенерированной моим программным обеспечением, для расчета параметров ввода пользователя.

Я хочу использовать XNA и для этого. Мне нужно, чтобы программное обеспечение могло экспортировать видео FIXED FPS (или также все отдельные кадры видео отдельно). Это не вопрос LIVE FPS. Мне не нужно просматривать на экране кадры с фиксированным fps. Поскольку анимация может быть очень сложной, я мог бы согласиться, если бы программное обеспечение занимало 1 минуту для каждого кадра.

Важно то, что я могу видеть кадр во время его рендеринга, и он не пропускает ни один кадр. например. если видео длится 1 минуту, оно должно экспортировать 24 кадра со скоростью 24 кадра в секунду, также если для рендеринга каждого кадра потребуется 20 секунд. После рендеринга первого кадра (то есть через 20 с) он не должен рендерить кадр в 21 с. это должно сделать кадр [2/24 первой минуты]

Как я могу получить это?

Спасибо!

1 Ответ

1 голос
/ 01 сентября 2010

Вот метод для этого для XNA 4.0, описанный в коде для вашего Game класса (потому что это легко для меня):

protected override void Update(GameTime gameTime)
{
    // Do Nothing!
}

void RealUpdate()
{
    const float deltaTime = 1f/60f; // Fixed 60 FPS     
    // Update your scene here
}

RenderTarget2D screenshot;

protected override void LoadContent()
{
    screenshot = new RenderTarget2D(GraphicsDevice, width, height, false, SurfaceFormat.Color, null);
}

protected override void UnloadContent()
{
    screenshot.Dispose();
}

int i = 0;

protected override void Draw(GameTime)
{
    RealUpdate(); // Do the update once before drawing each frame.

    GraphicsDevice.SetRenderTarget(screenshot); // rendering to the render target
    //
    // Render your scene here
    //
    GraphicsDevice.SetRenderTarget(null); // finished with render target

    using(FileStream fs = new FileStream(@"screenshot"+(i++)+@".png", FileMode.OpenOrCreate)
    {
        screenshot.SaveAsPng(fs, width, height); // save render target to disk
    }

    // Optionally you could render your render target to the screen as well so you can see the result!

    if(done)
        Exit();
}

Примечание: я написал это без компиляции или тестирования - так что может быть небольшая ошибка или две.

...