Comments 5
Интересно, а нельзя было достичь того же эффекта суммированием числа не имеющего общих делителей с размером видеобуфера? Или всё равно паттерны будут видны?
0
UFO just landed and posted this here
идея псевдослучайной заливки экрана с наименьшими коллизиями потрясает
Есть идея посильнее, без коллизий:
N, a, b, i = 64000, 34781, 33937, 0
screen = [True] * N
for _ in range(N):
i = (i * a + b) % N
if screen[i]:
screen[i] = False
else:
print(f'опс, второй раз в ту же точку')
break
else:
print(f'все {N} точек закрашены за {N} ходов')
что там с псевдослучайностью?
Откуда взялись a и b? Подобрал, таких пар много.
рендеринг
from PIL import Image
n, N, a, b, i = 200, 64000, 34781, 33937, 0
img = Image.new('1', (320, 200), color='black')
for step in range(n + 1): # 201 кадр анимации
for _ in range(N // n):
i = (i * a + b) % N
img.putpixel(divmod(i, 200), 1)
img.save(f'{step:>03}.gif', 'gif')
+2
Вы не уловили контекста. Wolfenstein 3D игра для тех компьютеров, в памяти которых хранить такой кусок данных тяжеловато.
In [2]: screen.__sizeof__()
Out[2]: 512040
При том что 640кб хватит всем, да.
В статье 2017 года это отдельно оговаривается.
0
Смотрите, что я написал:
Это код, который демонстрирует, что коллизий эта формула не создаёт и все точки заполняются. Мне на него хватило памяти, вам, слава богу, тоже.
В Wolfenstein 3D точки выводятся прямо в фреймбуфер, а я вот вывел в переменную screen. Ну просто чтобы вывести куда-то, убедиться, что коллизий нет, ну и вас убедить. Не убедил?
А вот если бы я тоже выводил в фреймбуфер игры Wolfenstein 3D, это бы мне ничего по памяти не стоило, кроме фреймбуфера, который всё равно нужен, и он есть, и вот он:
Это код, который демонстрирует, что коллизий эта формула не создаёт и все точки заполняются. Мне на него хватило памяти, вам, слава богу, тоже.
В Wolfenstein 3D точки выводятся прямо в фреймбуфер, а я вот вывел в переменную screen. Ну просто чтобы вывести куда-то, убедиться, что коллизий нет, ну и вас убедить. Не убедил?
А вот если бы я тоже выводил в фреймбуфер игры Wolfenstein 3D, это бы мне ничего по памяти не стоило, кроме фреймбуфера, который всё равно нужен, и он есть, и вот он:
push 0A000h ; начало видеобуфера
А контекст, так он прямо в первых двух строчках комента. Не читали?+1
Sign up to leave a comment.
Попиксельная заливка экрана в Wolfenstein 3D (FizzleFade) — свежий взгляд