Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2014, 01:06   #1
NesterenkoAlex
 
Регистрация: 23.12.2013
Сообщений: 8
Печаль DirectDraw не работает в потоке

Пишу игру, в ней 2 потока, один физический другой графический.
печаль с графикой на DirectDraw.
Короче:
Граф. Поток рисует кадр на битмапе по кнвам точнее примитивами лини,прямоугольники. все рисуется все хорошо(было бы лучше если бы мне сразу сказали что битмап не Thread Safe былоб хорошо и уже пару недель назад.)

А вот при блитинге на внеэкранную поверхность чет ничего не происходит.
А может и не при блитинге.

в граф потоке после отрисовки на битмапе делаю так
Код:
while HR<> DD_OK do
     begin

       hr:=DDCopyBitmap(FImageBuffer, buf, w, h);
     end;
вот сама DDCopyBitmap:
Код:
function DDCopyBitmap(  DDSurface:IDirectdrawSurface7; Bitmap:Tbitmap;dx,dy:integer):Hresult;
var
hdcImage:HDC;
dc:HDC;
bm:Hbitmap;

begin
try
 result:=E_FAIL;
 if (Bitmap=nil) or (DDSurface=nil)  then
  exit;
 
 hdcimage:=createCompatibleDC(0);
 bm:=selectObject(HDCimage,bitmap.Handle);
 result:=FImageBuffer.GetDC(DC);
 if result=DD_OK then
   begin
     StretchBlt(DC,0,0,size.X,size.Y,hdcimage,0,0,dx,dy,SRCCOPY);
     DDSurface.ReleaseDC(dc);
     
   end;
   selectobject(hdcImage,bm) ;
   deleteDC(hdcImage);
finally
  result:=DD_OK;
  
end;

end;
никаких ошибок при выполнении не возникает он просто делает и думает что все норм. А при флипе поверхностей мерцание пустых страниц.


Раньше в место граф потока был цикл в форме работало нормально, но бывало случался такой баг: Графика рисовалась как надо, а физ поток сильно замедлялся. И на смену приоритетов не реагировал.

Итак! Как заставить директ драв рисовать в отдельном потоке а не на форме? Помогите плиз! ибо это все что меня тормозит он начала написания мультиплеера для этой геймы
NesterenkoAlex вне форума Ответить с цитированием
Старый 13.11.2014, 05:32   #2
NesterenkoAlex
 
Регистрация: 23.12.2013
Сообщений: 8
По умолчанию Блиииин!

Неужели никто мне не поможет!
NesterenkoAlex вне форума Ответить с цитированием
Старый 13.11.2014, 22:16   #3
NesterenkoAlex
 
Регистрация: 23.12.2013
Сообщений: 8
По умолчанию

Люди! Хелп! гуглить уже сил нет!
NesterenkoAlex вне форума Ответить с цитированием
Старый 14.11.2014, 08:35   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

А вот эта статейка не поможет? Статья
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 14.11.2014, 09:41   #5
NesterenkoAlex
 
Регистрация: 23.12.2013
Сообщений: 8
По умолчанию

Английского не знаю но по приведенным примерам кода понял что при доступе к поверхности нужно входить в критическую секцию. Вечером попробую. Побежал на пары. Спасибо.
NesterenkoAlex вне форума Ответить с цитированием
Старый 14.11.2014, 09:50   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от NesterenkoAlex Посмотреть сообщение
Английского не знаю но по приведенным примерам кода понял что при доступе к поверхности нужно входить в критическую секцию. Вечером попробую. Побежал на пары. Спасибо.
Гугл транслейт в помощь.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 14.11.2014, 22:23   #7
NesterenkoAlex
 
Регистрация: 23.12.2013
Сообщений: 8
По умолчанию Заработало!

После танца с бубном заработало, только я пока не понял почему!



Код:
function DDCopyBitmap(  DDSurface:IDirectdrawSurface7; Bitmap:Tbitmap;dx,dy:integer):Hresult;
var
hdcImage:HDC;
dc:HDC;
bm:Hbitmap;

begin
try
 result:=E_FAIL;
 if (Bitmap=nil) or (DDSurface=nil)  then
  exit;
 hdcimage:=createCompatibleDC(0);
 bm:=selectObject(HDCimage,bitmap.Handle);
 result:=FImageBuffer.GetDC(DC);
 if result=DD_OK then
   begin
     StretchBlt(DC,0,0,size.X,size.Y,hdcimage,0,0,dx,dy,SRCCOPY);
     DDSurface.ReleaseDC(dc);

   end;
   selectobject(hdcImage,bm) ;
   deleteDC(hdcImage);
finally
  result:=DD_OK;

end;

end;


в потоке начале потока сделал лок битмапа.
ну и для проверки
Код:
buf.Canvas.Font.Size:=36;
buf.Canvas.TextOut(0,0,'Работай cerf!');
как оказалось, что пока выяснял, что битмап не Threadsafe понахреновертил ереси. в итоге все вернул на исходную и вуаля! Работает.
NesterenkoAlex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из метода X в потоке А, вызвать метод Y и чтобы он работал в потоке B ? lawliet93 C# (си шарп) 0 09.03.2013 18:16
Создание/изменение/удаление файлов в потоке. Мониторинг файлов в потоке. The Real Kos Общие вопросы Delphi 5 22.10.2012 23:58
Проблемы с DirectDraw в VC++ Копоть Артём Помощь студентам 4 21.05.2011 23:36
winsock udp сервер в потоке, не работает при создании формы или обращению к VCL компоненту marikcool Работа с сетью в Delphi 1 01.10.2010 00:57
DirectDraw Kostia Gamedev - cоздание игр: Unity, OpenGL, DirectX 29 15.04.2008 22:35