|
|
Регистрация | << Правила форума >> | 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д графики. 00110001 00101100 00110110 00110001 00111000 00110000 00110011 00110011 00111001 00111000 00111000 00110111 00110100 00111001 00111000 00111001 00110100 00111000 00110100 00111000 00110010 00110000 00110100 00110101 00111000 00110110 00111000 00110011 00110100 00110011 00110110 00110101 00110110 |
Этот пользователь сказал Спасибо ~TB~ за это полезное сообщение: | ||
Lothlorien (13.02.2012)
|
#3
|
|||
|
|||
Цитата:
- OpenGL - библиотека 2-х и 3-хмерной графики; - OpenAL - библиотека звука. Со временем осилить шейдеры (язык GLSL под OpenGL) для того, чтобы часть вычислительной нагрузки переложить на GPU (процессор видеокарты). |
Этот пользователь сказал Спасибо blazonic за это полезное сообщение: | ||
Lothlorien (13.02.2012)
|
#4
|
||||
|
||||
Советую второй из предложенных методов. Прорисовка графики, используя CPU - дело нехорошее. А в OpenGL все интуитивно понятно. Тогда для простой игры и потоки особо не понадобятся.
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Lothlorien (13.02.2012)
|
#5
|
||||
|
||||
Спасибо большое, ребята
|