Конференция "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), то это может быть вполне вариант - создавать потоки по числу реальных ядер, без гипертрединга.
 
Конференция "Media" » FastLIB (FastDIB) 4.0
Есть новые Нет новых   [134427   +38][b:0][p:0.001]