2015-08-15 50 views
0

hello every body:玩家移動問題。運動進行緩慢經過一段時間

我在空場景中的玩家角色從A點移動到B並返回到A定速,在比賽的第一個小時運行它是好的,過了三小時運動變得緩慢而遲鈍,事先感謝

Game.h

D3DXMATRIX Player_Matrix ;   //main player matrix . 
D3DXVECTOR3 PlayerPos;    //main player position . 
D3DXVECTOR3 PlayerLook;    //main player Look at position . 

Game.cpp

//Initialize() 
    D3DXMatrixIdentity(&Player_Matrix);  
    PlayerPos = D3DXVECTOR3(10.0f,0.0f,10.0f); 
    PlayerLook = D3DXVECTOR3(0.0f,0.0f,1.0f); 

//MovePlayer()  
     //declarations 
     static float angle = D3DXToRadian(0); 
     float Speed = 70.0f ; 

     PlayerPos += (PlayerLook * (Speed * (m_timeDelta)));  

     if(PlayerPos.x >= 320)   //  320:(B) 
     { 
      angle = D3DXToRadian(180);     
     } 
     if(PlayerPos.x <= 0)   //  0:(A) 
     { 
      angle = D3DXToRadian(180); 
     } 


    //Setting up player matrixes 
    D3DXMATRIX TransMat , RotMat , TempMat , ; 

    D3DXMatrixIdentity(&TempMat); 
    D3DXMatrixIdentity(&RotMat); 
    D3DXMatrixIdentity(&TransMat); 

    //Setup Rotation matrix . 
    D3DXMatrixRotationY(&RotMat,angle); 
    angle = 0.0f ; 

    //Attach PlayerLook Vector to rotation matrix 
    D3DXVec3TransformCoord(&PlayerLook,&PlayerLook,&RotMat); 

    //gathering rotation matrix with player matrix 
    D3DXMatrixMultiply(&Player_Matrix,&Player_Matrix,&RotMat);  

    //transmat is an empty matrix to collect new player position 
    D3DXMatrixTranslation(&TransMat, PlayerPos.x,PlayerPos.y, PlayerPos.z);  

    //multiply new position matrix with main player matrix 
    D3DXMatrixMultiply(&TempMat,&Player_Matrix,&TransMat); 

    d3ddev->SetTransform(D3DTS_WORLD,&TempMat); 
    Main_Player->Render(); 
+1

內存泄漏是通常的解釋,它就會在頁面故障開始增加放緩。一般來說,永遠不要依靠遊戲循環頻率,總是使用測量實際流逝時間的時鐘。並使用一個分析器。 –

+0

如果所有渲染場景都很慢,但內存泄漏是一個合理的點,但是每件事都可以,比如遊戲循環,播放器動畫增量時間,時間和幀速率,只有一件事情變得緩慢就是運動。 –

回答

0

我會研究你如何計算m_timeDelta。也許你的方法是允許浮點錯誤建立起來。

下面是關於這個問題的文章:https://randomascii.wordpress.com/2012/02/13/dont-store-that-in-a-float/

我與湯姆·福賽斯,並認爲64位整數是絕對時間(http://home.comcast.net/~tom_forsyth/blog.wiki.html#[[A%20matter%20of%20precision]])最好的存儲類型,但雙會工作也沒關係。

+0

'code Initialize()// Time stuff QueryPerformanceCounter(&m_time); m_starttime =(long double)m_time.QuadPart;'
'代碼// delta的開始時間//代碼Render()//遊戲增量時間QueryPerformanceCounter(&m_nowtime); \t m_timeDelta =((long double)((m_nowtime.QuadPart - m_starttime)/ m_ticks)); //用Delta time計算的當前時間休息變量m_starttime =(long double)m_nowtime.QuadPart; –

+0

我認爲格式不適用於評論,但它看起來像m_timeDelta可能是安全計算。 – Columbo

+0

感謝「Columbo」,肯定它工作正常,而不是我的電腦對遊戲有好處(CPU I3,RAM 8GB,HDD 320GB)這個問題發生的同時它並沒有對別人較低,比如(P4,AMD) –

0

PlayerLook似乎是可疑的。

它被反覆旋轉的每一幀,浮點運算錯誤,這是可能的,可能逐漸大概只在框架在那裏旋轉變化萎縮。

您可以通過幾個小時的運行後查看其在調試器值確認,或者你可以消除它作爲一種可能性,如果你重新規格化它的每一幀,看看是否放緩消失。

+0

是的,這是我要求的確切答案,而我正在執行調試器下的遊戲。這將會很慢,換句話說,如果我在發佈時執行它,它會在一段時間後正常工作。 PlayerLook是D3DXVECTOR3,其結構爲三個浮點數(x = 0,y = 0,z = 1)
Ex:PlayerPos.z(250)+ =(PlayerLook.z *(50.0f *(0.0004))) ; == 250+(1 * 50 * 0.0004)== 250 + 0.02 == 250.02所以浮點型就足夠了,爲此我感到困惑。 –

0

我剛剛發現這兩個問題及其解決方案:

正如我解釋說,所有的應用程序工作正常之前,問題是:運動(只是X +,Y +,Z ++)變得緩慢,一段時間後緩慢。首先,我認爲這是一個內存泄漏,但動畫和德爾塔時間正常工作,試圖找到導致此問題的合理問題。 我得到了應用到其它PC的發佈,時間週期後的應用程序工作正常,在那一刻,我看到了FPS不會達到每秒60.0幀,在MS DirectX SDK中搜索裏面DXUT我發現了一個結構之後,控制FPS,有沒有談到GPU和加速度的醫生,他們建議,以控制FPS和它的侷限性,這裏是代碼:

//----------------------------------------------------------------------------- 
// Name: LockFrameRate() 
// Desc: Limit The frame Rate to specified 
//----------------------------------------------------------------------------- 
bool LockFrameRate(int frame_rate , float SecPerCnt) 
{ 
    static __int64 StartTime = 0 ; 

    __int64 CurTime = 0 ; 
    QueryPerformanceCounter((LARGE_INTEGER*)&CurTime); 

    float CurrentSecond = (float)((CurTime - StartTime)* SecPerCnt) ; 

    // Get the elapsed time by subtracting the current time from the last time 
    // If the desired frame rate amount of seconds has passed -- return true (ie Blit()) 
    if(CurrentSecond > (1.0f/frame_rate)) 
    { 
     // Reset the last time 
     StartTime = CurTime;  
     return true; 
    } 

    return false; 
} 

// INT WINAPI的WinMain(....)

//*************************** 
    // Initialize Timing Preformance . * 
    //*************************** 

    //Store Counts per second 
    __int64 CountPerSec = 0 ; 

    //Gets how many counts does the CPU do per second 
    QueryPerformanceFrequency((LARGE_INTEGER*)&CountPerSec); 

    //Gets second per count to preform it with different typs of CPUs 
    float SecondPerCount = 1.0f/CountPerSec ; 

    //Initial Previous Time 
    __int64 PrevTime = 0 ; 
    QueryPerformanceCounter((LARGE_INTEGER*)&PrevTime); 

while(msg.message != WM_QUIT)        // while not quit message , go on  
    { 
     if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE)) 
     {        
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
     else if(LockFrameRate(60 , SecondPerCount)) // If it is time to draw, do so , I selected 60 fps to limit 
     { 
      //Capture Current Time 
      __int64 CurTime = 0 ; 
      QueryPerformanceCounter((LARGE_INTEGER*)&CurTime); 

      //Calculate Delta Time 
      float DeltaTime =(float) ((CurTime - PrevTime) * SecondPerCount) ;   
      //Engine loop 
      Engine->Engine_Run(DeltaTime , SecondPerCount);       

      //After Frame Ends set Pervious Time to Current Time 
      PrevTime = CurTime ; 
     } 
     //else 
      //Sleep(1); // Give the OS a little bit of time to process other things 
    } 

我評論的睡眠(1),因爲我知道科學這僅僅是CPU的負擔,但我把它科學的信心,這是應用程序和其他之間存在一個空閒的proc,等待對方,這是在當今的計算機技術。 如果你想嘗試一下,你可以感受到一些屏幕停止發生這些是不需要的 。

謝謝堆棧溢出流。
。感謝你們 。