我開發一個HTML5的3D FPS類引擎已經看起來相當不錯,但由於這可能是最糟糕的語言選擇之一,使3D有時有明顯的滯後。遊戲編程:刪除運動滯後(跳躍)
予編程運動(WASD)是獨立的繪製速度的,所以有時這是相當不平穩,但其它時候是工作在可接受30+ FPS(取決於當然CPU)。
我不能包住我的頭腦的唯一事情就是跳躍:當前跳躍是通過向下降變量添加一個正常數來完成的(重力總是負的,然後通過碰撞檢測進行校正),然後減去一個常數,這被稱爲每次一個新的框架渲染時,事情是,當fps走低時,我覺得我在月球上。我更喜歡搖晃的效果。
如果我使用與我一樣的移動方法(計算當前幀和最後一幀之間的時間),扣除的變量有時會變得太大,並且跳躍頂點會變化(與高幀率的一半相比) - 這是因爲跳躍高度必須始終相同而不可接受。
下面是一些僞代碼,以幫助理解問題(一個渲染程序中調用):
// when clicked on spacebar:
if(spacebar)
{
// this defines jumping apex
jump = 0.5
}
// constant added to y (vertical position) later in the code
cy += jump;
// terminal velocity = -2
if(jump > -2)
{
// gravity (apex multiple to get maximum height)
jump -= 0.05;
}
if(collision_with_floor)
{
// stop falling
cy = 0;
if(jump < 0)
{
jump = 0;
}
}
player.position.y += cy;
現在與時間相關的跳躍(在上面的代碼替換):
// terminal velocity = -2
if(jump > -2)
{
// gravity, 0.4 is an arbitrary constant
jump -= (now - last_frame)*0.4;
last_frame = now;
}
要說明甚至更好這裏是一個正在發生的事情的圖像:
個藍點表示幀渲染。
我甚至不能肯定這是編程跳躍例行的正確途徑。基本上不平順和不斷的跳躍高度比平滑和慢搖效果要好。
這樣做很有效,但並不理想,如果我在碰到頂點時將橙色線撞到虛線上,它會變得非常不平穩,就像是第二次小跳躍。在較低的fps上它不是很明顯,但在更高的時候它很煩人。 – Solenoid
奇怪的是,較高的FPS更糟糕 - 我會認爲理想頂點和實際頂點之間的距離會低於較低的FPS。如果玩家缺乏虛線,可能不是突然出現碰撞,只是保持當前的'cy'爲正值,以便玩家繼續向上直到達到它。 –
此外,這是一個有趣的問題,但它可能在http://gamedev.stackexchange.com/獲得更多的牽引力比SO。 –