最近、foglemanの優れた「Minecraft in 500 lines」デモをhttps://github.com/fogleman/Craftからダウンロードしました。私は2to3ツールを使って、python3で実行可能にするためにいくつかの詳細を手作業で修正しました3。私は今レンダリングメソッドでself.clear()
という呼び出しを持つことについて疑問を呈しています。これはpygletによってすべてのフレームと呼ばれる私の修正レンダリング手法である:あなたが見ることができるようにPython minecraft pyglet glClear()フレームをスキップする
def on_draw(self):
""" Called by pyglet to draw the canvas.
"""
frameStart = time.time()
self.clear()
clearTime = time.time()
self.set_3d()
glColor3d(1, 1, 1)
self.model.batch.draw()
self.draw_focused_block()
self.set_2d()
self.draw_label()
self.draw_reticle()
renderTime = time.time()
self.clearBuffer.append(str(clearTime - frameStart))
self.renderBuffer.append(str(renderTime - clearTime))
、私はself.clear()
とレンダリング方法の残りの実行時間を取りました。 .../pyglet /ウィンドウ/ __ init__.pyで発見することができますself.clear()
通話pygletのこのメソッドの呼び出し、:
def clear(self):
'''Clear the window.
This is a convenience method for clearing the color and depth
buffer. The window must be the active context (see `switch_to`).
'''
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
は、だから私は基本的にglClear()
への呼び出しを作るのですか。
ゲームをテストしている間に(60FPSで)いくつかのフレームドロップが発生したので、上記のコードを追加してコマンドの実行時間を測定しました。特にglClear()
の1つです。私はレンダリング自体が10ミリ秒以上かかることはないことを知りました。しかしglClear()
の持続時間は、別の話のビットは、ここで異なる条件下での3回の測定のための分布である:
Duration of glClear() under different conditions.
マゼンタラインはフレームの時間制限を示します。したがって、最初の行の後ろのすべては、フレームドロップがあったことを意味します。
glClear()の実行時間は、最初のフレームの有効期限が切れた後、何らかの "エコー"が発生しているようです。なぜ私に説明できますか?そして、私はどのようにして電話をもっと早くすることができますか
残念ながら私はOpenGLのエキスパートではないので、すべてのアドバイス担当者に感謝しています。 ;)
タイマーの解像度は単純に16ミリ秒で、「エコー」を説明することができます。 https://docs.python.org/2/library/time.html#time.timeを参照してください。「すべてのシステムが1秒以上の精度で時間を提供するわけではありません」別のタイマーを試して、それが重要かどうかを確認してください。 – TWT