2010-09-01 56 views
1

我必須開發一個應用程序,最後一步是導出由我的軟件計算用戶輸入參數生成的3D動畫的視頻(或單個幀)。XNA渲染3D視頻(固定FPS!)

我想使用XNA和爲此。我需要該軟件可以導出FIXED FPS視頻(或者也可以單獨顯示視頻的所有單幀)。這不是一個現場FPS的問題。我不需要以固定的幀數在屏幕上查看幀數。由於動畫可能非常複雜,如果軟件每幀需要1分鐘,我可以接受。

重要的是,我可以在渲染時看到幀,並且不會跳過任何幀。 例如。如果視頻長度爲1分鐘,則它必須以24fps的速度輸出24幀,並且如果每幀需要20秒的時間才能輸出。在渲染第一幀(20秒後)後,它不必在21秒渲染幀。它必須渲染幀[第一分鐘的2/24]

我怎樣才能獲得這個?

謝謝!

回答

1

這裏是代碼爲您Game類描述(因爲它很容易對我來說)這樣做的XNA 4.0的方法,:

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++)[email protected]".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(); 
} 

注:我寫這無需編譯或測試 - 所以有可能是一個小錯誤或兩個。

+0

感謝您的回答!我會嘗試! 您如何建議跟蹤RealUpdate()函數中的時間(當前幀更新)? 我應該實施某種整數計數器併爲每個RealUpdate增加它嗎?或者我應該跟蹤XNA GameTime對象的時間嗎? – Alex 2010-09-03 10:06:52

+0

你可以做任何適合你的動畫。您可以存儲自動畫開始以來的秒數或幀數。或者你可以存儲所有東西的位置,每幀更新一個恆定的數值(就像你在真實的遊戲中一樣)。不要創建'GameTime'對象(通常你只是閱讀它們 - 但在你的情況下,你故意忽略它們)。將時間存儲爲'float'或'double'(以存儲數秒)或'TimeSpan'。 – 2010-09-03 11:30:52