Конференция "Media" » FastLIB (FastDIB) 4.0
 
  • Sapersky (16.04.13 12:33) [0]
    Собрался наконец выложить свои наработки по Фастлибу в виде нового релиза библиотеки.

    Наиболее важные дополнения к функциональности:
    - поддержка x64
    - попиксельный альфа-блендинг
    - перспективное преобразование (наложение текстур)
    - квантизация/дизеринг
    - загрузка/сохранение картинок через GDI+
    - новый модуль для генерации текстур

    Примеры:
    - собраны в кучу примеры gordy, слегка подправлены под современное железо и x64
    - доработан пример с кубом для демонстрации новых фишек
    - генератор текстур (правда, только абстрактных узоров - пользы отечеству решительно никакой)
    - многопоточный (в смысле multi-threaded) симулятор воды
    - использование дизеринга и взаимодействие с TBitmap
    - сравнение различных способов масштабирования

    http://sourceforge.net/projects/tfastdib/files/Library/FastDIB%204.0/FastDIB%204.0.zip/download
  • DVM © (16.04.13 13:16) [1]

    > Sapersky   (16.04.13 12:33) 

    Здорово!
    Туда можно еще добавить для LibJpeg Turbo Интерфейс, а то IJL мягко говоря устарел, да и 64 бит его нету. Если надо для LibJpeg Turbo у меня есть подогнанный для 64 бит вариант заголовочных файлов.
  • brother © (16.04.13 14:49) [2]
    надо будет заценить, а то отказался от FastDIB_v3.9.9 в пользу Graphics32
  • Wladimir1987 © (16.04.13 15:34) [3]
    Sapersky

    классные примеры! Бамп понравился, но к сожалению демо воды даже не запускается, ни то что лежит в виде экзешника в архиве, ни после компиляции
    при запуске ошибка чтения адреса без выделения строки в дебаггере
    Использую XE3

    > ---------------------------
    > Application Error
    > ---------------------------
    > Exception EAccessViolation in module Water.exe at FFFFFFFFFFFFFAB9.
    >
    > Access violation at address 0000000000000AB9. Write of address
    > 0000000000000AB9.
    > ---------------------------
    > ОК  
    > ---------------------------


    Даже не знаю почему, ведь со всеми остальными примерами всё ОК :(
  • MBo © (16.04.13 15:49) [4]
    У меня всё запускается, но TexCube показывает чёрное окно без картинки
  • Sapersky (16.04.13 16:03) [5]
    Если надо для LibJpeg Turbo у меня есть подогнанный для 64 бит вариант заголовочных файлов.

    Давайте.
    У меня в 64 битах были какие-то проблемы, с ходу не заработало. А поскольку быстрая загрузка jpeg под x64 мне сейчас не особо нужна, решил ограничиться GDI+.

    надо будет заценить, а то отказался от FastDIB_v3.9.9 в пользу Graphics32

    Честно говоря, изменения не настолько принципиальны, чтобы порвать G32 как тузик грелку :) G32 всё-таки явно более солидный проект. С ходу могу назвать только 3 преимущества Фастлиба:
    1) Относительная простота.
    2) Скорость должна быть несколько выше.
    3) Поддержка разной глубины цвета иногда бывает полезна.

    при запуске ошибка чтения адреса без выделения строки в дебаггере

    Там в dproj может по умолчанию 64-битный режим включён, хотя он должен работать, но поставь на всякий случай 32-битный debug. Или просто удали файл dproj и открой dpr.
    Попробуй ещё брейк на первую строку и трассировать...

    У меня всё запускается, но TexCube показывает чёрное окно без картинки

    А если нажать A, T?
  • MBo © (16.04.13 16:14) [6]
    >А если нажать A, T?
    A, S, M - ничего
    B - в левом углу, где FPS - некая цветная чешуя выводится в четверть круга (~ 100 пикселов)
    T - появляется или исчезает куб с одноцветными гранями

    NVidia 8500 GT, настройки 3D по умолчанию, никогда не менял, так что возможно там что-то выключено.
  • Wladimir1987 © (16.04.13 16:39) [7]
    Sapersky

    > Там в dproj может по умолчанию 64-битный режим включён,
    > хотя он должен работать, но поставь на всякий случай 32-
    > битный debug. Или просто удали файл dproj и открой dpr.

    сделал, теперь в дебаггере начало выделять ошибки. С брейкпоинтом дошёл в модуле Threads_pool до 201 строки, в которой
    For n := si to ei do
     If ( Assigned(FOnExecuteObj) ) then Result := FOnExecuteObj(n) else
       If ( Assigned(FOnExecute) ) then Result := FOnExecute(n);



    на ней и вылетает ошибка чтения адреса! Есть идеи почему?
  • Sapersky (16.04.13 18:46) [8]
    A, S, M - ничего
    T - появляется или исчезает куб с одноцветными гранями
    NVidia 8500 GT, настройки 3D по умолчанию, никогда не менял, так что возможно там что-то выключено.


    3D по идее никак не должно влиять.
    Если есть возможность перекомпилировать, раскомментируйте в LoadTex строку:
    //  Tex[0].SetSize(256, 256, 32); ClearB(Tex[0], $FFFFFFFF);
    После этого должен рисоваться белый куб...

    теперь в дебаггере начало выделять ошибки. С брейкпоинтом дошёл в модуле Threads_pool до 201 строки, в которой
    For n := si to ei do
    If ( Assigned(FOnExecuteObj) ) then Result := FOnExecuteObj(n) else
      If ( Assigned(FOnExecute) ) then Result := FOnExecute(n);

    на ней и вылетает ошибка чтения адреса! Есть идеи почему?


    Именно на FOnExecuteObj? По идее он должен быть равен nil.
    Пройди ещё раз это место с F7, чтобы заходил внутрь функций. Возможно, падает всё-таки где-то внутри FOnExecute, которая должна вызываться.

    Можешь сделать свой упрощённый пример без многопоточности. Создаёшь TWater как у меня, по таймеру UpdateRain, Update, Draw.
  • Wladimir1987 © (17.04.13 00:08) [9]
    Sapersky

    > Именно на FOnExecuteObj? По идее он должен быть равен nil.
    >
    > Пройди ещё раз это место с F7, чтобы заходил внутрь функций.
    >  Возможно, падает всё-таки где-то внутри FOnExecute, которая
    > должна вызываться.


    прошу прощения. Нужно было написать точнее. FOnExecuteObj = nil.
    Вылетает на  If ( Assigned(FOnExecute) ) then Result := FOnExecute(n), то бишь на рекурсивном вызове из цикла
    до остального тела function TThreadPool.Execute(ThreadIdx : Integer): Boolean; после цикла не доходит. Один раз вылетела ошибка переполнения стека! Очень похоже на бесконечную рекурсию.

    Забыл упомянуть, что у себя запускаю 64-битной на Windows 7. Сегодня пзапустил на чужом компе с 32-х битной семёркой. Там всё работает замечательно
    Для сведения: там был процессор Intel Pentium Dual t2370, частота - 1.73 на ядро. Выдаёт 84-93 fps

    Просьба к Вам: Протестируйте пожалуйста, если есть возможность на похожей системе, как у меня. Думаю не годно что есть ошибки. Пусть красивое демо работает идеально! :)

    > Можешь сделать свой упрощённый пример без многопоточности.
    >  Создаёшь TWater как у меня, по таймеру UpdateRain, Update,
    >  Draw.

    Думаю могу тк уверен будет летать и на одном потоке, но не хочу отказываться от многопоточности,
    Есть и другая причина почему отписываюсь об ошибках: Когда делал очень тяжёлый по функционлу инсталл был очень рад кода будущие пользователи (несколько человек) нашли кучу багов различной степени коварности и тем самым помогли и мне и себе получить качественную программу. Вот и я хочу чтоб Демо воды работало как часы, короче хочу помочь улучшить.
    К слову: остальные примеры работают отлично. :)
  • Sapersky (17.04.13 01:58) [10]
    Вылетает на  If ( Assigned(FOnExecute) ) then Result := FOnExecute(n), то бишь на рекурсивном вызове из цикла
    до остального тела function TThreadPool.Execute(ThreadIdx : Integer): Boolean; после цикла не доходит. Один раз вылетела ошибка переполнения стека! Очень похоже на бесконечную рекурсию.


    Нет там никакой рекурсии. FOnExecute - это вызов коллбэка (ThreadExec в Water). Ну события, скажем так, примерно как TButton у себя внутри вызывает OnClick, который ты ему назначил.
    Попробуй раскомментировать
    //FPool.DisableMT := True;
    в Water.dpr (работать будет через TThreadPool, но в один поток)
    Ещё вот что: допиши sysutils в uses к water_sim. Возможно, тогда отладчик будет показывать конкретное место ошибки.

    Забыл упомянуть, что у себя запускаю 64-битной на Windows 7. Сегодня пзапустил на чужом компе с 32-х битной семёркой. Там всё работает замечательно
    Для сведения: там был процессор Intel Pentium Dual t2370, частота - 1.73 на ядро. Выдаёт 84-93 fps
    Просьба к Вам: Протестируйте пожалуйста, если есть возможность на похожей системе, как у меня. Думаю не годно что есть ошибки. Пусть красивое демо работает идеально! :)


    Я эту воду где только не гонял... P3, Atom, P4, разные вариации CoreDuo, i3, i5. На 64-х битной Win7 тоже, само собой.
    О, кстати, на AMD не гонял. На 3/6-ядерниках, в частности. Не?
    Есть ещё вероятность, что я испортил что-то в последней версии (гонял в основном не этот exe). Чтобы удостовериться, попробуй предыдущие:
    https://drive.google.com/folderview?id=0B_vHqwd58bsUa1lsNlJQMW5XYjQ&usp=sharing

    уверен будет летать и на одном потоке, но не хочу отказываться от многопоточности,

    Возможно, придётся таки отказаться.
    Чтобы скорость анимации была фиксированной, нужно использовать таймер. Чтобы получить высокую скорость - мультимедиа-таймер, обычный даёт максимум 20 FPS. Я пробовал его прикрутить (UseMMTimer = True в Water.dpr), но нормальной работы с многопоточностью так и не добился. На процессорах с гипертредингом получается гарантированная рассинхронизация потоков. Видимо, поток таймера как-то мешает. Вникать и отлаживать не слишком хочется, я уже наигрался с этой водой (потому и выкладываю). Если кто-то починит - хорошо...
  • Wladimir1987 © (17.04.13 02:48) [11]
    Sapersky

    > О, кстати, на AMD не гонял. На 3/6-ядерниках, в частности.
    >  Не?

    Нет, у меня i7-3610qm 2.30 ghz

    > допиши sysutils в uses к water_sim. Возможно, тогда отладчик
    > будет показывать конкретное место ошибки.

    Сделал, выделило While (not Terminated) do FOnExecute(FIndex); (345 строка в Threads_pool). С него я и дошёл до вышеупомянутого места вылета

    > Попробуй раскомментировать
    > //FPool.DisableMT := True;

    Заработало! :)

    > Есть ещё вероятность, что я испортил что-то в последней
    > версии (гонял в основном не этот exe). Чтобы удостовериться,
    >  попробуй предыдущие:
    > https://drive.google.com/folderview?id=0B_vHqwd58bsUa1lsNlJQMW5XYjQ&usp=sharing

    Ошибка на странице: http://imageshack.us/photo/my-images/17/72747639.png/
  • Sapersky (17.04.13 05:11) [12]
    Как обычно, в результате оказалась жуткая глупость: в Threads_pool
    Const
     MaxThreads = 4;
    Исправить на 8, конечно.
    Range Check сразу показал бы место ошибки, но при такой суровой борьбе за скорость мне как-то не пришло в голову его включать.
    Ещё имеется недочёт - чёрная полоса в самом низу, из-за округления размера буфера для одного потока. Но это уж потом.
  • MBo © (17.04.13 05:31) [13]
    >Если есть возможность перекомпилировать, раскомментируйте в LoadTex строку:
    >//  Tex[0].SetSize(256, 256, 32); ClearB(Tex[0], $FFFFFFFF);
    >После этого должен рисоваться белый куб...
    Да, белый рисуется (по T грани цветными становятся)
  • Wladimir1987 © (17.04.13 12:57) [14]
    Sapersky

    > Как обычно, в результате оказалась жуткая глупость: в Threads_pool
    > Const
    >  MaxThreads = 4;
    > Исправить на 8, конечно.

    Исправил и всё заработало. Спасибо! :)
    У меня выдаёт в среднем 440 кадров в секунду
  • DVM © (17.04.13 13:41) [15]

    > Sapersky

    При нажатии Water.exe вылетает под W7 64
  • DVM © (17.04.13 13:42) [16]

    > DVM ©   (17.04.13 13:41) [15]

    При нажатии B то есть
  • Wladimir1987 © (17.04.13 20:35) [17]
    Sapersky
    ещё кое-что:
    если установить MaxThreads = 8 и запустить со вкл. таймером на 32-битной семёрке то анимация глючит (верхняя половина изображения правильно "растекается", а нижняя с каким-то тормозом и артефактами), но при MaxThreads = 4 всё ОК

    DVM
    попробуйте сделать как описано в сообщениях 10 и 12, у меня такая же система как у Вас и теперь всё нормально!
  • Wladimir1987 © (17.04.13 20:40) [18]
    DVM
    пардон, на "B" у меня тоже вылетает правда не всегда сразу. Выделяет строку
    pc := Dst.Scanlines[y];

    (номер 595 в water_sim), Что-то с чтением адреса :(
  • Sapersky (17.04.13 21:17) [19]
    Да, белый рисуется (по T грани цветными становятся)

    Значит, проблема с загрузкой картинок. Если китайскую музу автора библиотеки в rotozoom видно (грузится из ресурса), то скорее всего с преобразованием имени файла.
    Посмотрите LoadTex -> gpLoadImage, поставьте брейк после StringToWideChar. Что там в буфере получается, корректное имя файла?

    > При нажатии  Water.exe вылетает под W7 64

    Опять затык с многопоточностью. Я обрабатывал сообщения, не дождавшись остановки доп. потоков (а "B" пересоздаёт буфер, с кот. они работают). "B" добавил недавно, поэтому не заметил.
    Исправленный exe-шник:
    https://docs.google.com/file/d/0B_vHqwd58bsUby1kRzBOeEc2b3c/edit?usp=sharing

    У меня выдаёт в среднем 440 кадров в секунду

    У меня пока рекорд на десктопном i5 (2.8 Ггц) - 480 кадров.

    Кстати, у кого топовое железо - i5, i7, бульдозеры - напишите, сколько FPS со стандартным размером окна.
    Исправленный exe по ссылке выше.

    если установить MaxThreads = 8 и запустить со вкл. таймером на 32-битной семёрке то анимация глючит (верхняя половина изображения правильно "растекается", а нижняя с каким-то тормозом и артефактами), но при MaxThreads = 4 всё ОК

    Про это я писал в [10] в конце.
    Если с четырьмя не глючит (не надо уменьшать MaxThreads, задавай кол-во потоков в строчке ThrUsed := CpuInfo.CPUCount в Water.dpr), то это может быть вполне вариант - создавать потоки по числу реальных ядер, без гипертрединга.
  • brother © (18.04.13 05:07) [20]
    > Кстати, у кого топовое железо - i5, i7, бульдозеры - напишите,
    > сколько FPS со стандартным размером окна.

    i5 2400 дает в максимуме 598, среднее 588 фпс.
  • MBo © (18.04.13 10:38) [21]
    >Значит, проблема с загрузкой картинок.
    Да, прошёлся по коду, дело действительно оказалось в путях картинок. Когда папку Images подложил в нужное место, заработало.
  • antonn © (18.04.13 11:27) [22]

    > Кстати, у кого топовое железо - i5, i7, бульдозеры - напишите,
    >  сколько FPS со стандартным размером окна.
    > Исправленный exe по ссылке выше.

    на i7 с пониженным потреблением (3770t) около 780, изредка падая на 680-700
  • Wladimir1987 © (18.04.13 18:24) [23]
    Sapersky

    [URL=http://imageshack.us/photo/my-images/824/50422227.png/][IMG]http://img824.imageshack.us/img824/8602/50422227.png[/IMG][/URL]
    Если я правильно понимаю то чёрное (по стрелкам) - некий фон, Можно ли поменять его цвет? Скрин сделал с Формы типа TForm из VCL.Forms и цвет клиентской области белый


    > Про это я писал в [10] в конце.
    >  На процессорах с гипертредингом получается гарантированная
    > рассинхронизация потоков.

    Как бы у меня он есть по умолчанию, то бишь 4 физических ядра становятся 8 логическими и всё нормально (метод CPUCount возвращает 8), пробовал с ThrUsed := от 1 до 8 в всё нормально (ну соответственно пропорционально падает fps), но к сожалению не посмотрел что возвращает CPUCount на 2-х ядерном проце из сообщения 9, но уверен там было число 2
  • Wladimir1987 © (18.04.13 18:25) [24]
    Sapersky
    Пардон, вот изображение http://imageshack.us/photo/my-images/824/50422227.png/
  • Sapersky (19.04.13 05:19) [25]
    > brother, antonn

    Спасибо. В общем, неплохо так для "канваса" :)
    FPS, возможно, плавает из-за того, что процессор динамически меняет частоту. Или фоновые приложения мешают.

    Если я правильно понимаю то чёрное (по стрелкам) - некий фон, Можно ли поменять его цвет?

    Выложил обновление исходников (+ exe) - там цвет фона передаётся параметром в конструкторе TWater.
    + убрал с чёрную полосу внизу и неподвижную рамку у картинки + все фиксы для многопоточности.
    https://docs.google.com/file/d/0B_vHqwd58bsUYnFsWUFqeVptRms/edit?usp=sharing
    Файл Utils положить в папку библиотеки.

    Как бы у меня он есть по умолчанию, то бишь 4 физических ядра становятся 8 логическими и всё нормально (метод CPUCount возвращает 8), пробовал с ThrUsed := от 1 до 8 в всё нормально (ну соответственно пропорционально падает fps), но к сожалению не посмотрел что возвращает CPUCount на 2-х ядерном проце из сообщения 9, но уверен там было число 2

    То есть в режиме UseMMTimer работает на i7 с любым количеством потоков, но глючит на 2-ядернике?
    Я у себя замечал глюки на Атоме с гипертредингом, поэтому решил, что дело в нём. На 2-ядернике изредка были небольшие подтормаживания одной половины воды.
  • Wladimir1987 © (19.04.13 10:12) [26]
    Sapersky

    > Выложил обновление исходников (+ exe) - там цвет фона передаётся
    > параметром в конструкторе TWater.
    > + убрал с чёрную полосу внизу и неподвижную рамку у картинки
    > + все фиксы для многопоточности.
    > https://docs.google.com/file/d/0B_vHqwd58bsUYnFsWUFqeVptRms/edit?
    > usp=sharing
    > Файл Utils положить в папку библиотеки.

    Спасибо за исправления и обновления! Что вы сделали, у меня теперь 550 (с волнами) - 640 fps? :)
    http://imageshack.us/photo/my-images/580/59095541.png/

    > То есть в режиме UseMMTimer работает на i7 с любым количеством
    > потоков, но глючит на 2-ядернике? .... На 2-ядернике изредка были
    > небольшие подтормаживания одной половины воды.

    Это глюк с тормозом половины воды (нижней) и был. В общем напилю различных екзешников (с таймером и без и вариациями кол-ва потоков) и пойду по возможности к другану на его двухядернике тестить, потом отпишусь
  • antonn © (19.04.13 12:30) [27]

    > FPS, возможно, плавает из-за того, что процессор динамически
    > меняет частоту. Или фоновые приложения мешают.

    у меня там TS и 4 виртуалки подняты :)
  • dmk © (20.04.13 13:44) [28]
    Стандартные размеры окна:

    Plasma - 291 fps
    Fumes - 503 fps
    Bump - 542 fps
    Rotozoom 233 fps
    TexCube - 173 fps
    Water - AV

    i7 990X 3.47 ГГц
  • Sapersky (20.04.13 18:02) [29]
    Что вы сделали, у меня теперь 550 (с волнами) - 640 fps? :)

    Да вроде почти ничего... обработку сообщений немного изменил. У меня FPS тот же, что и раньше.
    Кстати, выложи полноразмерный скриншот без пережатия в jpeg (на ipicture, например), что-то мне не очень нравится картинка.


    dmk ©   (20.04.13 13:44) [28]
    fpsWater - AV

    А с новой версией (по ссылке из [25])?

    BumpMap, кстати, быстрее работает под x64:
    https://docs.google.com/file/d/0B_vHqwd58bsUaUN3Ukh0UzZLTjA/edit?usp=sharing
    причём на одной машине у меня получилось почти в 2 раза быстрее, не очень понятно почему - вроде бы 64-битных вычислений там нет. На другой машине на 25% быстрее, что более правдоподобно, можно объяснить использованием доп. регистров (точно не скажу, пример не мой, влезать в потроха и разбираться лень).
    На других примерах, впрочем, ускорения нет, местами даже замедление. Особенно досталось Water в целочисленном варианте - похоже, x64 компилятор не умеет нормально работать со SmallInt, так что для x64 я включил по умолчанию floating point.
  • dmk © (20.04.13 19:56) [30]
    >А с новой версией (по ссылке из [25])?

    825 fps
  • Sapersky (21.04.13 02:24) [31]
    Как-то не очень впечатляет по сравнению с обычным i7 из [22], теоретически ведь должно быть в полтора раза быстрее, даже больше чем в полтора, с учётом частоты.
    Возможно, упирается в вывод битмапа на экран.
    Вот ещё версия:
    https://docs.google.com/file/d/0B_vHqwd58bsUSjVYWWo5Tm9EaW8/edit?usp=sharing
    здесь FPS - чисто расчётный, а Disp - с выводом на экран.
    Кроме того, теперь в заголовке пишет размер окна и общий объём данных. Можно помериться на бОльшем размере (если Антон захочет заново тестировать). На стандартном возможно тормозит межпоточная синхронизация.
  • Wladimir1987 © (21.04.13 02:37) [32]
    Sapersky

    > Да вроде почти ничего... обработку сообщений немного изменил.
    >  У меня FPS тот же, что и раньше.

    Пардон, fps на месте просто я не в дебаггере запустил и получил 600 +- и из удивления не сразу сообразил. Короче так и было! :)

    > Кстати, выложи полноразмерный скриншот без пережатия в jpeg
    > (на ipicture, например), что-то мне не очень нравится картинка.

    Вот:
    Дождь: http://s2.ipicture.ru/uploads/20130421/67NUlm3D.jpg
    С волной: http://s2.ipicture.ru/uploads/20130421/y25qZvYV.jpg
    =======================================================
    Вот тесты на двухядернике:
    Процессор: http://s2.ipicture.ru/uploads/20130421/pWZvu318.jpg
    ---------------------------
    -Без таймера:
    0. ThrUsed := CpuInfo.CPUCount (возвращает 2)
    http://s2.ipicture.ru/uploads/20130421/vLjqA9w5.jpg
    (нижняя тормозит)

    1. ThrUsed := 1 http://s2.ipicture.ru/uploads/20130421/4ic93lxp.jpg
    2. ThrUsed := 2 http://s2.ipicture.ru/uploads/20130421/fMXPVJNC.jpg
    3. ThrUsed := 3 http://s2.ipicture.ru/uploads/20130421/69PVGcEU.jpg
    4. ThrUsed := 4 http://s2.ipicture.ru/uploads/20130421/5aEWhbg7.jpg
    5. ThrUsed := 5 http://s2.ipicture.ru/uploads/20130421/0RVp3PYE.jpg (глюкнафты)
    ---------------------------
    С таймером:
    0. ThrUsed := CpuInfo.CPUCount
    http://s2.ipicture.ru/uploads/20130421/6OMrVKKD.jpg

    1. ThrUsed := 1 http://s2.ipicture.ru/uploads/20130421/7ZZ35YCV.jpg
    2. ThrUsed := 2 http://s2.ipicture.ru/uploads/20130421/oTcVho1P.jpg
    (верхняя половина глючит)

    3. ThrUsed := 3 http://s2.ipicture.ru/uploads/20130421/v6Q2xHWr.jpg
    (нижняя половина 2-3 кадра в сек.)

    4. ThrUsed := 4 http://s2.ipicture.ru/uploads/20130421/WjZ6iMQC.jpg
    (глючит всё)

    5. ThrUsed := 5 http://s2.ipicture.ru/uploads/20130421/uUBozk8m.jpg
    (п... - северный зверёк)
  • Wladimir1987 © (21.04.13 02:44) [33]
    дальше 5 не тестировал. Там скорее всего было бы также как и на 5. Всё нормально с 1 потоком!
  • dmk © (21.04.13 03:00) [34]
    Sapersky   (21.04.13 02:24) [31]

    новый результат получше: http://s2.ipicture.ru/uploads/20130421/5YQ7A1cB.jpg
    Но странная загрузка ядер. Я бы сказал недогрузка. Причем первое ядро загружено больше чем другие.
  • dmk © (21.04.13 03:17) [35]
    В общем странные графики. http://s2.ipicture.ru/uploads/20130421/MkE6fOSR.jpg
    3д макс когда рендерит загрузка 100% все 12 потоков. Даже курсор тормозит.
  • Sapersky (21.04.13 23:58) [36]

    > Wladimir1987 ©   (21.04.13 02:37) [32]

    Действительно был глюк, исправил.
    https://docs.google.com/file/d/0B_vHqwd58bsURGE3N0pVZy1URVk/edit?usp=sharing
    Сейчас режим UseMMTimer должен быть вполне рабочим, поставил его по умолчанию. Всё-таки симпатичнее, когда оно не мельтешит с бешеной скоростью.


    > dmk ©   (21.04.13 03:00) [34]

    Да, это уже около дела. Правда, у Антона расчётный FPS тоже должен быть выше...

    Что касается недогрузки - есть такое, у меня одно ядро 100%, другое 85%. Отчасти из-за того, что битмап приходится выводить на экран в первом потоке (в многопоточном варианте иногда мелькает или ещё как-то глючит). Отчасти из-за выбранной схемы многопоточности - есть главный поток, есть вспомогательные. Главный, кроме выполнения своей части обработки картинки, ждёт прочие потоки, добавляет капли дождя и обрабатывает сообщения. Поэтому видимо и получается неравномерная загрузка.

    Пытался компенсировать, задавая главному потоку несколько меньший размер картинки для обработки - не помогает, всё равно потоки какое-то время ждут друг друга. Видимо, для 100% нагрузки надо вообще всё переделывать. Может, как-нибудь займусь. А пока и так неплохо, особенно если сравнить с однопоточным режимом.
  • Wladimir1987 © (22.04.13 12:41) [37]
    Sapersky

    > Действительно был глюк, исправил.

    Спасибо, на двухядернике всё в порядке, теперь глюков нет, ну и у меня тоже! :)

    > Всё-таки симпатичнее, когда оно не мельтешит с бешеной скоростью.

    поддерживаю
  • antonn © (22.04.13 16:08) [38]

    > Да, это уже около дела. Правда, у Антона расчётный FPS тоже
    > должен быть выше...

    У меня там потоки на 80-85% загружены (и проц сам по себе медленнее "обычных" десктопных i7).
  • Sapersky (24.04.13 06:18) [39]
    Я о том, что "правильный" результат dmk (1100) получен без учёта вывода картинки. А твой (700) был с учётом. Без учёта на exe-шнике из [31] у тебя тоже должно быть больше. И тогда результат dmk перестанет быть правильным (в 1.5 раза больше, по кол-ву ядер).

    Понятно, что 6 ядер в любом случае круче 4-х, это моя демка плохо масштабируется на 8-12 потоках. Писалось и тестировалось в основном на двухядерниках, для которых недогрузка одного ядра не принципиальна, поэтому не обратил внимания. А сейчас перетряхивать архитектуру не хочется, да и некогда.
  • Wladimir1987 © (09.09.13 14:42) [40]
    Sapersky а если рисовать через Direct2D быстрее будет?
  • Sapersky (09.09.13 20:07) [41]
    Думаю, не будет.
    Я сравнивал вывод картинки из системной памяти на экран через GDI/DX7/DX9  - получилось более-менее одинаково, причём GDI показал самые стабильные результаты на разном железе. До D2D (фактически D3D11) ещё не добрался, но вряд ли там что-то принципиально изменилось.

    К тому же расчёт тормозит гораздо больше, чем рисование. В идеале надо переводить на шейдеры или OpenCL, примерно так:
    http://www.patriciogonzalezvivo.com/blog/?p=657
    Проблема с рисованием при этом отпадает сама собой - картинка уже в видеопамяти.
  • Wladimir1987 © (10.09.13 16:43) [42]
    Sapersky
    У Вас есть возможность перевести? Был бы очень благодарен!
    Мне пока знаний не хватает :(
    Кстати симуляция воды на виде по ссылке не такая красивая как у Вас. Напоминает тот пример, что я раньше находил
    исходник я удалил за ненадобностью, но вот скрин нашёл
    http://www.decoding.dax.ru/download/units/graph/WaterEffect.png
  • Sapersky (15.09.13 01:36) [43]
    Вряд ли это единственная статья во всей сети, ищи на русском по запросу "шейдер вода 2D" или как-то в этом духе.
    Что касается красоты - сишная демка, на основе которой я писал свою, тоже выдавала не слишком красивую картинку. Но я перешёл с 8-битных буферов на 16/32-битные и добавил освещение. С 3D-графикой такое тоже можно сделать.
  • Wladimir1987 © (18.09.13 17:27) [44]
    Sapersky

    > ищи на русском по запросу "шейдер вода 2D" или как-то в
    > этом духе.

    искал, и на английском тоже - ничего интересного

    > В идеале надо переводить на шейдеры или OpenCL

    немного прочитал про OpenCL - очень интересно. Скорость и платформонезависимость большой плюс. Вот только что ты имеешь виду?
    передавать вычисление алгоритма воды библиотеке или создавать потоки с её помощью?
    Судя по http://lab4.fme.vutbr.cz/heatlab/OpenCLforDelphi.html#Where_to_get_OpenCL_drivers_for_you
    бенчмарку при переводе на OpenCL может отпасть необходимость в многопоточности?
  • Sapersky (18.09.13 18:25) [45]
    Да, переносить вычисления.
    OpenCL'ное ядро (kernel) пишется так, чтобы обрабатывать один элемент данных, пиксель в данном случае. А OpenCL его вызывает для всех элементов/пикселей, автоматически распараллеливая по ядрам процессора или видеокарты.
    С шейдерами тот же самый принцип.
    И кстати, если захочется сделать эффективный вывод картинки на экран (не гонять её в системную память, потом обратно в видео через GDI), то всё равно придётся использовать OGL/DX, передавая им OpenCL'ные данные.
 
Конференция "Media" » FastLIB (FastDIB) 4.0
Есть новые Нет новых   [134427   +38][b:0][p:0.001]