我目前正在開發一個基本體素(立方體)遊戲引擎,而且我遇到了性能問題。遊戲中的每一幀:如何從TRY語句中避免糟糕的程序性能?
查找玩家的觀看方向→檢查玩家直觀視圖路徑中的每個座標→查找最近佔用的空間→在該塊周圍繪製線框。
我使用OpenTK,.NET/Mono(特別是C#)的OpenGL的綁定。我的代碼OnRenderFrame包含此:
try
{
for (int i = 0; i < 8; i++)
{
Vector3 block = InterfaceUtils.FindBlockLoc(Utilities.RoundToInt(cam.Position + (cam.lookat * i)));
if (block != Vector3.Zero)
{
// Draw the wireframe
}
}
}
catch
{
}
這段代碼的目的是從玩家檢查多達八塊,直到它找到一個塊。唯一的問題是try語句最常拋出一個(已處理的)異常:但是由此導致的滯後很大。當我觀察太空時,我只得到11FPS,但如果代碼成功,我得到50。
如果代碼是成功的(它可以繪製線框),我得到這個:
塊調查通過檢查的對象列表中,一個塊的工作位置。
public static Vector3 FindBlockLoc(Vector3 location)
{
Vector3 result = new Vector3(Vector3.Zero);
result = Deltashot.Game.objects.Find(v => v.Position == location).Position;
if (result != null)
{
return result;
}
else
{
return Vector3.Zero;
}
}
然而,這會返回一個NullReferenceException,我不得不使用try語句來得到它的運行。這又回到了一個...
*爲什麼*你得到一個例外?不要只是捕捉和忽略它,你應該弄清楚爲什麼你首先得到一個例外。無論如何,它是什麼樣的例外? – 2015-02-08 19:50:25
我的猜測nullref來自賦值結果,而不是存儲'find'的結果並測試其爲nullness – 2015-02-08 19:53:53
這是什麼意思?「這將返回一個NullReferenceException?拋出的異常在哪裏?您做了什麼診斷?它是什麼?一個NullReferenceException幾乎總是需要避免的東西,而不是被捕獲的。 – 2015-02-08 20:10:02