wowlikon
Ноя. 30, 2021 19:33:45
Я недавно решил запилить 3D графику в консоли как в видео
Видео но в консоль не успевают выводиться символы.
Код:
import math, random, os, time
width = 80
height = 20
k = (width/height) * (11/24)
screen = ['.']*(height*width+width)
def render(arr, width, height, k, t):
for y in range(height):
vy = (y/height)*2-1
for x in range(width):
vx = (x/width)*2-1
vx *= k
if math.sqrt(vx*vx + vy*vy) <= abs(math.cos(t))*0.75:
arr[x+x*y] = '@'
else:
arr[x+x*y] = ' '
if x != width:
print(arr[x+x*y], end='')
else:
print(arr[x+x*y])
return arr
t = 0.0
run = True
while run:
screen = render(screen, width, height, k, t)
t += 0.15
time.sleep(0.25)
os.system('cls')
PEHDOM
Ноя. 30, 2021 21:14:08
Вы же видео смотрели, в нем у афтора теже проблемы, правда при увеличении “разрешения”, но сути это не меняет.
Однозначного ответа вам не будет, потому что операция вывода в консоль - в принципе медленная и сильно зависит от процессора, и ОС. Плюс вы пишете на пайтон так как будто это Си, что есть очень даже плохо.пайтон не Си и писать на нем нужно как на пайтоне.
МОгу дть толлько пару общих советов:
- Вы делаете принт для каждого символа, сильно подозреваю, что если печатать хотябы построчно то будет быстрее, а еще лучше сразу весь экран выводить.
- Делать os.system('cls') туже глупо, это “лишнее движение”, просто перемещайте курсор в начало экрана и рисуйте “поверх”.
- map и zip могут сильно ускорить код.
Попрбуйте вместо принт sys.stdout.write или os.write возможно это тоже ускорит.
time.sleep(0.25) серьезно? возможно стоит это время не молотить в холостую, а посчитать следующу сцену?
обратите внимание на модули curses/UniCurses, colorama.