Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 187

Раздел: Delphi » Прочее
/ вопрос решён /

1. Перемещаю в игровой программе картинки Image в цикле While, используя Form.Update. При исполнении программы нервирует постоянное мерцание при перерисовке объектов. Используя вместо циклов таймеры, результат получше, но не хочу. Можно ли сделать вывод более мягким и сглаженным?

2. Как узнать количество принятых и переданных модемом данных в байтах?

Павлов Евгений Владимирович Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Павлов Евгений Владимирович (статус: Посетитель)
Вопрос отправлен: 7 декабря 2006, 01:16
Состояние вопроса: решён, ответов: 3.

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Павлов Евгений Владимирович!
1. Основная идея избавления от мерцания - не совершать промежуточных закрашиваний. При использовании TImage эти лишние отрисовки появляются. Вам нужно лучше использовать единое поле для рисования, скажем TPaintBox и отрисовывать в нем изображения самостоятельно методом Draw (он самый быстрый в GDI). Если картинка изменила свое положение Вы можете вычислять области, которые необходимо закрасить фоном, но не закрашивая текущее положение картинки. Если перемещения картинок сложные и этот вариант не проходит - заведите канву в памяти (используя TBitmap, т.к. TCanvas - виртуальный класс) и рисуйте на нем, а в конце, когда все отрисаванно - просто выводите на экран.

2. Начните искать с вот этой ссылки - http://delphi.about.com/od/fullcodeprojects/l/aa112903a.htm.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 7 декабря 2006, 03:19

Ответ #2. Отвечает эксперт: Dron

Здравствуйте, Павлов Евгений Владимирович!
1. Конечно, делать стандартными средствами графическую игру - это неправильно. Даже если вам удастся избавиться от мерцания, могут появиться новые проблемы. Например, если вы будете перемещать одновременно большое количество изображений. Для написания 2D-игр лучше использовать соответствующие готовые движки. Самый распространённый - DelphiX. Там никакого мерцания, естественно, не будет. При этом, конечно, вам потребуется какое-то время на изучение базовых принципов работы с движком.
Загрузить движок можно здесь: ftp://rada.evpanet.com/soft/UnDelphiX_D7.zip

Ответ отправил: Dron (статус: Студент)
Время отправки: 7 декабря 2006, 08:05
Оценка за ответ: 5

Комментарий к оценке: Спасибо за помощь. Любая информация полезна. Правда, я никогда не понимал использование готовых движков вместо собственных идей.

Ответ #3. Отвечает эксперт: Вадим К

Рекоменую уйти от отрисовки в цикле и перейти к отрисовке по таймеру/потоку. Мож это как бы сложно, но потом это окупиться десятикрат.
По поводу отрисовки. Для быстрой отрисовки я использую следующий приём. Рисую вначале на TBitmap,который создан динамчески в памяти, а потом одной строкой переношу на форму. Лучше рисовать в обработчике OnPaint по следующей причине: Windows в этот момент ожидает от вас отрисовки и не "мучиться сама".
В общем код для отрисовки схематически должен выглядеть так. Дополнительный поток, который реализует логику, анализирует клавишы, таймеры и решает, что куда поставить. Поменяв некоторые переменные, он вызывает PostMessage(Form1.handle, WM_Paint,0,0) и этим генерит сообщение о необходимости перерисовки. Windows ставит это сообщение в очередь и через некоторое время оно приходит к вашей проге. В ответ на это в обработчике OnPaint вы должны проанализировав переменные, отрисовать картинку.
Я не рекомендую использовать SendMessage по той причине, что она дожидается результата сообщения, а если в программе используются критические секции, то нарваться на взаимоблокировку - раз плюнуть. При таком подходе "дёрганий" картинки практически нет и скорость заметно повышается. Замечу, что если в очереди будет два сообщения WM_PAINT (ваша процедура не успевает их обработать) - то Windows вправе удалить эти сообщения.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 7 декабря 2006, 12:49
Оценка за ответ: 5

Комментарий к оценке: Ответ хороший но сложный для понимания начинающего, коим я являюсь, програмиста. Зато теперь я знаю в каком направлении двигаться. Правда, текст кода процедуры не помешал бы.А вообще я ценю любую помощь.

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 10 декабря 2006, 10:34; участников в обсуждении: 1.
Косолапов Дмитрий Юрьевич

Косолапов Дмитрий Юрьевич (статус: 8-ой класс), 10 декабря 2006, 10:34 [#1]:

Евгений, Вы говорите: "я никогда не понимал использование готовых движков вместо собственных идей", но в случае с использованием готового движка DelphiX Вы работаете DirectX, в частности, с DirectDraw, поэтому писать собственный движок для работы с DDraw, мягко говоря, нецелесообразно.

31 января 2011, 19:58: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:25
Выполнено за 0.02 сек.