DirectX: порядок игровых циклов, сначала рисуем, а потом обрабатываем ввод? - PullRequest
5 голосов
/ 03 мая 2010

Я просто читал документацию по DirectX и обнаружил кое-что интересное на странице для IDirect3DDevice9 :: BeginScene :

Чтобы включить максимальный параллелизм между процессор и графический ускоритель, выгодно звонить IDirect3DDevice9 :: EndScene до перед вызовом подарка, насколько это возможно.

Я привык писать свой игровой цикл для обработки ввода и тому подобного, а затем рисовать. У меня есть это назад? Может быть, игровой цикл должен быть более похож на это: (полупсевдокод, очевидно)

while(running) {
    d3ddev->Clear(...);
    d3ddev->BeginScene();
    // draw things
    d3ddev->EndScene();

    // handle input
    // do any other processing
    // play sounds, etc.

    d3ddev->Present(NULL, NULL, NULL, NULL);
}

В соответствии с этим предложением документации, этот цикл будет "включать максимальный параллелизм".

Это обычно делается? Есть ли какие-либо недостатки в заказе игрового цикла, как это? Я не вижу реальной проблемы с ним после первой итерации ... И я знаю, что лучший способ узнать фактическое увеличение скорости чего-то подобного - это на самом деле сравнить его, но кто-нибудь еще это уже пробовал, и можете ли вы засвидетельствовать любое реальное увеличение скорости?

Ответы [ 3 ]

2 голосов
/ 03 мая 2010

Стоит отметить, что практически на всех ПК аппаратные средства BeginScene и EndScene ничего не делают. Фактически драйвер буферизует все команды рисования, и тогда, когда вы вызываете подарок, он может даже не начать рисование. Они обычно буферизуют несколько кадров команд рисования, чтобы сгладить частоту кадров. Обычно водитель делает вещи, основанные на настоящем вызове.

Это может вызвать задержку ввода, когда частота кадров не особенно высока.

Держу пари, что если бы вы сделали рендеринг непосредственно перед подарком, вы бы не заметили никакой разницы в цикле, который вы даете выше. Конечно, на некоторых нечетных битах аппаратного обеспечения это может вызвать проблемы, поэтому в общем случае лучше отключиться, как вы предложили выше.

2 голосов
/ 03 мая 2010

Поскольку я всегда чувствовал, что рисовать перед симом было «неловко», я старался нажимать на дро до обновления, но также и после «настоящего» вызова. Э.Г.

while True:
   Simulate()
   FlipBuffers()
   Render()

Хотя в первом кадре вы ничего не переворачиваете (и вам нужно настроить все так, чтобы первый переворот действительно перешел в известное состояние), это всегда казалось мне немного приятнее, чем ставить Render () первым даже если порядок выполнения операций тот же, что и во время выполнения.

2 голосов
/ 03 мая 2010

Короткий ответ - да, так обычно делают. Взгляните на следующую презентацию игрового цикла в God of War III на PS3:

http://www.tilander.org/aurora/comp/gdc2009_Tilander_Filippov_SPU.pdf

Если вы запускаете игру с двойной буферизацией при 30 кадрах в секунду, задержка ввода будет составлять 1/30 ~ = 0,033 секунды, что очень мало для обнаружения человеком (для сравнения, любое время реакции менее 0,1 секунды на 100 метров считается фальстартом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...