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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2010, 13:46   #31
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от Ulex Посмотреть сообщение
Кстати, Tronix, пробовал на Целероне запускать?
Пока не пробовал (влом переподключать системники, у меня монитор один), но уверен что получу то-же самое окно. Видимо в демке заюзано не только MMX, но и часть SSE (целочисленное, может с регистрами mmx). Та ошибка на скриншоте - это Invalid Opcod. Если переборю лень и переподключу компы, скажу точно на какой инструкции трапается, да и вообще всю процедуру могу дизасмнуть.

Насчет фпс - по логике, все верно, но на деле - вот так вот. Можете попробовать простой эксперемент: глобальная переменная fps, при создании формы fps := 0. Далее делаем таймер, задержка 1 мс. В таймере пишем одну единственную строку - Inc(fps). Далее второй таймер, задержка 1000 мс. В его процедуре пишем пару строк - первая вывод куда-нибудь (в заголовок формы например) текущего fps и следующая строка - fps := 0;. Все. Никаких рисований и прочего. Тестим и получаем 64 fps черт его побери )) Такие дела..
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 17.10.2010, 16:29   #32
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Ребята, отлично все. Tronix, fps считается именно так, как ты описал, ...я понимаю, что это примитив и не совсем корректно, но посудите сами, мне fps до лампы вообще, поскольку стоит константа 31 мс, это та частота, с которой зрение фиксирует плавность движения, реалистичное, а избыток fps для 2D - от лукавого, зачем нужно 100 fps, если движение попиксельное и анимация выполнена 24 кадра в секунду? ...как правильно сказал Tronix, fps не является основным показателем качества, даже в 3D шутерах 400 fps - это, извините, меренье видеокартами, человек больше 100 fps не отличает, будь там далее хоть 200, хоть 500, хоть 1000, ...другое дело, что может быть узкое место в игре, где полно объектов и специальным флагом помечать их в игре и поднимать скорость рендеринга - глупо, вот и пашет на максимуме.

У меня обработка модели выполняется сразу без задержек, основные тормоза - это BitBlt, наша комманда GDI, которую выполнять чаще 30 раз в секунду не рекомендуется. Последовательность такая:

TimerGame (его интервал меняется в окошке)

1) Цикл по числу объектов, задание смещения
2) Переброс подложки в буфер кадра
3) Цикл отрисовки объектов в буфер кадра выше показанным MMX кодом (в ОЗУ)
4) Вывод кадра в форму (BitBlt)

---------------------------------------------

Если хотите честный тест, где очень важно сколько лишних fps покажет, я применю GetTickCount.

По поводу ошибки, ...не в курсе. Дизасемблировать не нужно, время тратить, так покажу, ...уже показывал в теме "Как вы относитесь к созданию игр на Delphi?", где код и родился под руководством товарища alexBlack'а:

Код:
// Отрисовка =========================================================

  asm // подготовка маски
    pxor      xmm7, xmm7
    movq      xmm3, C1           // const C1: int64 = $FFFFFFFFFFFFFFFF;
    PUNPCKLBW xmm3, xmm7
  end;

  For yy := 1 to TexH do         // По числу строк в текстуре
    Begin;

      asm
        push edi
        push esi
        push edx
        push ecx

        mov ecx, C               // TexLine div 8 (длина линии в байтах / 8)
        mov esi, [TexPChar]      // Указатель на начала данных текстуры
        mov edi, [MapPChar]      // Указатель на начала данных маски
        mov edx, [ZonePChar]     // Указатель на начала данных заднего фона
      @@1:
        cmp dword ptr [edi], 0
        jne @@mix
        cmp dword ptr [edi+4], 0
        je  @@Next

      @@mix:
        movq      xmm0, [esi]     // Tex
        PUNPCKLBW xmm0, xmm7      // конвертация в Word

        movq      xmm1, [edx]     // Zone
        PUNPCKLBW xmm1, xmm7
        psubw     xmm0, xmm1      // Tex - Zone

        movq      xmm2, [edi]     // Map
        PUNPCKLBW xmm2, xmm7

        pmullw    xmm0, xmm2      // (Tex - Zone) * Map
        psrlw     xmm0, 8         // shr 8
        paddw     xmm1, xmm0      // Zone + (Tex - Zone) * Map shr 8

        pand      xmm1, xmm3
        packuswb  xmm1, xmm1      // конвертация в Byte

        movq      [edx], xmm1

      @@next:
        add esi, 8
        add edx, 8
        add edi, 8
        loop @@1

        pop ecx
        pop edx
        pop esi
        pop edi
      end;

      // Сдвиг (переход на следующую "строку" изображения)
      TexPChar  := TexPChar  + TexLine;
      MapPChar  := MapPChar  + TexLine;
      ZonePChar := ZonePChar - ZoneLine;
    end;
Продолжаем в том же духе, очень важно и мне знать, где проблемы в скорости, ...кроме, собственно, топикстартера.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 17.10.2010 в 16:39.
Beermonza вне форума Ответить с цитированием
Старый 17.10.2010, 17:03   #33
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Дыкть какой-же это MMX? xmms регистры - это SSE. Поэтому ессно про компы типа целеронов 1Ghz можно позабыть. SSE только начиная с первых P4 и AMD Athlon появилось, все что раньше будет {ой!}.

Плюс. Странный код вообще )) вот вы юзаете 128-битные xmm регистры, а на самом деле используется только их верхняя часть похоже. (приращение по 8 байт, а не по 16 как нужно бы было). У меня такое чувство, что если тупо заменить все SSE регистры xmmN на MMX регистры mmN функция будет точно так же работать, только уже не будет трапаться на без SSE-шных компах.
Чтобы понять рекурсию, сперва нужно понять рекурсию.

Последний раз редактировалось Beermonza; 17.10.2010 в 22:23.
Tronix вне форума Ответить с цитированием
Старый 17.10.2010, 17:47   #34
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Секунду! ...MM0-MM7 - MMX, а XMM0-XMM7 - расширение SSE ? 8/
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 17.10.2010, 17:50   #35
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Секунду! ...MM0-MM7 - MMX, а XMM0-XMM7 - расширение SSE ? 8/
Так точно. Просто замените все xmm на просто mm и я уверен на 99%, что ничего не изменится в работе. И будет работать после этого на наших старичках - целеронах

UPD:
Только перед начало работы с MMX надо вставить в процедуру команду emms и ее-же в самом конце процедуры. Иначе, если в игре используются вещественные числа, можно выхватить ексепшен навроде Invalid Floating Point Operation.
Чтобы понять рекурсию, сперва нужно понять рекурсию.

Последний раз редактировалось Tronix; 17.10.2010 в 17:59.
Tronix вне форума Ответить с цитированием
Старый 17.10.2010, 18:11   #36
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Я, видимо не доглядел, ...вот и отлично, спасибо! ...я применю и SSE для себя, выложу и чистый MMX, ...только мне нужно помочь с точным измерением fps, какой метод вам нужен? ...вывод в Caption формы.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 17.10.2010, 18:16   #37
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
поскольку стоит константа 31 мс, это та частота, с которой зрение фиксирует плавность движения, реалистичное, а избыток fps для 2D - от лукавого, зачем нужно 100 fps, если движение попиксельное и анимация выполнена 24 кадра в секунду?
Я обычно ставлю 20. Это связано с курсором. Если в программе графический курсор, то лично я вижу как он дёргается на 30 мс. А на 20 уже не заметно. Может быть я придираюсь, или готовить его не умею.
В принципе - да, избыток fps для 2D это вещь необязательная, но мы же сейчас про тест GDI графики говорим. Как определить производительный метод рисования, или нет? Просто работает, неработает - не вариант. Если работает, то на каких частотах, с каким разрешением, с каким количеством объектов. Вот это будет уже показательнее.

Цитата:
Тестим и получаем 64 fps черт его побери )) Такие дела..
Нет, получаем 1000. Как и должно быть. Вообще я полагал, что тест будет без регулировок таймера. Т.е. нам просто скажут - таймер на 30 мс - и всё, никаких гвоздей. Но с интервалом получается даже интереснее, сразу видно, когда программа начинает лагать. Как только FPS неравен установленному, картинка сразу начинает дёргаться. Это я про правильный FPS (см. вложение). А вот в случае нашего теста я всё равно не очень понимаю чего регулирую, и совсем не понимаю, почему и как эти регулировки влияют на FPS. Т.е. я регулирую период GameTimer. В этом таймере происходит пересчёт координат всех объектов (т.е. обработка логики). Далее есть уже какая-то отдельная процедура, которая выводит всю графику на экран (собственно формирует все эти бэки)? И эта процедура работает по своему отдельному таймеру на 30 мс? и почему тогда FPS зависит от этих настроек? Он тогда вообще должен быть стабилен и равен 31.
Вобщем вывод - либо убрать эту регулировку совсем, либо сделать её честной.

В приложении тот самый тест, который провалился на Celerone. Тогда он просто провалился, я расстроился и плюнул на него. А теперь ввиду темы, приколотил к нему настроек несколько. Настройки вызываются по кнопке F1. Если установить количество Pack-ov =0, и отключить всю графику, то как раз и получите:

Цитата:
Далее делаем таймер, задержка 1 мс. В таймере пишем одну единственную строку - Inc(fps). Далее второй таймер, задержка 1000 мс. В его процедуре пишем пару строк - первая вывод куда-нибудь (в заголовок формы например) текущего fps и следующая строка - fps := 0
Вложения
Тип файла: rar TestGdi.rar (32.0 Кб, 17 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 17.10.2010, 18:26   #38
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Я, видимо не доглядел, ...вот и отлично, спасибо! ...я применю и SSE для себя, выложу и чистый MMX, ...только мне нужно помочь с точным измерением fps, какой метод вам нужен? ...вывод в Caption формы.
В каком смысле SSE для себя? Если уж задействовать SSE, то нужно переделывать всю процедуру под него, то есть брать кусками не по 8 байт а по 16 сразу, иначе никакого смысла в использовании XMM регистров вместо MM нету абсолютно, кроме того, что старенькие компы будут в пролете. По-хорошему нужно в начале определять какие инструкции поддерживает процессор и в зависимости от выполнять 3 различные процедуры - одну Generic - вообще на чистом паскале (для компов уровня Pentium 75, без MMX), вторую MMX и третью SSE. Должно быть 3 отдельных реализации.

А тест.... Ну мне по большому счету не нужно ничего доказывать и спорить я тоже не собираюсь. Если хотите - могу написать вам точно такой-же. Один в один, только наверное у меня он будет побыстрее работать Хотя с таймером этого будет не заметно.

Поэтому я честно говоря вообще уже потерял нить разговора - что мы там вообще тестируем-то? Загрузку процессора? Ну так по хорошему можно на нее наплевать, потому как игра имеет полное право забрать все ресурсы, и грузить его на 99% . В этом ничего зазорного нет я считаю. Или мы тестируем количество fps? Так я уже говорил выше, что максимальное fps через таймер мы не посмотрим, нужно уносить в поток рендер. Запутался я с вами ))
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 17.10.2010, 18:36   #39
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Tronix Посмотреть сообщение
Можете попробовать простой эксперемент: глобальная переменная fps, при создании формы fps := 0. Далее делаем таймер, задержка 1 мс. В таймере пишем одну единственную строку - Inc(fps). Далее второй таймер, задержка 1000 мс. В его процедуре пишем пару строк - первая вывод куда-нибудь (в заголовок формы например) текущего fps и следующая строка - fps := 0;. Все.
Я брал тиккаунт в начале тела таймера, и в отдельную переменную сохранял разницу между свежим тиккаунтом и старым, ...по идее переменная такая хранится всегда и хранит в себе разницу в милисекундах, но в отдельном таймере с задержкой 1000 мс в Caption формы эта переменная выводится как попало, то 16, то 0, ...вообще, сам код с 255 объектами, с перебросом подложки, с рисованием в памяти и с выводом по BitBlt показал 16 мс, т.е. 62 fps.

Tronix, переделать на SSE нефиг делать, я просто не знал как называются регистры, ...в этом деле новичок, пытаюсь разбираться, когда приспичит.

Ulex, таймер, которым управляешь у меня в приложении, он в своем теле содержит все полностью, как в структуре, которую описал выше, и обработка модели персонажей, и подготовка фона, и рисование на нем и в конце вывод на форму, ...поэтому все честно, сколько потребуется милисекунд, чтобы выполнить все целиком, ...говорит, что 15-16 мс.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 17.10.2010 в 18:40.
Beermonza вне форума Ответить с цитированием
Старый 17.10.2010, 19:53   #40
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
Ulex, таймер, которым управляешь у меня в приложении, он в своем теле содержит все полностью, как в структуре, которую описал выше, и обработка модели персонажей, и подготовка фона, и рисование на нем и в конце вывод на форму, ...поэтому все честно, сколько потребуется милисекунд, чтобы выполнить все целиком, ...говорит, что 15-16 мс.
Вот, мы наконец-то вернулись в начало разговора. При таком подходе "остальная скорость" будет зависить от скорости рисования, так ведь?
Я противник такого метода. На GDI это конечно может быть и не критично. Ну тут замедление игрового процесса начнётся в том случае, когда машина уже откровенно не тянет. А вот на DDraw таймер может оттянуться по VSYNC_у. Будут стоять две одинаковых машины - на одной игрушка будет летать, на другой ползать. А во всём виноваты настройки видеокарты и такой подход к построению графики.

Остаётся победить это методом, который предложил Selestis. Но этот метод догоняющий в плане логики. Т.е. в таймере высчитывается, а действительно ли таймер был прав, или графика его стормозила. Если стормозила, то считается коэффициент и все объекты уже живут этот кадр в соответствии с этим коэффициентом. Логика подстраивается под графику.

И есть ещё вариант - развязать графику и логику окончательно. Есть таймер, по которому обрабатывается вся логика. Просчитал, посмотрел чего делает адаптер, если не занят - бросил ему команду рисовать, если занят, досвидания до следующего такта счётчика (рисуй там себе дальше).

Цитата:
Поэтому я честно говоря вообще уже потерял нить разговора - что мы там вообще тестируем-то?
Мы тестируем производительность.
Цитата:
Загрузку процессора? Ну так по хорошему можно на нее наплевать, потому как игра имеет полное право забрать все ресурсы, и грузить его на 99%
Имеет полное право - пусть забирает хоть 99 %, но пусть при этом обеспечивает заданный темп. Это будет означать, что система справляется с указанной нагрузкой. А если программа грузит проц на 50, но по таймеру в 20 мс выводит 32 кадра в секунду, то это либо сделано специально (хитрым шайтан программистом). Либо одно ядро всё-таки сгорело
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
wi-fi и скорость stenl1 Компьютерное железо 19 01.06.2010 17:48
Скорость рисования графиков Master07 Общие вопросы C/C++ 3 16.07.2009 21:45
Скорость bakanis Работа с сетью в Delphi 6 05.04.2009 12:39
Скорость скачивания Терминатор Свободное общение 3 30.03.2009 19:03
Скорость проигрывания Bigtyoma Мультимедиа в Delphi 0 30.09.2008 15:57