|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.06.2008, 11:43 | #1 |
Пользователь
Регистрация: 11.03.2007
Сообщений: 92
|
Движение песка
Приветствую всех.
Написал програмку которая моделирует падение песка (грубо конечно, но по другому пока не получается), всё вроде хорошо, но довольно сильно тормозит. Кто может подсказать, где оптимизировать код? В архиве исходники и несколько карт. Последний раз редактировалось Format C:; 07.06.2008 в 11:52. |
07.06.2008, 12:49 | #2 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
вот это место:
Код:
У Вас там в Paint вызывается всего две процедуры. Лучше бы сначала посмотреть что медленнее - paintSand или moveSand и уже ее оптимизировать. |
08.06.2008, 12:54 | #3 |
Ra-Ra ?
Форумчанин
Регистрация: 06.03.2008
Сообщений: 286
|
Прикольно, тока странно что песок по стенкам ползает, оже вроде когда скатывается с поверхностей немного вперед пролетает =\\
|
08.06.2008, 13:56 | #4 | |
;-)
Пользователь
Регистрация: 18.07.2007
Сообщений: 69
|
Цитата:
Скрин профиля (куча 20х20, плотность 20): http://img59.imageshack.us/img59/777...profileky0.png |
|
26.06.2008, 07:48 | #5 |
Пользователь
Регистрация: 11.03.2007
Сообщений: 92
|
Привет всем.
2alexBlack: Я немножко не понял со ScanLine. Что не правильно в этой строчке. В ней я пытаюсь запихнуть данные с указателя в динамический массив, но программа слетает с ошибкой записи по адрессу. Код:
Тестовая программа в архиве. 2Net: Да, очень удобная штука. При отладке и оптимизации вещь незаменимая. |
26.06.2008, 08:31 | #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. Например Код:
|
26.06.2008, 10:38 | #7 | |
Пользователь
Регистрация: 11.03.2007
Сообщений: 92
|
2alexBlack:
Цитата:
Но почему не коррктно происходит присваивание с указателя, если массив динамический? |
|
26.06.2008, 11:23 | #8 | |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Цитата:
Код:
------------------------------------------- Что касается динамических массивов. Вы передаете адрес переменной, хранящей ссылку на динамический массив. По идее нужно писать: RGBArray^^:=TRGBArray(Bitmap.ScanLi ne[Index]^); но компилятор не поддерживает разименование динамических массивов. Можно, конечно, это обойти. Например: Код:
А значит, решение скорее всего не переносимо. И еще, создание динамического массива и копирование в него - это затраты по времени. Не проще ли использовать просто ссылку, как приведено в примере выше. Последний раз редактировалось alexBlack; 26.06.2008 в 13:00. |
|
26.06.2008, 13:51 | #9 | |
Пользователь
Регистрация: 11.03.2007
Сообщений: 92
|
2alexBlack:
Вроде как получилось, но есть один момент: Так как массив TRGBArray не динамический, он занимает почти 200Кб памяти, притом бОльшая часть его не используется. Можно ли как-нибудь уменшить размер, сохранив универсальность модуля? Что у меня получилось, можно посмотреть в архиве. Есть ещё недочёты? Цитата:
|
|
26.06.2008, 15:51 | #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 |