![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Доброго времени суток!
Пишу игру — стратегию реального времени. Синхронность действий юнитов я сделал так: имплантировал в самодельный класс TUnit несколько таймеров, которые отвечают за движение, перерисовку, атаку и т.п. Возникла проблема: при больших количествах юнитов игра ощутимо тормозит — как будто бы я прохожу массив юнитов в цикле единственным таймером. Слышал, что решить проблему можно, используя потоки. Но понятия не имею, что это такое Это ведь не файловые потоки подразумеваются, а какие-то другие?Пожалуйста, подскажите, как достичь синхронности действий нескольких объектов. Заранее благодарен ![]() |
|
#2
|
||||
|
||||
|
Код:
interface
type
// класс потока
TMainThread = class(TThread)
private
protected
procedure Execute; override;
end;
var
// собственно сам поток
MainThread: TMainThread;Код:
implementation // на создание формы создаем и запускаем поток procedure TFMainForm.FormCreate(Sender: TObject); begin MainThread := TMainThread.Create(True); MainThread.FreeOnTerminate := True; MainThread.Priority := tpNormal; MainThread.Resume; end; Код:
procedure TFMainForm.FormClose(Sender: TObject);
begin
// на закрытие формы останавливаем поток если он существует
if Assigned(MainThread) then
if not MainThread.Terminated then
MainThread.Terminate;
end;Код:
// процедура выполнения потока, т.е. в ней пишем выполняемые действия
procedure TMainThread.Execute;
begin
// пока поток работает
while not Terminated do
begin
Synchronize(RepaintImage {здесь например может быть процедура перерисовки изображения} );
end;
end;И таких потоков можно запустить несколько, например 1 на прорисовку, 1 на AI, 1 еще на что-нибудь. И вообще если собираешься делать нормалью игру советую забить на средства GDI (они дико медленны) и пользовать либо готовые игровые движки, либо написать свой. Можно использовать DirectX SDK, вроде как там до сих пор есть DirectDraw - довольно неплох для вывода 2д графики. |
| Этот пользователь сказал Спасибо ~TB~ за это полезное сообщение: | ||
Lothlorien (13.02.2012)
| ||
|
#3
|
|||
|
|||
|
Цитата:
- OpenGL - библиотека 2-х и 3-хмерной графики; - OpenAL - библиотека звука. Со временем осилить шейдеры (язык GLSL под OpenGL) для того, чтобы часть вычислительной нагрузки переложить на GPU (процессор видеокарты). |
| Этот пользователь сказал Спасибо blazonic за это полезное сообщение: | ||
Lothlorien (13.02.2012)
| ||
|
#4
|
||||
|
||||
|
Советую второй из предложенных методов. Прорисовка графики, используя CPU - дело нехорошее. А в OpenGL все интуитивно понятно. Тогда для простой игры и потоки особо не понадобятся.
|
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Lothlorien (13.02.2012)
| ||
|
#5
|
||||
|
||||
|
Спасибо большое, ребята
![]() |