2011-05-14 111 views
1

對於落砂遊戲我需要鎖定表面然後根據一組規則修改像素,然後解鎖。紋理的尺寸爲800x500並具有格式A8R8G8B8C#的DirectX性能

TEXTURE聲明

texture = new Texture(device, 800, 500, 1, Usage.Dynamic, Format.A8R8G8B8, Pool.Default); 

上的更新方法(理想情況下應該被稱爲約40張/秒)

public new void Update() 
    { 
     count++; 
     byte[] data = (byte[])texture.LockRectangle(typeof(byte), 0, LockFlags.None, 800 * 500 * 4); 
     for (int i = 0; i < 1600000; i++) 
     { 
      data[i] = 255; 
     } 
     texture.UnlockRectangle(0); 
    } 

我有一個高端圖形卡,這種簡單的循環降低了我的FPS率10-13。

DirectX中有更快的方法來直接更改曲面的像素嗎?

回答

3

你在做什麼是從圖形卡的內存中讀取這個紋理到計算機內存中,然後完成它,然後寫回來。這顯然意味着巨大的性能殺手,因爲你需要等待兩個內存之間的拷貝。

Usualy,這種操作是使用着色器在顯卡上實現的。

+0

我首先查看了着色器,但是我的問題是,我需要知道何時例如一個像素落入一個杯子(然後該杯子的計數器減少一個......),你能解釋怎麼做與着色器或鏈接到一個教程? – Blaxx 2011-05-14 14:40:12

+0

我真的不知道。我對圖形編程的知識是有限的。但通常這種事情需要完全不同的方法來解決問題,需要大量的經驗和反覆試驗。 – Euphoric 2011-05-14 14:44:06

0

通常遊戲模型存儲在常規內存中,由CPU處理,而圖形卡純粹用於渲染結果。如果你沒有特別的理由不這樣做,它會更容易編寫和調試。

在你的情況下,你似乎擁有視頻內存中的所有遊戲數據。正如Euphoric在這種情況下指出的,你應該讓所有的邏輯運行在着色器中。有很多示例如何使用幾個紋理目標執行數據操作(在您的情況下,2個可能就足夠了)。

我建議找到使用着色器編寫的「生命遊戲」樣本(搜索 - http://www.bing.com/search?q=directx+shader+sample+%22game+of+life%22,我可能會從這一個開始 - http://www.xnainfo.com/content.php?content=21)。生命的遊戲可能是最簡單的事情,可以接近你嘗試實現的目標。 DirectX SDK和Nvidia SDK是很好的樣本來源,例如 - http://developer.download.nvidia.com/SDK/9.5/Samples/3dgraphics_samples.html

欲瞭解更多示例搜索「prostprocess着色器」幾乎所有這些都通過處理最終渲染圖像着色器實現。