DirectX control (нужны советы)

Тема в разделе "WASM.DirectX", создана пользователем SolidCode, 25 дек 2005.

  1. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Хочу сварганить в немногое свободное время custom control, который будет показывать содержимое в DirectX 8.1. Должен быть в виде DLL, которая позволит создавать окна, отображающие в DX. Окна будут предназначены для создания телесуфлёров, бегушки и других динамических визуальных вещей. Нужны советы.

    1. Хочется забирать как можно меньше ресурсов проца. Для этого есть D3DPRESENT_INTERVAL_ параметры. Лучше пользоваться ими или самому отслеживать состояние луча (через IDirect3DDevice8::GetRasterStatus) и действовать соответственно?

    2. В рамках библиотеки лучше создать один IDirect3D8 интерфейс (в DllMainProc) и от него уже создавать IDirect3DDevice8 для каждого окна или лучше каждому окну делать свой IDirect3D8, IDirect3DDevice8 и т.д.?

    3. Каждое окно должно жить в собственном треде или можно делать лишь сессию мультимедийного таймера, который нужное количество раз будет вызывать оконную функцию с требованием перерисовки?

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



    Не пинайте сильно, пожалуйста. Просто есть идея. Времени свободного мало, но порой хочется душу отвести - поработать в ассемблере и сделать что-то полезное.
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Интересная задумка.

    Есть, кстати, какие-то готовые GUI-либы работающие через OGL.





    1. Про D3DPRESENT_INTERVAL_ не знаю, справку по DX8 потерял, google что-то мало находит. :-(

    Это что-то вроде команды синхронизировать с обратным ходом луча?

    Если так, лучше отказаться. Судя по опытам с DX7 и инфы из DDK, драйвер делает опрес чего-то там, время будет впустую тратиться.



    Но если самому постоянно отслеживать сканлайн - опять будет опрос в цикле, время в пустую. Я делал так: если текущая линия меньше максимально возможной на данном разрешении на некоторое эмпирическое число, ждал по Sleep(1). Этот слип на самом деле будет ждать 15 мс, поэтому предварительно нужно вызвать timeBeginPeriod(1) - это нужно всего один раз (даже из чужей программы), после этого Sleep(1) будет ждать 2 мс.





    2. Насколько я понимаю DX, все получаемые интерфейсы - синглтоны, т.е. сколько ты раз будешь запрашивать интерфейс, столько раз вернут указатель на одну и ту же виртуальную таблицу. Лучше конечно проверить, что это так и есть :)

    Ну ещё счётчик ссылок там есть, но это мелочи, так что можно делать как удобнее.





    3. Треды довольно тормозная вещь, шедюлер в NT стандартно выделяет кванты по 15мс, это явно больше, чем надо для плавного вывода. Таймер - ещё хуже, точность у него никакая.



    Я бы делал всё в одном потоке, можно фиберы или что-то своё подобное прикрутить. Как таймер можно использовать туже синхронизацию с лучём - поставить туда диспетчер для вызова рендеров.

    Тут есть одна мелочь - обработчик оконных сообщений будет мешать. Можно его в основном потоке оставить, а рендер крутить в другом (лучше повысить ему приоритет).



    Вообще-то плавный скроллинг в виндосе вещь почти нереальная, всё равно изредка будет дёргаться (пропускать кадр), из-за других прог :-(





    4. GlobalAlloc в топку, HeapAlloc на современных системах надо вызывать (её и GlobalAlloc вызовет). Можно и свой менеджер памяти прикрутить, но экономия на этом непонятна - основное тратится на отрисовку и т.п.



    Если для разных приложений - каждое получит "свой" экземпляр dll, куча будет локальная для каждого процесса. Не совсем понял смысл глобальной кучи.
     
  3. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Большое спасибо за подробные идеи.

    Ещё варианты принимаются.