2010-12-17 25 views
0

我有一個Matrix4D應該傳遞給glLoadMatrixf。爲了克服p/invoke開銷(即每一次鎖定,編組等),我使用指針而不是通常的數組。所以我有兩個問題。指向C#/ CLR中的valuetype的中間值是否安全?

  1. Matrix4D基於copypasted類。它已經過測試並且可能進行了一些優化 - 不想重新發明輪子(同樣我也在數學上)。無論如何,該類使用16個字段,而不是1個固定數組(該類是我在C#1.0時代編寫的)。佈局是順序的,所以GetPointer方法只是獲得指向第一個字段的指針。問題是:會有一些填充問題嗎?我的意思是,例如,運行時將float擴展爲double,以便將一組字段作爲數組索引來獲取垃圾。或者順序佈局是否阻止了規格?還是應該嚴格遵守固定陣列?

  2. 第二個問題是優化程序可能進行的更改。矩陣是一個值類型,在其上調用float * GetPointer()。恐怕優化器可能會重新排列代碼,GetPointer會指向一些垃圾。

例如:

GL32NativeMethods.glLoadMatrixf((mat1 * mat2).GetPointer()); 

它是安全的呢,還是不?目前我正在這樣做(雖然我不確定):

Matrix4D tmp = mat1 * mat2; 
GL32NativeMethods.glLoadMatrixf(tmp.GetPointer()); 

是否有其他可能的解決方案來解決這個問題? P.S.在調用glLoadMatrixf之後,指針不是必需的。

UPD

我擔心的是,在調用GetPointer()和glLoadMatrixf()之間的值可以通過優化器被丟棄(如我想):

浮子* F = mat.GetPointer ();

//這裏優化器決定放棄mat變量,因爲它不再被使用。

//也許它現在填充與其它輔助值墊的存儲區域

GL32NativeMethods.glLoadMatrixf(F)(對P /調用,例如); //引用丟棄了數據。

+0

你不能沒有固定指針,所以你應該沒問題。 – Gabe 2010-12-17 06:07:43

+0

@Gabe:當被調用的方法返回時,從方法返回的指針不會讓其對應的對象仍然固定。但是,堆棧中分配的值對象不需要被固定。 – cdhowie 2010-12-17 06:10:01

+0

Matrix4D是一個結構體。 – YetAnotherCodemonkey 2010-12-17 06:10:24

回答

0

嘿,我垂涎忘了,本機代碼是類型不可知的,即它是實際的內存對齊。 我會嘗試這一個:

public static extern void glLoadMatrixf(ref Matrix4D mat); 
GL32NativeMethods.glLoadMatrixf(ref mat); 

本地代碼會被誤以爲墊float數組,儘管它實際上是一個int數組的取向值類型。

0

我包裹以下列方式的OpenGL方法:

public static void UniformMatrix4(int location, Int32 count, bool transpose, float[] value) { 
     unsafe { 
      fixed (float* fp_value = value) 
      { 
       Delegates.pglUniformMatrix4fv(location, count, transpose, fp_value); 
      } 
     } 
    } 

    [System.Runtime.InteropServices.DllImport(Library, EntryPoint = "glUniformMatrix4fv", ExactSpelling = true)] 
    internal extern static unsafe void glUniformMatrix4fv(int location, Int32 count, bool transpose, float* value); 

然後,我可以使用一個浮[]用於指定基質組分。當然,有一個Matrix類定義了浮點數組和抽象數學運算。

+0

問題是,我不想在矩陣內部有一個float數組。有一個float數組意味着每次複製矩陣時都會分配一個額外的數組。對於.NET,它可能是好的,但我也瞄準單聲道,並且Windows上的單聲道使用慢保守的gc。 – YetAnotherCodemonkey 2010-12-18 05:30:49

+0

也許你是對的,但過於期待的優化是邪惡的。正確寫入,然後進行配置。但是,您不應該使用GetPointer例程返回指針,而是使用固定語句,即使在結構值(例如矩陣)上也是如此。 – Luca 2010-12-18 08:26:25

相關問題