Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.05.2011, 01:45
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
Вопрос Проблема с одновременностью

Доброго времени суток!

Пишу игру — стратегию реального времени. Синхронность действий юнитов я сделал так: имплантировал в самодельный класс TUnit несколько таймеров, которые отвечают за движение, перерисовку, атаку и т.п.

Возникла проблема: при больших количествах юнитов игра ощутимо тормозит — как будто бы я прохожу массив юнитов в цикле единственным таймером.

Слышал, что решить проблему можно, используя потоки. Но понятия не имею, что это такое Это ведь не файловые потоки подразумеваются, а какие-то другие?

Пожалуйста, подскажите, как достичь синхронности действий нескольких объектов. Заранее благодарен
Ответить с цитированием
  #2  
Старый 12.05.2011, 12:56
Аватар для ~TB~
~TB~ ~TB~ вне форума
Начинающий
 
Регистрация: 17.02.2006
Адрес: Казахстан
Сообщения: 172
Версия Delphi: XE
Репутация: 1500
По умолчанию

Код:
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  
Старый 12.05.2011, 13:25
blazonic blazonic вне форума
Прохожий
 
Регистрация: 23.03.2010
Адрес: Украина, Киев
Сообщения: 29
Версия Delphi: 6, 7, 2006
Репутация: 12
По умолчанию

Цитата:
Сообщение от ~TB~
И вообще если собираешься делать нормалью игру советую забить на средства GDI (они дико медленны) и пользовать либо готовые игровые движки, либо написать свой. Можно использовать DirectX SDK, вроде как там до сих пор есть DirectDraw - довольно неплох для вывода 2д графики.
Поддерживаю. В свою очередь, предложу, как альтернативу писать игру на свободно распространяемых и кроссплатформенных библиотеках:
- OpenGL - библиотека 2-х и 3-хмерной графики;
- OpenAL - библиотека звука.
Со временем осилить шейдеры (язык GLSL под OpenGL) для того, чтобы часть вычислительной нагрузки переложить на GPU (процессор видеокарты).
Ответить с цитированием
Этот пользователь сказал Спасибо blazonic за это полезное сообщение:
Lothlorien (13.02.2012)
  #4  
Старый 12.05.2011, 15:00
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Советую второй из предложенных методов. Прорисовка графики, используя CPU - дело нехорошее. А в OpenGL все интуитивно понятно. Тогда для простой игры и потоки особо не понадобятся.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Lothlorien (13.02.2012)
  #5  
Старый 13.05.2011, 01:18
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
По умолчанию

Спасибо большое, ребята
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter