2013-05-26 52 views
2

我正在製作SDL程序,有時需要獲取矩形的寬度。當我做這樣的事情:爲什麼System.Drawing.Rectangle.getWidth()如此昂貴?

 int VideoWidth = Video.Screen.Width; //Expensive operation 
     int VideoHeight = Video.Screen.Height; 

     int ChunksRendered = 0; 
     foreach (Chunk c in Chunks) 
     { 
      if (c.X + 256 + DeferredX > 0 && c.X + DeferredX < VideoWidth) 
      { 
       if (c.Y + 256 + DeferredY > 0 && c.Y + DeferredY < VideoHeight) 
       { 
        BlitSurface.Blit(c.Render(ref Textures, ref BlitSurface), new Point(c.X + DeferredX, c.Y + DeferredY)); 
        ChunksRendered++; 
       } 
      } 
     } 

我得到大約550 FPS我的機器上,但是當我這樣做:

 int ChunksRendered = 0; 
     foreach (Chunk c in Chunks) 
     { 
      if (c.X + 256 + DeferredX > 0 && c.X + DeferredX < Video.Screen.Width) 
      { 
       if (c.Y + 256 + DeferredY > 0 && c.Y + DeferredY < Video.Screen.Height) 
       { 
        BlitSurface.Blit(c.Render(ref Textures, ref BlitSurface), new Point(c.X + DeferredX, c.Y + DeferredY)); 
        ChunksRendered++; 
       } 
      } 
     } 

我只得到大約200 FPS。分析顯然,這會導致速度放慢,但爲什麼要讓這個變量如此昂貴?

+0

確實每幀上的屏幕寬度的變化? –

+0

不,但你可以在遊戲中更改分辨率 –

回答

5

很可能是Video.Screen屬性存取器導致這種放緩。如果您正在使用SdlDotNet.dll,這裏是該屬性的代碼:

public static Surface Screen 
{ 
    get 
    { 
     return Surface.FromScreenPtr(Tao.Sdl.Sdl.SDL_GetVideoSurface()); 
    } 
} 

這意味着1個外部DLL函數被調用,1個Surface對象被創建的每個Video.Screen屬性進行訪問的時間。

訪問的SurfaceWidthHeight性質也是昂貴的,因爲它包括調用以下代碼:

internal Tao.Sdl.Sdl.SDL_Surface SurfaceStruct 
{ 
    get 
    { 
     if (this.disposed) 
     { 
      throw new ObjectDisposedException(this.ToString()); 
     } 
     GC.KeepAlive(this); 
     return (Tao.Sdl.Sdl.SDL_Surface) Marshal.PtrToStructure(base.Handle, typeof(Tao.Sdl.Sdl.SDL_Surface)); 
    } 
} 
+1

添加到答案:內部if語句不總是執行(外部if語句的條件可以計算爲false)。這意味着在第一個例子中,Screen屬性的getter被調用了兩次,而第二個則調用了Count *(1到2)次。這是一個很好的例子,爲什麼你不應該爲(int i = 0; i Warty

+0

謝謝你 - 這讓我感到困惑,但如果它每次都必須重新計算這個值才能解釋減速)。 –