& ldquo; git rm --cached x & rdquo; vs & ldquo; git reset head - x & rdquo ;?

Создал Gist с полным кодом здесь

Это довольно эзотерическое искусство, и есть несколько способов сделать это. Я предпочитаю то, что называется Direct3D Wrapper . Прошло много лет с тех пор, как я это сделал, но однажды сделал это с игрой. Я, возможно, отказался от некоторых деталей, но я просто надеюсь проиллюстрировать эту идею.

Все игры Direct3D9 необходимо вызвать IDirect3DDevice9 :: EndScene после отображения экрана и быть готовым к тому, чтобы нарисован. Поэтому теоретически мы можем поместить пользовательский код внутри EndScene, который рисует то, что мы хотим по игре. Мы делаем это, создавая класс, который похож на IDirect3DDevice9 на игру, но на самом деле это всего лишь оболочка, которая пересылает все вызовы функций в реальный класс. Итак, теперь в нашем пользовательском классе наша оберточная функция для EndScene выглядит так:

HRESULT IDirect3DDevice9::EndScene()
{
   // draw overlays here

   realDevice.EndScene();
}

Затем мы скомпилируем ее в DLL, называемую d3d9.dll, и поместим ее в каталог исполняемого файла игры. Реальный d3d9.dll должен находиться в папке / system32, но игра сначала выглядит в текущем каталоге и вместо этого загружает наши. Как только игра загружается, она использует нашу DLL для создания экземпляра нашего класса-оболочки. И теперь каждый раз, когда вызывается EndScene, наш код выполняется, чтобы нарисовать то, что мы хотим на экране.

Я думаю, вы можете попробовать тот же принцип с OpenGL. Но чтобы предотвратить фальсификацию, я думаю, что некоторые современные игры пытаются предотвратить это.

139
задан Jeremy.ca 15 January 2019 в 04:01
поделиться