Хочу сварганить в немногое свободное время custom control, который будет показывать содержимое в DirectX 8.1. Должен быть в виде DLL, которая позволит создавать окна, отображающие в DX. Окна будут предназначены для создания телесуфлёров, бегушки и других динамических визуальных вещей. Нужны советы. 1. Хочется забирать как можно меньше ресурсов проца. Для этого есть D3DPRESENT_INTERVAL_ параметры. Лучше пользоваться ими или самому отслеживать состояние луча (через IDirect3DDevice8::GetRasterStatus) и действовать соответственно? 2. В рамках библиотеки лучше создать один IDirect3D8 интерфейс (в DllMainProc) и от него уже создавать IDirect3DDevice8 для каждого окна или лучше каждому окну делать свой IDirect3D8, IDirect3DDevice8 и т.д.? 3. Каждое окно должно жить в собственном треде или можно делать лишь сессию мультимедийного таймера, который нужное количество раз будет вызывать оконную функцию с требованием перерисовки? 4. Для выделения небольших участков памяти лучше пользоваться GlobalAlloc или функциями собственной кучи в моей ситуации в библиотеке, когда создаются разные окна для разных приложений? Не пинайте сильно, пожалуйста. Просто есть идея. Времени свободного мало, но порой хочется душу отвести - поработать в ассемблере и сделать что-то полезное.
Интересная задумка. Есть, кстати, какие-то готовые 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, куча будет локальная для каждого процесса. Не совсем понял смысл глобальной кучи.