-
Собрался наконец выложить свои наработки по Фастлибу в виде нового релиза библиотеки. Наиболее важные дополнения к функциональности: - поддержка 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), то это может быть вполне вариант - создавать потоки по числу реальных ядер, без гипертрединга.
|