我正在寫一個3D圖形庫作爲我的一個項目的一部分,而且我正處於一切正常工作的地步,但還不夠好。關於優化Z緩衝區實現的建議?
特別是,我的主要頭疼的是,我的像素填充率爲可怕慢 - 繪製跨越一個800x600窗口的一半我的目標機器上的三角形時,我甚至不能管理30 FPS(這是無可否認的舊電腦,但它應該是能夠管理這個)
我跑gprof的在我的可執行文件,我結束了以下有趣的臺詞:。
% cumulative self self total
time seconds seconds calls ms/call ms/call name
43.51 9.50 9.50 vSwap
34.86 17.11 7.61 179944 0.04 0.04 grInterpolateHLine
13.99 20.17 3.06 grClearDepthBuffer
<snip>
0.76 21.78 0.17 624 0.27 12.46 grScanlineFill
功能vSwap
是我的雙緩衝區交換功能,並且它也執行語音處理,所以對我來說測試程序將花費大量時間在那裏等待。 grScanlineFill
是我的三角形繪製功能,它創建一個邊緣列表,然後調用grInterpolateHLine
實際填充三角形。
我的引擎當前正在使用Z緩衝來執行隱藏表面去除。如果我們對(假設的)vsynch開銷進行折扣,那麼事實證明測試程序花費了其執行時間的85%,或者清除深度緩衝區,或者根據深度緩衝區中的值寫入像素。我的深度緩衝區清除功能本身就很簡單:將浮點數的最大值複製到每個元素中。功能grInterpolateHLine
是:
void grInterpolateHLine(int x1, int x2, int y, float z, float zstep, int colour) {
for(; x1 <= x2; x1 ++, z += zstep) {
if(z < grDepthBuffer[x1 + y*VIDEO_WIDTH]) {
vSetPixel(x1, y, colour);
grDepthBuffer[x1 + y*VIDEO_WIDTH] = z;
}
}
}
我真的不知道怎樣才能改善這種,特別是考慮到vSetPixel
是一個宏。
我的優化思路整個股市已經削減到精確之一:
- 使用整數/定點深度緩衝。
,我有整數/定點深度緩衝的問題是,插值可以很煩人,我實際上並不有定點數庫呢。有任何進一步的想法嗎?任何意見將不勝感激。
使用像OpenGL這樣的硬件解決方案? – Lalaland
哈哈,不幸的是,這個項目的重點是要教自己如何真正起作用。類似於使用OpenGL等的對立面。 – Ethereal
也gcc有一些固定點支持本身:http://gcc.gnu.org/onlinedocs/gcc/Fixed_002dPoint.html – Lalaland