Сейчас на форуме: hgdagon, asfa (+5 невидимых)

 eXeL@B —› Программирование —› Можно ли увеличить скорость простой DirectX игры ?
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 24 апреля 2007 19:10
· Личное сообщение · #1

Можно ли увеличить скорость игры написанной на Delphi с использованием DirectX ? На форме находится TDXDraw. Как вообще устроен механизм того, что бы и на слабом компьютере по возможности игра нормально работала и на очень хорошем не летала как ДОСовские ?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 24 апреля 2007 19:30
· Личное сообщение · #2

ToBad я имию оень приблизительное представление о 3D, но всё упирается в несколько вещей:
- кадры перересовываются железом, так быстро как можно (получаем fps)
- всё что касается координат и движения счетается относительно времяни а не кадров
- DirectX имеет или опускает фички в зависимости от того что поддерживает видео драйвер и железо
- игра может смотреть в установки и добавлять/убирать эффекты

Ну и, ессно, включив всё в игре и подняв разнешение ты сможешь загнать слабый комп в неизрабельные 0.5 fps Если конечно это не pacman.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 24 апреля 2007 21:03
· Личное сообщение · #3

Игра очень простая, типа "однорукого бандита". Полнейший примитив - никаких эффектов. Вся графика в bmp а музыка в wav. Я так понял просто меняются картинки. Например, горение свечи, 2-3 маленькие bmp-шки огня. Меня интересует не поднятие fps, а возможность ускорить весь геймплей. Например кручение барабана и его остановка занимает определённое время, вот это и нужно немного ускорить. Просто не знаю как примерно это может быть организованно. Не sleep-же используется ?




Ранг: 68.0 (постоянный), 6thx
Активность: 0.060
Статус: Участник

Создано: 24 апреля 2007 21:07
· Личное сообщение · #4

ToBad пишет:
Не sleep-же используется

Ну если не слип, то может таймеры?



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 24 апреля 2007 22:08
· Личное сообщение · #5

Есть какая то прога для ускорение процессов, не помню как называется, но ты ее точно найдешь по запросу "CS SpeedHack"




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 24 апреля 2007 23:25 · Поправил: s0larian
· Личное сообщение · #6

ToBad, обычно в таких простых играх есть ф-ция UpdateFrame() которая вызыватся бисто-бистро и часто-часто Она сначала пересчитывает координаты объектов в зависимости от текущего времяни а потом рисует всё это используя примитивы DirectX. Тебе надо ризбираться в том что где и как лежит.

Но, в конце концов, rendering патчить не надо, т.к, думаю, ты найдёшь константы скорости и времяни вращения тех колёс.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 25 апреля 2007 02:49
· Личное сообщение · #7

Veliant пишет:
ты ее точно найдешь по запросу "CS SpeedHack"


Утилитку нашёл, называется: Bubba's Warcraft Hack v1.5, но к сожалению игра под ней слетает.

s0larian пишет:
обычно в таких простых играх есть ф-ция UpdateFrame()


Тут всё это выполняется в коде таймера.

Dr3d пишет:
Ну если не слип, то может таймеры?


Да, точно, так и вышло.

Запустил под Идой, поставил бряки на все Sleep, GetTickCount, SetTimer, timeGetTime. Удалял функции, правил результаты, писал другие интервалы - на игру не влияет. Нашёл DXTimer, он влияет, но уменьшать некуда. Увеличиваю – тормозит, на 1 – работает обычно. Что же делать ?




Ранг: 103.3 (ветеран), 8thx
Активность: 0.060
Статус: Участник

Создано: 25 апреля 2007 04:10
· Личное сообщение · #8

как вариант - попробуй хучить QueryPerformanceCounter (блин, главное чтобы память меня не подводила) и в заглушке править интервалы. по-моему именно так работает половина SpeedHack'ов. только сомневаюсь что твоя игрушка на этом попадется.

либо скачай DelphiX (на котором судя по всему она написана), он опенсурсовый, посмотри какие механизмы использует DXTimer и вообще что может влиять еще на рендер.




Ранг: 116.9 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 25 апреля 2007 10:18
· Личное сообщение · #9

скорость увеличить можно, если отказаться от компонентов DelphiX и использовать хидеры отсюда www.clootie.ru/delphi/download_dx92.html#Headers и везде где можно использовать ассемблерные вставки.... А DelphiX оптимизировать смысла я не вижу...

-----
Nothing just happens. You choose it to happen.





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 25 апреля 2007 10:58
· Личное сообщение · #10

NaumLeNet пишет:
попробуй хучить QueryPerformanceCounter


Попробовал. Она вызывается один раз и присваивает переменной результат своей работы. Тут я тоже всячески правил, значительно увеличивал и уменьшал результат, обходил этот код вообще. На скорость геймплея не отразилось.

NaumLeNet пишет:
так работает половина SpeedHack'ов


Подскажи неплохие.

Viktoro пишет:
скорость увеличить можно, если отказаться от компонентов DelphiX


Я реверсю программку. Я не её разработчик. Даже не представляю, как возможно то, что ты предложил не имея исходников...




Ранг: 103.3 (ветеран), 8thx
Активность: 0.060
Статус: Участник

Создано: 25 апреля 2007 11:52 · Поправил: NaumLeNet
· Личное сообщение · #11

ToBad пишет:
Подскажи неплохие.


google. не помню названий, давно уже не щупал.

-> "либо скачай DelphiX (на котором судя по всему она написана), он опенсурсовый, посмотри какие механизмы использует DXTimer и вообще что может влиять еще на рендер.". <- имхо, самый правильный вариант.

я думаю других вариантов тут вообще нет. задача очень специфическая (какой-то адский самопал, да еще и DelphiX).

Viktoro пишет:
А DelphiX оптимизировать смысла я не вижу...


речи об оптимизации вообще нету. тут даже дело судя по всему не в тормозах, а в желании топикстартера "не ждать" пока сработает однорукий бандит ) или нечто подобное.




Ранг: 110.0 (ветеран), 1thx
Активность: 0.090
Статус: Участник

Создано: 27 апреля 2007 10:02 · Поправил: Satanael
· Личное сообщение · #12

Для ускорения игр есть проги : SpeadGear,xspeedx и пр.

Мне не нравится DelphiX, тормознутый слишком.
Лучше использовать движки например HGE (кому надо могу лого (powered by HGE) убрать из движка).
Но больше мне нравитя SpriteCraft, там можно выбирать DirectX, OpenGL. Написан с использованием COM так что программерить можно не только на Visual C++ но и на Дельфи да и на любом другом языке поддерживаемом технологию COM. Щас там вышла версия, можно на Питоне писать.
Вообщем:
[url=http://suda-chen.biz/
]http://suda-chen.biz/
[/url]

P.S. Забыл сказать это только для 2-х мерных игрушек.
http://www.spritecraft.com/ http://www.spritecraft.com/

-----
Никто не знает столько, сколько не знаю я





Ранг: 110.0 (ветеран), 1thx
Активность: 0.090
Статус: Участник

Создано: 27 апреля 2007 10:11
· Личное сообщение · #13

ToBad
Как вообще устроен механизм того, что бы и на слабом компьютере по возможности игра нормально работала и на очень хорошем не летала как ДОСовские ?
--
Есть два способа:
1) Ограничить количество фпс, например как в игре Oni там 60 лимит
В SpriteCraft это eng.DisplayEx(60);
2) Изменять скорость движения в зависимости сколько времени уходит на прорисовку всего изображения:
GetTickFrame - в миллесикундах.
Const speed=500
obj:=obj+speed*GetTickFrame/1000; (так примерно хз, не помню щас)

-----
Никто не знает столько, сколько не знаю я



 eXeL@B —› Программирование —› Можно ли увеличить скорость простой DirectX игры ?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати