.::Russian Blood Community Forum::. »Life Is Real » Флейм » Привед :)
Страниц (4): « 1 2 [3] 4 »
51. LifeKILLED - 07 Марта, 2010 - 06:05:49
>> Обычно делают так

Да, я именно так и собираюсь сделать. Улыбка

Зачем мне драйвер? Я Это не для меня. У меня друг микроконтроллеры программировать умеет, а мне это даже не интересно. Я даже свой центральный процессор разрабатывать не собираюсь, как это ни странно, и даже видеокарту гы-гы!

Я просто хочу накрапать пару функций, которые растеризуют спрайты в массив пикселов. В конце ясно дело подключу это к Битмапу, Брашу и выведу через ЦДЦ, что мне еще остается.

>> Не расценивай это как агитацию за DDraw

У меня дома лежит книжка по DirectX, там пишут, что можно создать объект любой версии, седьмой или 11 без разницы и пользоваться. Все хранится. Новая версия не заменяет старую.

Эти Директы даже устанавливаются странным образом. Чтобы поиграть в Dune 2000 надо обязательно установить еще и 6-й директ перед установкой 9-го (правда давно я так не извращался, дело было в голой XP, в семерке может быть уже это исправили, там же совместимость крутая типо)

52. jm - 07 Марта, 2010 - 06:11:20
Для того, чтобы поиграть в Dune2000 я не ставил Dx6. Честно. Все работало.
Дорогая редакция, что я делаю не так ? Улыбка

ps Я там еще много приписал к предыдущему посту Улыбка Надо синхронизироваться Улыбка

(Отредактировано автором: 07 Марта, 2010 - 06:11:53)

53. LifeKILLED - 07 Марта, 2010 - 06:12:22
Про DirectDraw пишут, что там очень быстрая скорость обмена с видеопамятью. Все равно буду писать софтверный двиг, потому как видеопамять видеопамятью, а к оперативной памяти из процессора доступ тоже нехилый Улыбка)))))

54. jm - 07 Марта, 2010 - 06:20:49
DirectDraw хорош тем, что то, что ты собираешься разрабатывать сам в нем уже содержится. Причем работает это чрезвычайно быстро. И однозначно это будет работать быстрее, чем твоя софтверная реализация. Хотя бы потому, что большую часть работы связанную с растеризацией возьмет на себя видеокарта, а у тебя этим будет нагружен процессор.

Очень давно, когда я еще держал сайт на chat.ru я писал статьи о DirectDraw:

http://gamedev.chat.ru/articles/a0004.html
http://gamedev.chat.ru/articles/a0007.html

Там же кстати моя статья и об инициализации OpenGL
http://gamedev.chat.ru/articles/a0003.html

Год 1998-2000 где-то УлыбкаУлыбкаУлыбка

(Отредактировано автором: 07 Марта, 2010 - 06:21:49)

55. LifeKILLED - 07 Марта, 2010 - 06:26:11
Цитата:
Как репейник жеж Да пойми ты.


Люблю я их, вот и ругаю

Цитата:
На счет гост'ов и денег сморозил чушь имхо


Я юморист типо Голливудская улыбка Пишут, что DirectX 11 это как требования к производителям видеокарт, это не я придумал. ДА! Фигня может, но не я ж аффтар Голливудская улыбка А, мож и согласовано все с ними было, и не в Майкрософте решали что да как делать. Однако решили, готов поспорить, на каком-нибудь собрании не без их участия.

К OpenGL да, выходят расширения, но они походу используются, чтобы стряпать демки и ролики самими производителями Улыбка Потому как все игры сейчас поголовно создаются на DirectX. Ну и 3 версию ГЛ не очень любят походу, складывается такое впечатление у меня почему-то после чтения постов на форумах. Может, и ошибочное.

Возможное применение DirectX 3:
DirectMedia - вводный ролик помоему был avi, если я не ошибаюсь
DirectSound - а почему бы и нет?

Но рендер конечно же OpenGL, не станут же они лазить в коды Кармака гы-гы!

А дистрибутив сам видел!!! Круто! Разрази меня гром Я прикоснулся к истории Тащусь Может быть обновление. Хотя в те времена была в ходу Windows95, сам на ней сидел, и не факт что в самых первых ее версиях была DirectX 3. IE то там тоже с обновлением вышел.

(Добавление)
Цитата:
Очень давно, когда я еще держал сайт на chat.ru я писал статьи о DirectDraw:


Круто!!! Почитаю! Голливудская улыбкагы-гы!

(Добавление)
... Но позже. Сначала посплю. Здаю тебе смену Голливудская улыбка

56. jm - 07 Марта, 2010 - 06:49:57
Обосную. Цитирую тебя:

Цитата:

Еще одна мысль. Когда делали DirectX 9, то он был сделан гораздо позже, чем появились те же технологии в OpenGL, это касается и более ранних версий. А уже Direct 10 и выше - это вроде как ГОСТ, видюхи фигачили уже под DirectX Улыбка Деньги страшная сила.


То есть на OpenGL забили ? Я правильно тебя понял ? И забил ms ?
Давай разберемся в сути проблемы.

Для начала подумаем, могут ли быть какие либо аппаратные проблемы. Ну чисто теоретически-обывательски Улыбка А ля мог ли ms 'заставить' разработчиков видеокарт производить видеокарты чиста-для-Direct3d Улыбка
Ты правда думаешь, что конвейер OpenGL сильно отличается от конвейера DirectX ? Улыбка Ты правда думаешь, что математика, используемая в этих разных 3d API отличается ? Улыбка Нет. Не отличается.
К чему мы приходим в итоге ? Аппаратных препонов нет.

Что у нас с программной частью ? Ага - есть механизм icd, generic OpenGL не вырезан из дистрибьютива. Программных проблем тоже нет.

Социальные. Над тобой что, стоят два здоровых негра с ножом у горла и требуют от тебя использовать только Direct3D ? Улыбка Не думаю.

Как и кто использует расширения opengl это проблема далеко не Ms Улыбка
Они молодцы, продвинули СВОЙ продукт. Что в этом такого ?

Цитата:

Но рендер конечно же OpenGL, не станут же они лазить в коды Кармака


Нет, юноша, у вас явно токсикоз Улыбка

По поводу возможного применения DirectX конечно. Просто не стал все это перечислять, а упомянул только то, в чем уверен. id на сколько я помню DirectShow не использовала никогда. Хотя утверждать опять таки не буду.

(Добавление)
Кстати, из моей статьи об инициализации OpenGL понятно, почему я игнорировал флаг PFD_GENERIC_ACCELERATED УлыбкаУлыбкаУлыбка Его наличие определяет только тип аппаратного ускорения - MCD обрезок или полноценный ICD драйвер. Меня это не интересовало Улыбка

(Отредактировано автором: 07 Марта, 2010 - 06:53:28)

57. LifeKILLED - 07 Марта, 2010 - 16:29:41
Все, с этого момента перестаю нести бред и начинаю умничать Улыбка

Еще раз расписал на бумажке функцию отрисовки спрайта. Хочу все-таки поделиться мыслями.

В цикле отрисовки не будет никаких float-чисел, никакого преобразования или умножения. Только инкременты указателей, одно сложение и несколько if с побитовыми операторами. Не знаю пока, хватит ли мне byte-переменных на то, чтобы плностью регулировать размер картинок, или все-таки прибегнуть к использованию unsigned short int. Это надо проверять. В остальном такие вот дела.

По моим подсчетам наибольший размер отрисовки спрайта на экране (при переменных byte) будет размером в ~4000 пикселей в ширину, а наименьший - в 8 раз меньше первоначального размера спрайта (т.е. спрайта 256х256 можно будет уменьшить до 32х32 пикселей, меньше и не надо, все равно видно не будет ))))) ). Такие будут возможности.

Если функция будет работать достаточно быстро, реализую еще и блендинг.

Таковы мои планы Улыбка

Еще подумаю до вечера, почеркаю в тетрадке, пока брат будет рубиться в Plants'n'Zombies, и приступлю к написанию.

58. jm - 07 Марта, 2010 - 16:49:11
float чисел в наше время вряд ли стоит бояться. Тем более 2д аркаде вроде твоей Улыбка

59. LifeKILLED - 07 Марта, 2010 - 16:58:19
Все равно хочу сделать по максимуму. Вдруг Пентиум 200 потянет ))))))

byte-переменные будут расчитываться из float-параметров перед циклом "рисования". Это будут таймеры, сколько пикселов отрисовать. А уже в самом цикле при присвоении каждой точки ("выборке" (C) Голливудская улыбка ) будут использоваться эти byte-переменные.

Сначала строка будет рисоваться кусками по 16 пикселов без проверок. А в последних кусках ряда будет столько пикселов, сколько осталось. Эти оставшиеся 15 или меньше пикселов будут дорисовываться простым циклом (с проверкой окончания строки после каждого пиксела).

Я только что описал отрисовку одного ряда по горизонтали. В начале каждого ряда указатель будет обновляться. Вначале-то я сделаю преобразование из float в UINT, как же иначе.

Может быть, если ряд по вертикали будет точно таким же (типо растяжение изображения по алгоритму ближайший-соседний Улыбка ), буду копировать более верхний ряд memcpy Улыбка.

Еще одно byte число - дробное соотношение пиксела спрайта к пикселу изображения. Это моя замена дробного числа. Точность такой дроби получется 1/16. (целое можно получить сдвигом на 4 бита вправо). Этот таймер как раз и будет отсчитывать, через какой промежуток инкрементировать указатель на текстуру. (Если byte число равно 16, значит масштаб 1/1, если 12, то 1/1.5 и так далее).

Если прокатит со скоростью работы, выложу код. И конечно же, наводню игру спрайтами Голливудская улыбка))))))))

(Добавление)
А вообще-то, если short UINT переменные будут работать так же быстро, как byte-переменные, я сделаю их. Тогда точность будет уже до ~1000 и тогда по красивше будет, и растянуть картинку можно будет на 1000 раз больше ))))))) Это я выясню эксперементальным путем. Но вариант с byte меня лично тоже устраивает. Улыбка

(Добавление)
Переустановил Visual Studio, пришлось заново искать откуда взять glaux (я им пользуюсь с давним времен, в частности гружу с его помощью BMP Улыбка ), а эти....... Ладно, ладно, гении из Microsoft, убрали этот файл из дистрибутива VS. Зачем? Специально, что ли, чтобы мне насолить? гы-гы! Как после такого на них не ругаться Улыбка)))))))) Мне нравится Windows, нравится MsVs, MsOffice, я всегда качаю самые последние версии этих програм )))))))) Но такие вот мелочи злят немножко

60. jm - 07 Марта, 2010 - 19:01:04
Я даже боюсь что-то комментировать. Потому, что потом очень долго придется переписываться УлыбкаУлыбкаУлыбка Тем более я пока плохо понимаю все твои мега планы Улыбка

По поводу оптимизаций. Делают это обычно так - используют профайлер и оптимизируют только узкие места. А ты не выяснив, где именно у тебя могут быть ботлнеки бросаешься с шашкой кромсать дворовых кошек. Так не пойдет. Или это приведет тебя к потерям фпс. Ради интереса постоянно меряй попугаев, чтобы знать, к чему привели тебя твои изыскания.

Конечно, специально убрали. А давно это glaux стала неотъемлемой частью opengl ?

Я считаю, что нужно думать не об сверх оптимизации кода, а о смене апи. Причем в сторону чего нибудь специализированного, вроде hge (http://hge.relishgames.com/).
И ты сможешь акцентировать все свое внимание не на изучение апи, а на убер оптимизации которые так тебя притягивают УлыбкаУлыбкаУлыбка
Т.к. есть подозрения, что из-за отсутствия практического опыта ты использовал в своем рендере не самый оптимальный подход. Я просто не понимаю, чему там тормозить даже на софтверном рендере. Не утверждаю, а просто предполагаю.


(Отредактировано автором: 07 Марта, 2010 - 19:01:38)

61. LifeKILLED - 07 Марта, 2010 - 20:21:52
Цитата:
Тем более я пока плохо понимаю все твои мега планы


Код пришлю, там немного будет, но интересно.

(Добавление)
Ты не понял! Тормозит НЕ НА совтверном рендере!

Цитата:
software emulation of hardware acceleration


Говоря простым языком, идет программная эмуляция OpenGL. Только в этом проблемы. А не в моих кода.

Я уже знаю, где могут возникнуть тормоза. В цикле по растеризации, т.к. он будет повторяться в среднем 40000 раз (столько точек при отрисовке спрайта).

Огромное спасибо за ссылку! Голливудская улыбка Но ты опоздал. Я сначала сделаю свой софтверный рендер, а потом уж, если не прокатит.... (даю себе неделю).

62. jm - 07 Марта, 2010 - 20:54:20
software emulation of hardware acceleration это и есть generic реализация. Программная. Я повторюсь. Я не вижу ничего такого в твоем приложении, из-за чего эта самая программная эмуляция может тормозить. Впрочем не буду утверждать. Но я бы все перепроверил.

(Добавление)
К слову о glaux. Если верить сайту майкрософт она deprecated Улыбка
И еще цитатка gamedev.net:

Цитата:

The gernal rule is to stay away from glaux as much as possible. It is indeed depreciated, and has known memory leakes.


В качестве альтернативы - используй glut.

63. LifeKILLED - 08 Марта, 2010 - 02:56:34
Я из glaux использую только функцию загрузки bmp. Если честно, когда-то я грузил их же из MFC, и все работало так же прекрасно Улыбка Надо переписать функцию загрузки текстуры. А еще лучше взять какую-нибудь библиотеку или грузить самому.

Цитата:
Я не вижу ничего такого в твоем приложении, из-за чего эта самая программная эмуляция может тормозить.


Я чего там только ни настраивал. Я все отключил, что только можно! И фильтрацию, и все остальное. У меня даже режим есть специальный - "Очень некрасивый" Улыбка Мое мнение - generic реализация opengl очень плохо оптимизирована. Потому что визуальный результат точно должен соответствовать аппаратному рендерингу. И ЦП вынужден считать все эти матрицы, шматрицы, фильтровать текстуры и тому подобное. Почему эмуляция может тормозить? А почему НЕ МОЖЕТ? Ведь никто ей все равно не пользуется кроме меня.

(я один не посмотрел на флаги Голливудская улыбка )

(Добавление)
Код:
 int nPixelFormat;                   // Pixel format index
  m_hDC = ::GetDC(m_hWnd);            // Get the Device context
 
  static PIXELFORMATDESCRIPTOR pfd = {
   sizeof(PIXELFORMATDESCRIPTOR),  // Size of this structure
    1,                              // Version of this structure    
    PFD_DRAW_TO_WINDOW |            // Draw to Window (not to bitmap)
    PFD_SUPPORT_OPENGL |            // Support OpenGL calls in window
    PFD_DOUBLEBUFFER,               // Double buffered mode
    PFD_TYPE_RGBA,                  // RGBA Color mode
    32,                             // Want 24bit color  
    0,0,0,0,0,0,                    // Not used to select mode
    0,0,                            // Not used to select mode
    0,0,0,0,0,                      // Not used to select mode
    16,                             // Size of depth buffer
    0,                              // Not used to select mode
    0,                              // Not used to select mode
    PFD_MAIN_PLANE,                 // Draw in main plane
    0,                              // Not used to select mode
    0,0,0 };                        // Not used to select mode
 
  // Choose a pixel format that best matches that described in pfd
  nPixelFormat = ChoosePixelFormat(m_hDC, &pfd);
 
  // Set the pixel format for the device context
  VERIFY(SetPixelFormat(m_hDC, nPixelFormat, &pfd));
 
  hGLRC = wglCreateContext(m_hDC);
 
  if(hGLRC==NULL)     return;
 
  if(wglMakeCurrent(m_hDC,hGLRC) == FALSE)    return;
 
  SoundInit();
 
  // Все начальные настройки OpenGL здесь
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Черный фон
 
  glShadeModel(GL_FLAT);    // Разрешить плавное закрашивание
  glDisable(GL_NORMALIZE);
  glDisable(GL_DEPTH_TEST);    // Разрешение теста глубины
 
  SetupBlend();
 
  glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(0,800,600,0,-1,1);
  glMatrixMode( GL_MODELVIEW ); glLoadIdentity();


(Добавление)
Этот код я по черному сдул из документации Улыбка) Что еще я должен там писать? Подмигивание

64. jm - 08 Марта, 2010 - 05:18:41
О загрузке изображений - посмотри еще в сторону devil:

http://openil.sourceforge.net/

Это инициализация. Я о другом. Что у тебя происходит в рендере.
Кроме того я опять таки не утверждаю.
Если тебе не нравится генерик имплементация от ms попробуй mesa gl. Я не уверен, но думаю ее софтверная имплементация есть под win.

(Отредактировано автором: 08 Марта, 2010 - 06:48:37)

65. LifeKILLED - 08 Марта, 2010 - 15:50:26
Цитата:
mesa gl
- посмотрю что за штука.

Я вообще-то вычитал еще о куче софтверных ренреров... Но мне надо-то всего лишь масштабирование изображений и больше ничего. Я даже вращение не использую Голливудская улыбка Поэтому свой рендер побыстрому накидаю и фиг с ним.

Про DevIL я знаю. Лучше уж использую другие библиотеки Улыбка Та же GDI+ умеет грузить целую кучу форматов.

В рендере? Рисую квардами спрайты и все. Матрицами не пользуюсь, пишу координаты в вершинах руками Улыбка. Материалов никаких не использую - максимум glColor4f. И то при низкой графике и это отключаю. Блендинг тоже обыкновенный, на низких настройках он отключается и остается один AlphaTest. И все равно тормоза.

Я отключил все, что мог, но тормоза есть. В подтверждение моим словам есть десяток тем на разных форумах, где говорится про тормозную эмуляцию OGL/

66. jm - 08 Марта, 2010 - 19:51:03
Можно увидеть код рисования ? Если это конечно не коммерческая тайна Улыбка

67. LifeKILLED - 08 Марта, 2010 - 23:42:16
Код:
void Sprite:Голливудская улыбкаraw(float x, float y, float SizeX, float SizeY) {
 if (!textureIndex) return;
 if (!IsAlpha) DisableBlend();
 else SetupBlend();
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, textureIndex);
 if (GraphicQuality) {
  glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR  );
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
 } else {
  glTexEnvi ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
 }
 float x0=x, x1=x+SizeX, y0=y, y1=y+SizeY;
 float correctX=0,correctY=0;
 float u0=+correctX, u1=1-correctX,v1=+correctY, v0=1-correctY;
 glBegin(GL_TRIANGLES);
 
/*  00-----10
  |         |
  |         |
  |         |
  01-----11  */
 
  glTexCoord2f(u0,v0);
   glVertex3f(x0, y0, 0);
  glTexCoord2f(u1,v0);
   glVertex3f(x1, y0, 0);
  glTexCoord2f(u1,v1);
   glVertex3f(x1, y1, 0);
 
  glTexCoord2f(u1,v1);
   glVertex3f(x1, y1, 0);
  glTexCoord2f(u0,v1);
   glVertex3f(x0, y1, 0);
  glTexCoord2f(u0,v0);
   glVertex3f(x0, y0, 0);
 glEnd();
 
}
 
 
 
 
void DrawActor(Actor *d, UINT layer, float Ystart, float Yend, bool light=0) { // Рисование игрового объекта
 if (!d) return;
 if (d->deleted) return;
 Sprite *s=(d->sprite+(int)d->FrameNow);
 if (d->angle) s=d->spriteAng[d->angle-1]+(int)d->FrameNow;
 if (d->layer==LAYER_DECOR && layer==LAYER_DECOR && d->draw_shadow && GraphicQuality) { // Это тень объекта
  glColor4f(0,0,0,0.5);
  s->Draw(d->X-50*d->scale*d->mirror, d->Y+70*d->scale+d->offsetY, 100*d->scale*d->mirror, -50*d->scale);
 }
 if ((d->Y >= Ystart && d->Y < Yend && d->layer==LAYER_DECOR) || (d->layer==LAYER_FLOOR && layer==LAYER_FLOOR)) {
  if (d->selected) glColor4f(1,0,0,1); else glColor4f(1,1,1,1); // Выделен ли объект в редакторе ?
  s->Draw(d->X-50*d->scale*d->mirror,d->Y-70*d->scale+d->offsetY,100*d->scale*d->mirror,100*d->scale); // Сам объект
  if (light && GraphicQuality) { // Свечение объекта :)
   glDisable(GL_ALPHA_TEST);
   glColor4f(0.15,0.15,0.2,0.05);
   SBlur.Draw(d->X-50*d->scale*d->mirror*2,d->Y-70*d->scale*1.7+d->offsetY,100*d->scale*d->mirror*2,100*d->scale*2);
   glEnable(GL_ALPHA_TEST);
  }
 }
}
 
 
 
void SetupBlend() {
 if (GraphicQuality) {
  glEnable(GL_BLEND);
  glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  glEnable(GL_ALPHA_TEST);
  glAlphaFunc(GL_GEQUAL, 0.01f);
 } else {
  glDisable(GL_BLEND);
  glEnable(GL_ALPHA_TEST);
  glAlphaFunc(GL_GEQUAL, 0.05f);
 }
}
 
 
 
 
void DisableBlend() {
 glDisable(GL_BLEND);
 glDisable(GL_ALPHA_TEST);
}
 


(Добавление)
Черт, трианглами, оказывается Улыбка)))) Но не по этому же тормозит? .... Чайник

(Добавление)
Прикольный смайл в названии первой функции

(Добавление)
Всю функцию ShowAll() не хочу выкладывать, она очень большая. В ней из команд GL только glClear() (правда, зачем она нужна....... но зачем-то я ее написал.......), и все. Ну и перед выводом спрайтов букв менью команда glColor4f().

(Добавление)
Везде фигурирует условие bool GraphicQuality . Это та самая настройка графики. Я пытался бороться с этими тормозами, сделав опцию пониженного качества, убирающее все настройки, которые делали OpenGL очень похожим на софтверный рендеринг (если false). Даже разрешение при таком варианте снижал до 800 на 600, при перезагрузке игры. И все равно тормоза! Недовольство, огорчение (хотя идет быстрее, но лишь в 2 раза, и FPS уже не 0.3, а 0.7 Улыбка)))) Прогресс, да? На двухъядернике!!! Ж( )


Powered by ExBB 1.9.1
Original Style v1.5a2 created by Daemon.XP