цвет)
массива делать, и таким образом в одномерном массиве столбец заполнять, и при это кеш не будет страдать?
С кэшем всё трудно. Если массив большой - будет в любом случае. Тебя только он интересует? Сам алгоритм будет медленнее, когда ты вычисляешь + номер + ширина. Если можешь этого не делать - не делай, будет быстрее.
А как не вычислять? Можно конечно адрес нулевого элемента + i в отдельную переменную вынести, и тогда придется только + width делать
Просто линейно заполнять: lea eax, dword[buf] @@: mov dword[eax], 0 cmp eax, buf_end jne @b Вместо: xor ebx, ebx .gety: xor ecx, ecx .getx: mov dword[ebx*8+ecx], 0 add ecx, 1 cmp ecx, WIDTH jne .getx add ebx, 1 cmp ebx, HEIGH jne .gety
Если возможен первый случай - лучше так всегда и делать. Вложенные циклы и вычисления плохо сказываются на производительности. А в этом примере - лучше ещё заполнять через SSE, перекидывать по 16 байт.
А на C++ можно перевести?)) Я просто рисую спектр, и после того как я определюсь какие частоты и какой мощности попадают в столбец изображения. То можно выбрать самую максимальную точку в столбце изображения и закрасить этот столбец до этой точки.
Нет, это чат по ассемблеру. Этот код просто чтобы проще понять мою мысль. Но это уже неактуально - тебе в любом случае придётся прыгать по массиву, потому что надо заполнять конкретно столбец (а столбец это y*HEIGH+x, никак линейно к нему не подобраться).
Обсуждают сегодня