![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 11.03.2007
Сообщений: 92
|
![]()
Приветствую всех.
Написал програмку которая моделирует падение песка (грубо конечно, но по другому пока не получается), всё вроде хорошо, но довольно сильно тормозит. Кто может подсказать, где оптимизировать код? В архиве исходники и несколько карт. Последний раз редактировалось Format C:; 07.06.2008 в 11:52. |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]()
вот это место:
Код:
У Вас там в Paint вызывается всего две процедуры. Лучше бы сначала посмотреть что медленнее - paintSand или moveSand и уже ее оптимизировать. |
![]() |
![]() |
![]() |
#3 |
Ra-Ra ?
Форумчанин
Регистрация: 06.03.2008
Сообщений: 286
|
![]()
Прикольно, тока странно что песок по стенкам ползает, оже вроде когда скатывается с поверхностей немного вперед пролетает =\\
|
![]() |
![]() |
![]() |
#4 | |
;-)
Пользователь
Регистрация: 18.07.2007
Сообщений: 69
|
![]() Цитата:
Скрин профиля (куча 20х20, плотность 20): http://img59.imageshack.us/img59/777...profileky0.png |
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 11.03.2007
Сообщений: 92
|
![]()
Привет всем.
2alexBlack: Я немножко не понял со ScanLine. Что не правильно в этой строчке. В ней я пытаюсь запихнуть данные с указателя в динамический массив, но программа слетает с ошибкой записи по адрессу. Код:
Тестовая программа в архиве. 2Net: Да, очень удобная штука. При отладке и оптимизации вещь незаменимая. |
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]()
А зачем еще раз копировать в буфер ?
возвращайте саму ссылку PRGBArray(Bitmap.ScanLine[Index]); Не вижу Вашего Вызова GetLine, но If Index>Bitmap.Height Then Exit; // index in 0..Bitmap.Height-1 //SetLength(RGBArray^, Bitmap.Height); // Bitmap.Width и с PRGBPixel - три байта это для 24-битного формата. Может быть и по-другому. Поэтому все-таки лучше использовать ссылку, которую возвращает ScanLine. То есть не использовать дополнительную функцию GetLine, а делать процедуру для каждого метода обработки и передавать в нее BitMap. Например Код:
|
![]() |
![]() |
![]() |
#7 | |
Пользователь
Регистрация: 11.03.2007
Сообщений: 92
|
![]()
2alexBlack:
Цитата:
Но почему не коррктно происходит присваивание с указателя, если массив динамический? |
|
![]() |
![]() |
![]() |
#8 | |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]() Цитата:
Код:
------------------------------------------- Что касается динамических массивов. Вы передаете адрес переменной, хранящей ссылку на динамический массив. По идее нужно писать: RGBArray^^:=TRGBArray(Bitmap.ScanLi ne[Index]^); но компилятор не поддерживает разименование динамических массивов. Можно, конечно, это обойти. Например: Код:
А значит, решение скорее всего не переносимо. И еще, создание динамического массива и копирование в него - это затраты по времени. Не проще ли использовать просто ссылку, как приведено в примере выше. Последний раз редактировалось alexBlack; 26.06.2008 в 13:00. |
|
![]() |
![]() |
![]() |
#9 | |
Пользователь
Регистрация: 11.03.2007
Сообщений: 92
|
![]()
2alexBlack:
Вроде как получилось, но есть один момент: Так как массив TRGBArray не динамический, он занимает почти 200Кб памяти, притом бОльшая часть его не используется. Можно ли как-нибудь уменшить размер, сохранив универсальность модуля? Что у меня получилось, можно посмотреть в архиве. Есть ещё недочёты? Цитата:
|
|
![]() |
![]() |
![]() |
#10 | ||
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]() Цитата:
TRGBArray = Array[Word] Of TRGBPixel; Это просто объявление типа. Места оно не занимает. Память распределяется при вызове ScanLine (столько, сколько нужно) и мы получаем ссылку на нее. Аэто: PRGBArray(Scan)^[I].R просто приведение типа. Если же Вы хотите создавать такие массивы, то вот так: Var RGBArray: TRGBArray; не нужно. Распределяйте память сами: Код:
Используйте ScanLine. Код:
procedure fillGradient(buf:TBitMap); Цитата:
например, Developer Studio 2006 Reference/Internal Data Formats На русском видел в описании от Borland Pascal 7.0. |
||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Движение картинки | &RiU | Помощь студентам | 2 | 28.05.2008 23:46 |
движение по эллипсу | Оля | Помощь студентам | 2 | 08.05.2007 00:50 |
Движение | Mickle | Общие вопросы Delphi | 5 | 19.04.2007 23:24 |
Движение по окружности | Mickle | Общие вопросы Delphi | 3 | 13.04.2007 16:24 |
Движение камеры | LepihinMS | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 2 | 16.03.2007 20:46 |