понедельник, 12 сентября 2011 г.

PIMPL

Дело было вечером, делать было нечего : ) Почитал об этой идиоме (pointer to implementation). Мне как-то раньше объясняли что это такое! Да так объяснили, что я чуть не поседел, решив, что это что-то мегозаумное, жёсткое в реализации и вообще только для программеров over9000 уровня )

Погуглил, прочитал за пару минут первую попавшуюся статью и.. ОМГ, дак тут то идея, которая будет понятна любому школьнику ))) Оказалось - мне СЛИШКОМ извращённо объясняли и ещё я сам идею юзал уже давно, правда слегка не так, а по-своему :3

Переписал систему ввода с каноничной идеей PIMPL ) Впринципе чуть-чуть красивше смотрится, чем раньше ^__^

А, кстати, обновил железо чуть-чуть : ) Заменил видеокарту! Раньше стояла gf 8600 gts, а теперь купил и поставил gf GTX 550 Ti ! Жырнота! Разница огромная!! Особенно это заметно при массивной выборке текстур - так в 8600 скорость выборки была примерно 8 гигатекселей в секунду, теперь же 28 гигатекселей : ) И те тяжёлые места в моих сценах, где ФПС падал до 30 теперь выдают не меньше 250 ФПС!

Блин, такая видяха расслабляет : \ Как бы не наговнокодить с ней :D Что ещё радует кроме высокой производительности - полная аппаратная поддержка DirectX11! О да!! Можно пощупать тесселяцию и динамическую линковку шейдеров ^^ Да и собсно писать полноценный именно DX11 рендерер для движка : )

Ах да, насчёт рендеров. У меня в движке реализован мультирендеринг. Тоесть могу рендерить сцену хоть через DX9-11, хоть через OpenGl, да хоть через софтварный рендерер : )) 9кстати новая версия софтрендера сейчас в разработке - юзаю блочную растеризацию и MMX). Но есть тут мааааленькая проблема - линковка gAPI библиотек : \

В поле Additional dependencies настроек линковки проекта я прописываю нужные lib-ы, они линкуются к библиотеке проекта и всё прекрасно работает! НО! Представим ситуацию, когда у меня реализован рендеринг на DX9 и глупо запрещать запуск на Windows XP. Как, собсно, запускать на XP мой проект?? Когда он слинкован с DX11 либами. которых в XP может и не быть! о_О

Раньше я юзал M$-only фичу #pragma comment (lib, "blablabla.lib") и, впринципе, указав дефайнами набор рендереров можно было отключить какую угодно версию DX и для XP собрать версию без DX11. Но это смотрится больше как костыль : (

Единственным годным решением пока вижу вынесение рендереров в отдельные DLL как плагины и подгрузку нужной библиотеки уже во время зщапуска руками : ) Кстати, так у меня было изначально! И систему плагинов я НЕ удалил ; )

Но, думаю, пока рано над этим заморачиваться! Рендереры описаны в отдельных классах в отдельных файлах ) Поэтому перенести в DLL - не составит особого труда.

The end. Ушёл дальше покорять мир!

5 комментариев:

  1. Мне кажется горячая смена ГАПИ довольно бесполезная фича, которая к тому же порождает кучи костылей в архитектуре, типа определение в каком гапи создана конкретная текстура. да и сама подмена гапи в рантайме выглядит как-то глупо, учитывая что, выбор делают разработчики еще на стадии разработки.
    поэтому ИМХО, для мультигапи нужно использовать только статическую типизацию, чтоб после компиляции гапи уже нельзя было сменить, это удобно если есть сервер и клиент которые используют один и тот же код, но разница в том что серверу не нужно выводить ничего на экран, поэтому его нужно компилить с NULL девайзом.
    поэтому подумай, действительно ли это все нужно и будет ли использоваться, так как перформанс оно будет хавать (виртуальные вызовы, невозможность инлайна)

    ОтветитьУдалить
  2. В визуал-студии помимо конфигурации debug\release есть еще переключатель "платформа". Ты можешь определеить отдельные конфигурации для window 7/windows VISTA и для Windows XP, и в настройках для каждого из них прописать нужные библиотеки.

    ОтветитьУдалить
  3. Pushkoff - тут скорее речь идёт не о СМЕНЕ GAPI в рантайме а в выборе - какой юзать на данной платформе! Тоесть движок проверяет - на какой ОС он запущен, относительно этого делает выбор - какую DLL подгрузить!

    To "товарисч со звучным ником" : да, настроить так можно : ) Но фишка в том, что билды будут каждый под свою ОС! DX9 билд, DX10 билд, DX11 билд! И нужен ещё какойнить Launcher, который будет определять нужный EXE-шник и запускать его под конкретной ОС. Я же хочу просто вынести реализации рендереров в отдельные DLL! Движок сможет определить хостовую ОС и подгрузить нужную DLL : )

    Pushkoff - ну так у меня всёравно вызовы виртуальные все! И большинство ресурсов обёрнуты в мои классы - интерфейсы. Поэтому тут не так страшно. Вот байда с синглтонаими будет - эт да (внутри DLL будет создаваться второй экземпляр D:)

    ОтветитьУдалить
  4. > Pushkoff - ну так у меня всёравно вызовы виртуальные все!
    а вот это очень печально
    почитай блог mike acton, он часто постит про отказ от сурового ООП и получаемый при этом профит

    ОтветитьУдалить
  5. Я ещё ни разу не упирался в производительность юзая виртуальные методы на таком высоком уровне. Когда делал всякие там атомарные операции в софтрендере с использованием ООП на C# - это было жестоко, да. Но тут.. вызовы DIP-ов, инициализации, очистки текстур и всяких прочих функций - не верится, что именно здесь ООП даст суровый оверхед. Хотя половину классов в интервейсе рендерера я собираюсь вскоре убрать - жырнота!

    ОтветитьУдалить