-
Собрался наконец выложить свои наработки по Фастлибу в виде нового релиза библиотеки. Наиболее важные дополнения к функциональности: - поддержка x64 - попиксельный альфа-блендинг - перспективное преобразование (наложение текстур) - квантизация/дизеринг - загрузка/сохранение картинок через GDI+ - новый модуль для генерации текстур Примеры: - собраны в кучу примеры gordy, слегка подправлены под современное железо и x64 - доработан пример с кубом для демонстрации новых фишек - генератор текстур (правда, только абстрактных узоров - пользы отечеству решительно никакой) - многопоточный (в смысле multi-threaded) симулятор воды - использование дизеринга и взаимодействие с TBitmap - сравнение различных способов масштабирования http://sourceforge.net/projects/tfastdib/files/Library/FastDIB%204.0/FastDIB%204.0.zip/download
-
> Sapersky (16.04.13 12:33)
Здорово! Туда можно еще добавить для LibJpeg Turbo Интерфейс, а то IJL мягко говоря устарел, да и 64 бит его нету. Если надо для LibJpeg Turbo у меня есть подогнанный для 64 бит вариант заголовочных файлов.
-
надо будет заценить, а то отказался от FastDIB_v3.9.9 в пользу Graphics32
-
Sapersky
классные примеры! Бамп понравился, но к сожалению демо воды даже не запускается, ни то что лежит в виде экзешника в архиве, ни после компиляции при запуске ошибка чтения адреса без выделения строки в дебаггере Использую XE3
> --------------------------- > Application Error > --------------------------- > Exception EAccessViolation in module Water.exe at FFFFFFFFFFFFFAB9. > > Access violation at address 0000000000000AB9. Write of address > 0000000000000AB9. > --------------------------- > ОК > ---------------------------
Даже не знаю почему, ведь со всеми остальными примерами всё ОК :(
-
У меня всё запускается, но TexCube показывает чёрное окно без картинки
-
Если надо для 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?
-
>А если нажать A, T? A, S, M - ничего B - в левом углу, где FPS - некая цветная чешуя выводится в четверть круга (~ 100 пикселов) T - появляется или исчезает куб с одноцветными гранями
NVidia 8500 GT, настройки 3D по умолчанию, никогда не менял, так что возможно там что-то выключено.
-
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); на ней и вылетает ошибка чтения адреса! Есть идеи почему?
-
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.
-
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.
Думаю могу тк уверен будет летать и на одном потоке, но не хочу отказываться от многопоточности, Есть и другая причина почему отписываюсь об ошибках: Когда делал очень тяжёлый по функционлу инсталл был очень рад кода будущие пользователи (несколько человек) нашли кучу багов различной степени коварности и тем самым помогли и мне и себе получить качественную программу. Вот и я хочу чтоб Демо воды работало как часы, короче хочу помочь улучшить. К слову: остальные примеры работают отлично. :)
-
Вылетает на 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), но нормальной работы с многопоточностью так и не добился. На процессорах с гипертредингом получается гарантированная рассинхронизация потоков. Видимо, поток таймера как-то мешает. Вникать и отлаживать не слишком хочется, я уже наигрался с этой водой (потому и выкладываю). Если кто-то починит - хорошо...
-
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/
-
Как обычно, в результате оказалась жуткая глупость: в Threads_pool Const MaxThreads = 4; Исправить на 8, конечно. Range Check сразу показал бы место ошибки, но при такой суровой борьбе за скорость мне как-то не пришло в голову его включать. Ещё имеется недочёт - чёрная полоса в самом низу, из-за округления размера буфера для одного потока. Но это уж потом.
-
>Если есть возможность перекомпилировать, раскомментируйте в LoadTex строку: >// Tex[0].SetSize(256, 256, 32); ClearB(Tex[0], $FFFFFFFF); >После этого должен рисоваться белый куб... Да, белый рисуется (по T грани цветными становятся)
-
Sapersky
> Как обычно, в результате оказалась жуткая глупость: в Threads_pool > Const > MaxThreads = 4; > Исправить на 8, конечно.
Исправил и всё заработало. Спасибо! :) У меня выдаёт в среднем 440 кадров в секунду
-
> Sapersky
При нажатии Water.exe вылетает под W7 64
-
> DVM © (17.04.13 13:41) [15]
При нажатии B то есть
-
Sapersky ещё кое-что: если установить MaxThreads = 8 и запустить со вкл. таймером на 32-битной семёрке то анимация глючит (верхняя половина изображения правильно "растекается", а нижняя с каким-то тормозом и артефактами), но при MaxThreads = 4 всё ОК
DVM попробуйте сделать как описано в сообщениях 10 и 12, у меня такая же система как у Вас и теперь всё нормально!
-
DVM пардон, на "B" у меня тоже вылетает правда не всегда сразу. Выделяет строку pc := Dst.Scanlines[y]; (номер 595 в water_sim), Что-то с чтением адреса :(
-
Да, белый рисуется (по 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), то это может быть вполне вариант - создавать потоки по числу реальных ядер, без гипертрединга.
-
> Кстати, у кого топовое железо - i5, i7, бульдозеры - напишите, > сколько FPS со стандартным размером окна.
i5 2400 дает в максимуме 598, среднее 588 фпс.
-
>Значит, проблема с загрузкой картинок. Да, прошёлся по коду, дело действительно оказалось в путях картинок. Когда папку Images подложил в нужное место, заработало.
-
> Кстати, у кого топовое железо - i5, i7, бульдозеры - напишите, > сколько FPS со стандартным размером окна. > Исправленный exe по ссылке выше.
на i7 с пониженным потреблением (3770t) около 780, изредка падая на 680-700
-
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
-
-
> 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-ядернике изредка были небольшие подтормаживания одной половины воды.
-
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-ядернике изредка были > небольшие подтормаживания одной половины воды.
Это глюк с тормозом половины воды (нижней) и был. В общем напилю различных екзешников (с таймером и без и вариациями кол-ва потоков) и пойду по возможности к другану на его двухядернике тестить, потом отпишусь
-
> FPS, возможно, плавает из-за того, что процессор динамически > меняет частоту. Или фоновые приложения мешают.
у меня там TS и 4 виртуалки подняты :)
-
Стандартные размеры окна:
Plasma - 291 fps Fumes - 503 fps Bump - 542 fps Rotozoom 233 fps TexCube - 173 fps Water - AV
i7 990X 3.47 ГГц
-
Что вы сделали, у меня теперь 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.
-
>А с новой версией (по ссылке из [25])?
825 fps
-
Как-то не очень впечатляет по сравнению с обычным i7 из [22], теоретически ведь должно быть в полтора раза быстрее, даже больше чем в полтора, с учётом частоты. Возможно, упирается в вывод битмапа на экран. Вот ещё версия: https://docs.google.com/file/d/0B_vHqwd58bsUSjVYWWo5Tm9EaW8/edit?usp=sharing здесь FPS - чисто расчётный, а Disp - с выводом на экран. Кроме того, теперь в заголовке пишет размер окна и общий объём данных. Можно помериться на бОльшем размере (если Антон захочет заново тестировать). На стандартном возможно тормозит межпоточная синхронизация.
-
-
дальше 5 не тестировал. Там скорее всего было бы также как и на 5. Всё нормально с 1 потоком!
-
-
-
> 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% нагрузки надо вообще всё переделывать. Может, как-нибудь займусь. А пока и так неплохо, особенно если сравнить с однопоточным режимом.
-
Sapersky
> Действительно был глюк, исправил.
Спасибо, на двухядернике всё в порядке, теперь глюков нет, ну и у меня тоже! :)
> Всё-таки симпатичнее, когда оно не мельтешит с бешеной скоростью.
поддерживаю
-
> Да, это уже около дела. Правда, у Антона расчётный FPS тоже > должен быть выше...
У меня там потоки на 80-85% загружены (и проц сам по себе медленнее "обычных" десктопных i7).
-
Я о том, что "правильный" результат dmk (1100) получен без учёта вывода картинки. А твой (700) был с учётом. Без учёта на exe-шнике из [31] у тебя тоже должно быть больше. И тогда результат dmk перестанет быть правильным (в 1.5 раза больше, по кол-ву ядер).
Понятно, что 6 ядер в любом случае круче 4-х, это моя демка плохо масштабируется на 8-12 потоках. Писалось и тестировалось в основном на двухядерниках, для которых недогрузка одного ядра не принципиальна, поэтому не обратил внимания. А сейчас перетряхивать архитектуру не хочется, да и некогда.
-
Sapersky а если рисовать через Direct2D быстрее будет?
-
Думаю, не будет. Я сравнивал вывод картинки из системной памяти на экран через GDI/DX7/DX9 - получилось более-менее одинаково, причём GDI показал самые стабильные результаты на разном железе. До D2D (фактически D3D11) ещё не добрался, но вряд ли там что-то принципиально изменилось. К тому же расчёт тормозит гораздо больше, чем рисование. В идеале надо переводить на шейдеры или OpenCL, примерно так: http://www.patriciogonzalezvivo.com/blog/?p=657Проблема с рисованием при этом отпадает сама собой - картинка уже в видеопамяти.
-
Sapersky У Вас есть возможность перевести? Был бы очень благодарен! Мне пока знаний не хватает :( Кстати симуляция воды на виде по ссылке не такая красивая как у Вас. Напоминает тот пример, что я раньше находил исходник я удалил за ненадобностью, но вот скрин нашёл http://www.decoding.dax.ru/download/units/graph/WaterEffect.png
-
Вряд ли это единственная статья во всей сети, ищи на русском по запросу "шейдер вода 2D" или как-то в этом духе. Что касается красоты - сишная демка, на основе которой я писал свою, тоже выдавала не слишком красивую картинку. Но я перешёл с 8-битных буферов на 16/32-битные и добавил освещение. С 3D-графикой такое тоже можно сделать.
-
Sapersky > ищи на русском по запросу "шейдер вода 2D" или как-то в > этом духе.
искал, и на английском тоже - ничего интересного > В идеале надо переводить на шейдеры или OpenCL
немного прочитал про OpenCL - очень интересно. Скорость и платформонезависимость большой плюс. Вот только что ты имеешь виду? передавать вычисление алгоритма воды библиотеке или создавать потоки с её помощью? Судя по http://lab4.fme.vutbr.cz/heatlab/OpenCLforDelphi.html#Where_to_get_OpenCL_drivers_for_youбенчмарку при переводе на OpenCL может отпасть необходимость в многопоточности?
-
Да, переносить вычисления. OpenCL'ное ядро (kernel) пишется так, чтобы обрабатывать один элемент данных, пиксель в данном случае. А OpenCL его вызывает для всех элементов/пикселей, автоматически распараллеливая по ядрам процессора или видеокарты. С шейдерами тот же самый принцип. И кстати, если захочется сделать эффективный вывод картинки на экран (не гонять её в системную память, потом обратно в видео через GDI), то всё равно придётся использовать OGL/DX, передавая им OpenCL'ные данные.
|