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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2008, 21:35   #481
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Так ведь задача не стоит "во что бы то не стало использовать высокосортный бетон" ))) ...это прямой намек тогда переходить на С++, или как сам сказал "Взять к примеру какой нибудь OGL движок" - и бетон есть и уже целые конструкции.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 09.05.2008, 23:28   #482
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Это уже совсем конкретика пошла ) Я имел ввиду вобщем. Разделение труда. Системное программирование это одно, прикладное другое.
К примеру OpenGL, открытая библиотека, к играм имеет прямое отношение, но ведь разрабатывать библиотеку это одно, а писать игры на ней это другое. Никто ведь не пишет для себя свою GL, а используют наработки других людей.
Если даже и задаться целью написать свою графическую библиотеку (не движок, а библиотеку вроде OGL и DX) к-рая будет лучше других, то это будет основная цель, если какие-то игры и будут писаться то лишь тестовые для проверки работы библиотеки. Взять к примеру Линукс, приблизительно так он и появился.

Насчет С++, я не считаю что на Delphi так уж плохо игры писать. Просто наверное так сложилось, что есть уклон в сторону С++. Многие кто начинал с Дельфи потом на Сях пишут. Может окружение сказывается, почти вся инфа на С++, надоедает переводить видимо. Сами библиотеки на С++.

Кстати системщину лучше писать не на С++, а на С. Тот же автор Линукса нелицеприятно отзывался о С++ в системном программировании.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 10.05.2008, 15:16   #483
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Все верно, профи-программисты создают библиотеки, профи-игростроители пользуются ими, всем хорошо.
Просто "спортивный" интерес "можно ли обойтись без OGL и DX?" ...конечно можно, ...хочу доказать на примере нашего проекта. В связи с этим просто перебираем весь "стандарт" и выкидываем лишнее. Тысяча якорей для одной лодки - слишком много.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 10.05.2008, 18:30   #484
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
А как в Image найти Pointer на данные?, ...я чет тоже плутал, ...в Graphics.pas залез, но так и не нашел.
image1.Picture.Bitmap - такой же bitmap как и все остальные.
Kostia вне форума Ответить с цитированием
Старый 10.05.2008, 19:56   #485
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Kostia
image1.Picture.Bitmap - такой же bitmap как и все остальные.
Эт само собой, но Pointer на начало данных мне пока не извлечь, только если ScanLine, но это только на одну строку. Буфера же Handle, созданы через CreateDIBSection, Pointer на начало данных определяется.
И как заметил mutabor - "все равно чтобы это вывелость на экран, нужно будет вызвать один из методов обновления", ...методы стандартные конечно, самый быстрый Canvas.Draw вывод в PaintBox или Image, но все ли там нужно только для вывода на экран? ...может что-то "якорит"?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 10.05.2008, 23:30   #486
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Мне тоже хотелось бы разобраться с этим вопросом. Есть некоторые сомнения. Сейчас попробую сформулировать.

Во первых. Чтобы убрать все лишнее, можно использовать чистые вызовы API.

Код:
procedure TForm1.WMPaint(var Message: TWMPaint);
begin
   DC := Message.DC;
   if DC = 0 then DC := BeginPaint(Handle, PS);
   try
      // Здесь вывод буфера, который мы нарисовали на экран
      // DrawBuf получен вызовом CreateDIBSection из примера Beermonza
      BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, DrawBuf.Canvas.Handle, 0, 0, SRCCOPY);
   finally
      if Message.DC = 0 then EndPaint(Handle, PS);
   end;
end;
// КорОче уже некуда. Это к вопросу о "якорях". Собственно так и устроен WMPaint TForm1
// Только там добавлены еще методы блокировки и вывод делается сложнее
// Сам буфер формируем не более 30 раз в секунду или в Idle или по таймеру
procedure TForm1.Timer1Timer(Sender: TObject);
var M:TWMPaint;
begin
   // рисуем кадр
   fillChar(scr^, W*H*3, C);

   // Вывод на экран
   // Можно сделать refresh
   //refresh;
   // или прямой вызов
   M.DC := 0;
   WMPaint(M);
end;
--------------------
Теперь о сомнениях. Понятно, как делать все это по правилам WinAPI.
Непонятен сам внутренний механизм вывода на экран. Как это устроено.

К примеру. Когда мы создаем HBitMap, мы указывает контекст устройства. Это сделано для того, чтобы были одинаковые вызовы рисования на канве и на bitMap. Я правильно рассуждаю ? Тогда почему для получения указателя на внутренний буфер GetDIBBits мы должны указывать оба хендла ? Разве HBitMap для этого недостаточно.

Почему, получив Form1.Canvas.Handle мы можем скопировать с него, например, область (-10, -10, 0, 0) и там будет изображение с экрана выше и левее левого угла формы ? Да хоть весь экран получить можно.

Есть сомнения насчет CreateDIBSection. Дело в том, что если создавать этот буфер в методе WM_Paint:

DrawBuf.Handle:=CreateDIBSection(Ca nvas.Handle,BInfo,DIB_RGB_COLORS,Sc r,0,0);
fillChar(scr^, W*H*3, C);
BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, DrawBuf.Canvas.Handle, 0, 0, SRCCOPY);

то C мы можем менять (например, таймером) и меняется цвет области.
Если же создавать один раз - в formCreate, то первый-же вывод на экран
bitBlt как бы блокирует ссылку src и fillChar(scr^ уже не работает
(ошибки при этом не возникает, просто цвет не меняется).

м.б. кто-то объяснит механизм - как это может быть устроено. Не в подробностях, а схему. Windows отдает нам Handle канвы, а что
она при этом создает ?

Пробовал порассуждать как это может устроено. Думаю, что буфер один - на весь размер экрана. Скорее всего его вообще нет - используется окно видеокарты. Handle указывает на структуру, которая хранит только координаты области внутри этого буфера и некоторые другие параметры, которые нужны для вызовов и переключатель - вывод в видеопамять или в буфер в памяти. Если буфер в памяти, то это BitMap. Вот на этот буфер GetDIBits дает нам ссылку.
alexBlack вне форума Ответить с цитированием
Старый 12.05.2008, 17:11   #487
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Цитата:
...может что-то "якорит"?
CPU он не предназначен для графики, вот это самый главный "якорь".
Цитата:
Эт само собой, но Pointer на начало данных мне пока не извлечь, только если ScanLine, но это только на одну строку.
Элементарно, создаешь еще один bitmap и склеиваешь его с битмапом image.

Теперь предложение может стоит воспользоваться Direct3D или OpenGL? На GDI всеравно не сделать быстрого вывода, а на D3D или OGL даже с кривыми руками будет быстрее.
Kostia вне форума Ответить с цитированием
Старый 12.05.2008, 21:34   #488
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Kostia
Теперь предложение может стоит воспользоваться Direct3D или OpenGL? На GDI всеравно не сделать быстрого вывода, а на D3D или OGL даже с кривыми руками будет быстрее.
Рученки у нас прямые, и на D3D можем наворочить неслабо, ...только задача так не стоит: "перебираться на DX, OGL и D3D , т.к. они быстрее...", ...задача - "максимально убыстрить вывод графики в оконном режиме Windows".

Цитата:
Сообщение от Kostia
CPU он не предназначен для графики, вот это самый главный "якорь".
Как раз он все рисует в буферах мгновенно, и без вывода на экран работает все равно что на "холостом ходу", даже если искусственно завысить fps до 1000. А вот якорь - это метод вывода Windows.

alexBlack, или я баран, или одно из двух , ...твой пример у меня так и не заработал, показывает серость формы. PS - это переменная типа TPaintStruct, DC - THandle контекст устройства, куда выводим графику. Как понял из литературы, контекст вызывается приватный BeginPaint() .. EndPaint(), чтобы он работал необходимо при регистрации класса окна указать стиль CS_OWNDC. В остальных случаях нужно выводить общий контекст:

Код:
var
hdc: THandle;

...

// вот так прямо в форму
hdc:= GetDC(Form1.Handle);
...
//один из методов отрисовки
...
ReleaseDC(Form1.Handle,hdc);
DeleteDC(hdc);
Есть еще вместо отрисовки применяется SelectObject(), как им пользоваться пока непонял.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.05.2008, 22:09   #489
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А может я что-то не то нагородил. Прикреплю-ка свой проект.
Там со всеми тестами (закомментированными), которые приходили в голову.
Это не я придумал. Я просто взял код из VCL и убрал все лишнее, с моей точки зрения.

Код:
TCustomForm.WMPaint 
 ...
 ->PaintHandler

procedure TWinControl.PaintHandler(var Message: TWMPaint);
var
  I, Clip, SaveIndex: Integer;
  DC: HDC;
  PS: TPaintStruct;
begin
  DC := Message.DC;
  if DC = 0 then DC := BeginPaint(Handle, PS);
  try
   ...
  finally
    if Message.DC = 0 then EndPaint(Handle, PS);
  end;
end;
Насчет приватного контекста. Пробовал CS_OWNDC - так и не понял в чем разница. В справочнике написано, что его можно не удалять после вызова WMPaint, но не понял как это можно проверить.

По поводу SelectObject. По-моему он не позволяет выбрать текущий BitMap для канвы.
---------------------------------
Вы меня натолкнули на одну мысль. По-крайней мере с одним вопросом из тех, что я приводил выше стало понятно. Дело в том, что DC можно получить вызовом BeginPaint только в WMPaint. Вне него нужно вызывать GetDC. Вот поэтому у меня не получалось записыватьв буфер повторно. Во вложении этого нет, но нужно переделать так:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var M:TWMPaint;
begin
   fillChar(scr^, W*H*3, C);  // C - меняется по таймеру 
   M.DC := getDC(handle);
   WMPaint(M);
   releaseDC(Handle, M.DC);
end;
а в WMPaint fillchar перед bitBlt убрать. Тогда формирование кадра будет только в onTimer, а в WMPaint только вывод буфера на канву.
Вложения
Тип файла: rar project1.rar (94.7 Кб, 63 просмотров)

Последний раз редактировалось alexBlack; 12.05.2008 в 22:37.
alexBlack вне форума Ответить с цитированием
Старый 13.05.2008, 12:14   #490
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
...задача - "максимально убыстрить вывод графики в оконном режиме Windows".
Я думаю во первых нужно отказаться от VCL, это надстройка и понятно скорости не прибавляет. Опускаемся глубже, остается WinAPI, но и там нам предлагают абстрактные функции вывода, недалеко ушедшие от VCL, укажите это, укажите то - получите картинку.
WinAPI если я не ошибаюсь для вывода графики использует gdi32.dll, то есть по идее функции описаны там. Еще я читал что в WinXP GDI не простой, а GDI+ - более навороченый, c поддержкой дополнительных форматов, с альфаканалом.

По моим замерам что VCL что WinAPI выводят графику практически с одинаковой скоростью, видимо перенаправление вызова не так уж и тормозит. Это типа Вася скажи Феде пускай вагон разгрузит, если сказать Феде напрямую, вагон будет выгружен ненамного быстрей

По поводу всех этих WinAPI экспериментов с контекстами и т.п.
Все это написали майкрософтовцы для использования программистами. Реальный же вывод на экран, скрыт за этими функциями и объектами и нам не виден. Нам дают только кнопку. И к этой же кнопке обращается VCL.

Цитата:
Просто "спортивный" интерес "можно ли обойтись без OGL и DX?" ...конечно можно, ...хочу доказать на примере нашего проекта
Так это и так понятно что можно, но не такую же графику и не с такой же скоростью, как ни крути, если ускорить и можно то незначительно и существенно ситуацию это не изменит.
Основная проблема к-рую можно предвидеть уже сейчас, тормоза на слабых процессорах. Чего не было бы с поддержкой видеокарты, можно было бы нехилый запас сделать. Процессоры насколько я заметил, выводят GDI графику неадекватно, по марке не угадаешь, Атлоны старые вроде хорошо справляются.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 13.05.2008 в 12:42.
mutabor вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уроки по созданию игр для новичков... -=DeS=- Gamedev - cоздание игр: Unity, OpenGL, DirectX 750 14.11.2017 20:26
Музыка программистов - как вы относитесь к АРИИ? Весёлый Жека Свободное общение 46 10.10.2008 22:32
Конкурсы по созданию игр на Delphi mutabor Свободное общение 0 15.06.2007 12:40
Работа по созданию ПО remix Фриланс 3 22.04.2007 11:00