DiNGS – программирование игр в домашних условиях. Часть 10.2
АрхивПрограммазм (архив)Подпрограммы. Борьба с падением быстродействия.
Программируя PING PONG GOLD я столкнулся с катастрофическим падением быстродействия при использовании всех задуманных мной в игре спецэффектов. GeForce2 и 4 без проблем по плечу была вся графика с множеством скалинг, альфаблендинг и ротейшен эффектов, а вот мой Radeon 7200 еле шевелился. Как в старой притче – какой бы не был мощный процессор, программист всегда найдет способ загрузить его полностью.
Чтобы у вас не возникло вопросов, как обуздать самые прожорливые эффекты для слабых машин, я и подниму этот вопрос. Вспомните игры созданные для 386-486 компьютеров. Тогда в играх был такой пункт, как выбор качества графики. При выборе MIN вы лишались каких-то эффектов и даже объектов на экране, но получали существенное приращение скорости. При MAX наслаждались полным великолепием графики, если компьютер позволял.
В старые годы, когда я писал на Паскаль + Ассемблер (в такой же связке другими программистами были написаны бесподобные «Охотник на дороге» и «Turrican2») даже 386 компьютер позволял создавать очень красивые и динамичные игры на моем игровом движке написанном благодаря туторам Асфиксии (но он был в 4 раза быстрее аналога из тутора). Но сегодня в нашем распоряжении просто удивительной красоты эффекты (пусть и очень прожорливые) и нет оправдания, если их не использовать.
Итак, ваша игра жутко стала тормозить. Нужно начать с того, что необходимо найти виновника. Пусть у нас есть 20 строчек выполняющих загрузку графики. Комментируем одну из строк, компилируем по F5 и смотрим исчезли ли тормоза. Нет, продолжаем поиск. Рано или поздно вы выясните, что вот этот спрайт с гигантской планетой, попадая в фокус меняющего прозрачность лунного света и нескольких движущихся прозрачных фонов заставляем компьютер превращаться в черепаху (как и было у меня в PINGPONG GOLD). Вводим переменную Grafix_MAX. Если используем графику на максимуме, эта переменная равна 1, на минимуме – 0.
Пример показывающий на практике этот подход:
Grafix_MAX=1 LOADSPRITE "planet.bmp",10 LOADSPRITE "ball.bmp",11 LOADSPRITE "bita.bmp",12 LOADSPRITE "moon.bmp",13 WHILE TRUE SPRITE 10,100,150,0 SPRITE 11,150,180,0 SPRITE 12,200,350,0 IF Grafix_MAX=1 SPRITE 13,100,150,0 ENDIF SHOWSCREEN WEND END
Объяснение исходника:
Устанавливаем значение переменной Grafix_MAX в 1. Загружаем графику. Отображаем спрайт 10. Отображаем спрайт 11. Отображаем спрайт 12.
Если значение Grafix_MAX=1 , тогда показываем еще и спрайт 13. Если же значение будет другим, то спрайт тормозящей игру планеты moon.bmp показан не будет, что повысит скорость игры.
Далее уже вы можете благодаря такому подходу скомпилировать несколько версий игры – для слабых и мощных компьютеров (или для бесплатной версии игры и коммерческой).
Можете это вынести в меню, где перед началом игры плэйер сам сможет выбирать качество графики. Можете вынести данные в отдельный файл и тогда он будет подгружаться в игру извне (типа config.exe в старых играх) и сохранятся также во внешний файл. Об этом я расскажу ниже.
А пока мы переходим к одной из интереснейших тем – игровым ЭФФЕКТАМ. Пора добавить в игру эффекты ротации, что по-русски означает – вращение спрайтов.
(Продолжение следует)