|
Вопрос # 187/ вопрос решён / |
|
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.
Ответ #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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|