Войти
Вело-изобретателиФорумSR2D - софтовый 2D движок

2D движок SR2D, Софтверный движок для работы с 2D графикой на VB6, vb.net, C# (44 стр)

Страницы: 139 40 41 42 43 44
#645
8:27, 3 июня 2019

Mikle
> Как будто у меня его нет.
у тебя же вроде перевод точку в точку? Или нет?

#646
8:35, 3 июня 2019

StepEver
Глянь пример: https://yadi.sk/d/axkpVDeWr3_OrQ
Клик по форме - вкл/выкл АА.

#647
8:55, 3 июня 2019

Mikle
> Глянь пример: https://yadi.sk/d/axkpVDeWr3_OrQ
Тоже глянул из любопытства. Интересно, что при повороте к близким к углам 0, 90, 180, 270 градусов, ФПС начинает расти. От чего так?

#648
9:00, 3 июня 2019

Vitorio
> Интересно, что при повороте к близким к углам 0, 90, 180, 270 градусов, ФПС
> начинает расти. От чего так?
Источник регулярнее попадает в кэш.

#649
9:07, 3 июня 2019

Mikle
Глянул.
Даже внутрь SR2D залез, но всё равно непонятно, как ты АА делаешь :)

#650
(Правка: 9:13) 9:12, 3 июня 2019

StepEver
> Даже внутрь SR2D залез, но всё равно непонятно, как ты АА делаешь
Так это же внутри sr2d.dll:

extern "C" __declspec(dllexport) void __stdcall DRAW_ROT_AA(int* src, int* dest, int L, int T, int R, int B, int sx, int sy, int dx, int dy, int sw, int sh, int dw, int SinA, int CosA)
{
  int ssx = (sx << 16) - (dx - L) * CosA;
  int ssy = (sy << 16) - (dx - L) * SinA;
  int addy = T * dw;
  T -= dy;
  B -= dy;
  for (int y = T; y < B; y++)
  {
    int xx = ssx - y * SinA;
    int yy = ssy + y * CosA;
    for (int x = L; x < R; x++)
    {
      int ix = xx >> 16;
      int iy = yy >> 16;
      if ((ix >= -1) && (ix < sw) && (iy >= -1) && (iy < sh))
      {
        int tx = xx & 0xFFFF;
        int ty = yy & 0xFFFF;
        int c11, c21, c12, c22;

        if ((ix == -1) || (iy == -1))
          c11 = dest[addy + x];
        else
          c11 = src[sw * iy + ix];

        if ((ix == sw - 1) || (iy == -1))
          c21 = dest[addy + x];
        else
          c21 = src[sw * iy + ix + 1];

        if ((ix == -1) || (iy == sh - 1))
          c12 = dest[addy + x];
        else
          c12 = src[sw * (iy + 1) + ix];

        if ((ix == sw - 1) || (iy == sh - 1))
          c22 = dest[addy + x];
        else
          c22 = src[sw * (iy + 1) + ix + 1];

        *((byte*)&dest[addy + x] + 0) =((*((byte*)&c11 + 0) * (0x10000 - tx) >> 12) * (0x10000 - ty) +
                                        (*((byte*)&c21 + 0) *            tx  >> 12) * (0x10000 - ty) +
                                        (*((byte*)&c12 + 0) * (0x10000 - tx) >> 12) *            ty  +
                                        (*((byte*)&c22 + 0) *            tx  >> 12) *            ty) >> 20;

        *((byte*)&dest[addy + x] + 1) =((*((byte*)&c11 + 1) * (0x10000 - tx) >> 12) * (0x10000 - ty) +
                                        (*((byte*)&c21 + 1) *            tx  >> 12) * (0x10000 - ty) +
                                        (*((byte*)&c12 + 1) * (0x10000 - tx) >> 12) *            ty  +
                                        (*((byte*)&c22 + 1) *            tx  >> 12) *            ty) >> 20;

        *((byte*)&dest[addy + x] + 2) =((*((byte*)&c11 + 2) * (0x10000 - tx) >> 12) * (0x10000 - ty) +
                                        (*((byte*)&c21 + 2) *            tx  >> 12) * (0x10000 - ty) +
                                        (*((byte*)&c12 + 2) * (0x10000 - tx) >> 12) *            ty  +
                                        (*((byte*)&c22 + 2) *            tx  >> 12) *            ty) >> 20;

        *((byte*)&dest[addy + x] + 3) =((*((byte*)&c11 + 3) * (0x10000 - tx) >> 12) * (0x10000 - ty) +
                                        (*((byte*)&c21 + 3) *            tx  >> 12) * (0x10000 - ty) +
                                        (*((byte*)&c12 + 3) * (0x10000 - tx) >> 12) *            ty  +
                                        (*((byte*)&c22 + 3) *            tx  >> 12) *            ty) >> 20;
      }
      xx += CosA;
      yy += SinA;
    }
    addy += dw;
  }
}

Заметь, всё на целочисленных операциях, такое обогнать можно только на MMX-SSE интринсиках.

#651
9:44, 3 июня 2019

Mikle
> Заметь, всё на целочисленных операциях
Ага, я так же делаю
У тебя адова точность получается, ты делаешь смещение на 0х10000, оно того стоит?
Я ещё экономлю на указателях, хожу задом наперёд, с альфы. И вот тот большой код, где ты складываешь 4 точки, я делаю немного иначе, у меня массив из 4 DWORD и указатель на начало, я бегу по нему и складываю(add) в него эти 4 точки по очереди. Потом опять бегу по нему и делю на 4.

> всё на целочисленных операциях
глянул свой код не-АА - у меня там double-ы! о_о

#652
9:52, 3 июня 2019

StepEver
> адова точность получается, ты делаешь смещение на 0х10000, оно того стоит?
А какая разница, на 0х10000, или на 0х100? Скорость же не изменится, так пусть будет точнее.
StepEver
> тот большой код, где ты складываешь 4 точки, я делаю немного иначе, у меня
> массив из 4 DWORD и указатель на начало, я бегу по нему и складываю(add) в него
> эти 4 точки по очереди. Потом опять бегу по нему и делю на 4.
Не понял, у тебя простое среднее арифметическое? У меня то с весовыми коэффициентами.

#653
9:56, 3 июня 2019

Mikle
> Не понял, у тебя простое среднее арифметическое? У меня то с весовыми коэффициентами.
А, да, получается у меня среднее арифметическое :[
Надо будет это исправить, спасибо :)

#654
20:30, 6 июля 2019

Mikle
Привет, есть прогресс с х64?)

#655
9:33, 7 июля 2019

Нет ничего, кроме надежды, что будет время на это в отпуске, в августе.
Я, как обычно, предпочёл конкурс этому проекту.

#656
16:51, 7 июля 2019

Mikle
ок, я эксперт в безуспешных попытках нетеряния надежды, может увидет еще свет сие творение.

#657
18:02, 24 авг. 2019

Mikle
> Так это же внутри sr2d.dll:
Знакомо, ковырял подобное на Дельфях.
Строго говоря, это не антиалиасинг, а билинейка по 4-м точкам, то же самое, что и bilinear texture filtering в видеокартах.

> Заметь, всё на целочисленных операциях, такое обогнать можно только на MMX-SSE
> интринсиках.
Интринсики в GCC/Clang/ICC уже не обязательны, есть векторные расширения - возможность применять "шейдерный" синтаксис с float4, int4 и т.п.
https://gcc.godbolt.org/z/_cKion
Правда, ускоряет в данном случае слабовато, всего в полтора раза. Наверное, куча условий на пиксель всё портит.

Страницы: 139 40 41 42 43 44
Вело-изобретателиФорумSR2D - софтовый 2D движок