ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Техническая помощь в реализации самописных игр | страница 12 |
|
|
|
Канал Игры Мечты: «Техническая помощь в реализации самописных игр» |
|
|
Jerry Rezet 581 EGP
Рейтинг канала: 5(113) Репутация: 86 Сообщения: 3365 Откуда: Санкт-Петербург. Зарегистрирован: 01.04.2005 |
|
С питоном у меня что-то не сложилось в OpenGL.. Либо я косячу, либо чего-то не понимаю (ну не питон же?!).. Если кому интересно пофейспалмить над мои кодом - он до катом. Нервных, беременных женщин, детей и кошек уберите подальше от экрана. Вот такой код дико тормозит..
Cкрытый текст (кликните здесь для просмотра)
По клавишам стрелкам можно поворачивать сгенерированную плоскость относительно нуля координат.
Код: |
# -*- coding: cp1251 -*-
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
import math
#import numpy
#from numpy import *
import numpy as np
def Noize (x, y):
Amp = 3
n = x + y * 57
n = (n<<13) ^ n;
return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0)*Amp
def Perlin (x,y): #Знаю, это нихрена не перлин, просто усредняю. Тут он дальше планировался Такого фейспалма ещё много в этом коде
return (Noize (x-1,y-1) + Noize (x-1,y) + Noize (x-1,y+1)
+ Noize (x,y-1) + Noize (x,y) + Noize (x,y+1)
+ Noize (x+1,y-1) + Noize (x+1,y) + Noize (x+1,y+1))/8
GPlane = []
GPlaneNormals = []
LightCoord = [1,10,10,0]
LightColor = [1.0,1.0,1.0,1,0]
plane = []
Area = 100
def FillOfNoize (GPlane, GPlaneNormals, Area):
for i in range (Area):
for j in range (Area):
GPlane.append(i)
GPlane.append(j)
GPlane.append(Perlin(i,j))
x=i; y=j; z=Perlin(i,j)
xn=x/math.sqrt(x*x+y*y+z*z)
yn=y/math.sqrt(x*x+y*y+z*z)
zn=z/math.sqrt(x*x+y*y+z*z)
GPlaneNormals.append(xn)
GPlaneNormals.append(yn)
GPlaneNormals.append(zn)
rot = 0
rotX = 0
rotY = 0
rotZ = 0
def InitGL(Width, Height):
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_COLOR_MATERIAL)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, float(Width)/float(Height), 0.1, 1000.0)
glMatrixMode(GL_MODELVIEW)
def ReSizeGLScene(Width, Height):
if Height == 0: Height = 1
glViewport(0, 0, Width, Height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
def DrawArea ():
global rot
light_pos = [0,0,0,0]
rot = (rot + 1) % 360 # увеличиваем угол поворота
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # очищаем экран
glLoadIdentity() # восстанавливаем мировые координаты
gluLookAt (3.0, 3.0, 7.0, 0.0, 0.0, -10.0, 1.0, 0.0, 0.0) #смотреть на -10 по оси z
glTranslatef(0.0,0.0,-10.0) # -10 по оси Z
glRotatef(rotX,1.0,0.0,0.0)
glRotatef(rotY,0.0,1.0,0.0)
#glRotatef(rot,0.0,0.0,1.0)
#glColor4f(0.0,0.7,0.1,1)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnableClientState(GL_VERTEX_ARRAY)
glEnableClientState(GL_NORMAL_ARRAY)
glVertexPointer(3, GL_FLOAT, 0, GPlane)
glNormalPointer(GL_FLOAT, 0, GPlaneNormals)
m=10; n=10
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightColor)
glLightfv(GL_LIGHT0, GL_POSITION, LightCoord)
glEnable(GL_LIGHT0)
glBegin(GL_TRIANGLES)
for j in range (Area-1):
for i in range (Area-1):
glColor4f(0.0,0.7,0.1,1)
glArrayElement(i+j*Area)
glArrayElement(i+j*Area+Area) #
glArrayElement(i+j*Area+Area+1)
glColor4f(1.0,0.7,0.1,1)
glArrayElement(i+j*Area)
glArrayElement(i+j*Area+1) #
glArrayElement(i+j*Area+Area+1)
glEnd()
glBegin(GL_LINES)
glColor3f (1.0,0.0,0.0) # red 0x
glVertex3f (0,0,0)
glVertex3f (1,0,0) # 0x
glColor3f (0.0,1.0,0.0) # green 0y
glVertex3f (0,0,0)
glVertex3f (0,1,0) # 0y
glColor3f (0.0,0.0,1.0) # blue 0z
glVertex3f (0,0,0)
glVertex3f (0,0,1) # 0z
glEnd()
#glutSolidCube(3) # Это было для проверки начала координат
glutSwapBuffers()
def DrawGLScene():
DrawArea()
def KeyPressed(*args):
if args[0]=="\033": sys.exit()
def SpecialKeyPressed(*args):
repeatMode = GLUT_KEY_REPEAT_ON
glutSetKeyRepeat(repeatMode)
global rotX
global rotY
if args[0]==GLUT_KEY_LEFT: rotX = (rotX + 5) % 360
# увеличиваем угол поворота
if args[0]==GLUT_KEY_RIGHT: rotX = (rotX - 5) % 360
if args[0]==GLUT_KEY_UP: rotY = (rotY + 5) % 360
if args[0]==GLUT_KEY_DOWN: rotY = (rotY - 5) % 360
#if args[1]<0: print args[1],args[2]
#GLUT_KEY_LEFT - функциональная клавиша стрелка влево
#GLUT_KEY_RIGHT - функциональная клавиша стрелка вправо
#GLUT_KEY_UP - функциональная клавиша стрелка вверх
#GLUT_KEY_DOWN - функциональная клавиша стрелка вниз
def main():
list(plane)
FillOfNoize(GPlane, GPlaneNormals, Area)
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
glutInitWindowSize(640, 480)
glutInitWindowPosition(0, 0)
glutCreateWindow("Hight Map-001 Noize.py")
glutDisplayFunc(DrawGLScene)
glutIdleFunc(DrawGLScene)
glutReshapeFunc(ReSizeGLScene)
glutKeyboardFunc(KeyPressed)
glutSpecialFunc(SpecialKeyPressed)
InitGL(400, 300)
glutMainLoop()
main()
|
|
Пробую MinGW под виндою, но тоже что-то компилится, но запускаться не хочет.. Интересно, в общем живётся..
добавлено спустя 1 минуту:
Shirson : |
Ты нашёл у кого спрашивать
|
Честно говоря перед этим я замучил гугль этим вопросом, но что-то тупил. Про гитхаб не догадался..
_________________ - Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c]
Последний раз редактировалось: Jerry Rezet (15:55 28-02-2018), всего редактировалось 1 раз |
|
|
БулерМэн 420 EGP
Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006 |
|
Jerry Rezet : |
Вот такой код дико тормозит..
|
Вложенные циклы? Два подряд? Три? О да, трэш и угар, не удивительно почему тормозит
_________________ Дулички и фигушки |
|
|
Jerry Rezet 581 EGP
Рейтинг канала: 5(113) Репутация: 86 Сообщения: 3365 Откуда: Санкт-Петербург. Зарегистрирован: 01.04.2005 |
|
БулерМэн : |
Вложенные циклы? Два подряд? Три? О да, трэш и угар, не удивительно почему тормозит
|
Отоночо.. Понял. Один цикл - это норм будет, или и от него избавиться надо? Я как-то не думал, что всё так печально.. С моим пониманием быстродействия.. Остаётся только удивиться очевидности и воскликнуть "как же я сам не додумался!" с ритуальным масс-фейспалмом.. (как бы не разбить себе ничего от интенсивности.. но мозоль, чую, я таки заработаю.. )
_________________ - Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c]
Последний раз редактировалось: Jerry Rezet (23:00 28-02-2018), всего редактировалось 1 раз |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
БулерМэн : |
Вложенные циклы? Два подряд? Три? О да, трэш и угар, не удивительно почему тормозит
|
Ты обладаешь сакральным знанием, как херачить двумерный шум Перлина без вложеных циклов? Поделишься?
_________________ У меня бисера не доxеpа. |
|
|
Jerry Rezet 581 EGP
Рейтинг канала: 5(113) Репутация: 86 Сообщения: 3365 Откуда: Санкт-Петербург. Зарегистрирован: 01.04.2005 |
|
Shirson : |
Ты обладаешь сакральным знанием, как херачить двумерный шум Перлина без вложеных циклов? Поделишься?
|
Не. Перлин генерится где-то в начале, а у меня тройные циклы в рисовке, так его разэдак. Пока же там Кеном Перлиным даже не пахнет - там просто заглушка-"сглаживатель" без всяких циклов.
_________________ - Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c] |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
И как вывести данные и двумерного массива без вложенных цклов?
_________________ У меня бисера не доxеpа.
Последний раз редактировалось: Shirson (23:41 28-02-2018), всего редактировалось 1 раз |
|
|
БулерМэн 420 EGP
Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006 |
|
Shirson : |
Ты обладаешь сакральным знанием, как херачить двумерный шум Перлина без вложеных циклов? Поделишься?
|
Мы все знаем что я не знаю как, иначе бы уже давно нарисовал бы вам волны в синем море да еще и на скриптовом языке при 60 FPS
Shirson : |
И как вывести данные и двумерного массива без вложенных цклов?
|
Может хранить данные в одномерном массиве?
Если размер матрицы заранее известен, то можно ограничиться одним циклом.
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (02:08 01-03-2018), всего редактировалось 3 раз(а) |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
Это никак не повлияет на количество итераций.
_________________ У меня бисера не доxеpа. |
|
|
БулерМэн 420 EGP
Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006 |
|
Код: |
p[0] = '123456789012345678901234567890'
count = 0;
str_count = strlen(*p)-1;
for(i=1;i<=10;i+=1)
{
printf(p[i]);
count+=1;
if(i==9)
{
printf("\r\n");
i=0;
}
if(count >= str_count)
{
i=11;
}
}
|
Вроде так быстрее по идее должно быть, чем вложенный цикл.
(перенес пост ниже)
Зато количество операций должно быть меньше.
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (02:10 01-03-2018), всего редактировалось 1 раз |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
Есть матрица 10х10.
Нужно вывести её всю. Это 10х10=100 итераций
Как сделать это быстрее, если матрица 100х1?
Я знаю, что количество итераций в обоих случаях будет одинаково. А ты уверен в обратном. Значит кто-то из нас ошибается
Как вывести матрицу 100х1 быстрее, чем за 100 итераций?
_________________ У меня бисера не доxеpа.
Последний раз редактировалось: Shirson (02:33 01-03-2018), всего редактировалось 1 раз |
|
|
Jerry Rezet 581 EGP
Рейтинг канала: 5(113) Репутация: 86 Сообщения: 3365 Откуда: Санкт-Петербург. Зарегистрирован: 01.04.2005 |
|
За одну итерацию вывести сразу 100!
добавлено спустя 14 минут:
Shirson : |
Это никак не повлияет на количество итераций.
|
Видимо вложенные циклы тоже жрут что-то.. А если по существу - то надо перейти от вызова ArrayElement по три штуки на треугольник (коих у меня 200 штук на 100 вершин, и вызовы вершин занимают ещё по 200 лишних вызовов - на один квадрат приходится две общих вершины у двух треугольников) к фигачению сразу массива вершин одним вызовом. Это должно быть быстрее. Вывести сразу все 100 вершин. Благо OpenGL это позволяет.
_________________ - Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c]
Последний раз редактировалось: Jerry Rezet (08:53 01-03-2018), всего редактировалось 3 раз(а) |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
Jerry Rezet : |
За одну итерацию вывести сразу 100!
|
Индуский код, алахай-малахай
Цитата: |
Shirson : |
Это никак не повлияет на количество итераций.
|
Видимо вложенные циклы тоже жрут что-то..
|
Нет.
Цитата: |
А если по существу - то надо перейти от вызова ArrayElement к фигачению сразу массива вершин одним вызовом. Это должно быть быстрее. Вывести сразу все 100 вершин.
|
Всякие вертексные буферы и прочие списки - это уже следующий уровень.
Ткт речь как раз про вложенные циклы.
А они работают одинакого, что один цикл на 100, что два вложеных по 10.
Но ждём Будера с откровениями
_________________ У меня бисера не доxеpа. |
|
|
Minx 979 EGP
Рейтинг канала: 6(328) Репутация: 135 Сообщения: 10528 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005 |
|
Jerry Rezet : |
Видимо вложенные циклы тоже жрут что-то.. А если по существу - то надо перейти от вызова ArrayElement по три штуки на треугольник (коих у меня 200 штук на 100 вершин, и вызовы вершин занимают ещё по 200 лишних вызовов - на один квадрат приходится две общих вершины у двух треугольников) к фигачению сразу массива вершин одним вызовом. Это должно быть быстрее. Вывести сразу все 100 вершин. Благо OpenGL это позволяет.
|
Оптимизация начинается с профайлинга. Иначе это пляски с бубном. Определи бутылочное горлышко, потом оптимизируй.
_________________ μηδείς αγεωμέτρητος εισίτω |
|
|
Jerry Rezet 581 EGP
Рейтинг канала: 5(113) Репутация: 86 Сообщения: 3365 Откуда: Санкт-Петербург. Зарегистрирован: 01.04.2005 |
|
Minx : |
Оптимизация начинается с
|
До оптимизации там ещё три парсека на маневровых. Пока чтобы хотя бы работало приемлемо.
_________________ - Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c] |
|
|
БулерМэн 420 EGP
Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006 |
|
Shirson : |
Я знаю, что количество итераций в обоих случаях будет одинаково. А ты уверен в обратном.
|
Не-не-не, Дэвид Блэйн(с) я этого не говорил. Я сказал операций, а не итераций.
Итераций в матрице 10*10 и в матрице 100*1 будет одинаковое количество, а вот операций сложения, вычитания, сравнения будет разное количество.
добавлено спустя 1 минуту:
Jerry Rezet : |
За одну итерацию вывести сразу 100!
|
Сомнительно, но пока не измеришь на готовом - не будет понятно что быстрее.
добавлено спустя 3 минуты:
Jerry Rezet : |
По клавишам стрелкам можно поворачивать сгенерированную плоскость относительно нуля координат.
|
ИМХО куски кода с циклами вывести во внешнюю динамическую библиотеку.
А потом восхититься скоростью и убрать к чертям весь питон
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (17:35 01-03-2018), всего редактировалось 2 раз(а) |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
БулерМэн : |
Не-не-не, Дэвид Блэйн(с) я этого не говорил. Я сказал операций, а не итераций.
|
А зачем сказал?
Цитата: |
Итераций в матрице 10*10 и в матрице 100*1 будет одинаковое количество, а вот операций сложения, вычитания, сравнения будет разное количество.
|
Почему?
_________________ У меня бисера не доxеpа. |
|
|
БулерМэн 420 EGP
Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006 |
|
Shirson : |
А зачем сказал?
|
Потому что будет другое количество, которое изменяет время выполнения.
Хотите об этом поговорить?
В примере выше, я использовал две операции сложения (в инструкции for и в теле, там где count), две операции присвоения конкретного значения переменной, две логических операции сравнения, проверка переменной в инструкции for для каждой итерации, и наконец операция сложения в инструкции for для переменной i.
Итого: 8 операций с данными.
В случае с двумя циклами for вложенными друг в друга:
Две проверки условия в инструкциях for, две операции сложения для счетчиков i и j.
Итого: 4 операции.
В этих двух случаях - не учитываются операции запроса самих данных из массивов, или из структур, смотря как реализовано.
Вложенные циклы, не смотря на очевидную разницу в количестве операций - тормозят на скриптовых языках, или даже на таких где код транслируется в машинный и исполняется уже не интерпретатором, а непосредственно бинарный самим процессором.
В случае с Jerry Rezet - могу предложить рисовать графику на ходу, объединив циклы вычисления (xn=x/math.sqrt(x*x+y*y+z*z)) и циклы рисования.
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (23:10 01-03-2018), всего редактировалось 1 раз |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
БулерМэн : |
Shirson : |
А зачем сказал?
|
Потому что будет другое количество, которое изменяет время выполнения.
|
Складывается лёгкое впечатление, что с понятием вычислительной сложности ты не очень знаком, да?
Цитата: |
Хотите об этом поговорить?
В примере выше, я использовал две операции сложения (в инструкции for и в теле, там где count), две операции присвоения конкретного значения переменной, две логических операции сравнения, проверка переменной в инструкции for для каждой итерации, и наконец операция сложения в инструкции for для переменной i.
Итого: 8 операций с данными.
|
Теперь впечатление уже не лёгкое
Посмотри
ссылка
и
ссылка
Возможно, лучше на английском, там более подробно.
_________________ У меня бисера не доxеpа.
Последний раз редактировалось: Shirson (00:54 02-03-2018), всего редактировалось 1 раз |
|
|
БулерМэн 420 EGP
Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006 |
|
Shirson : |
с понятием вычислительной сложности ты не очень знаком, да?
|
Ширсон, вам заняться больше нечем, кроме как знакомить с википедией? Попробуйте себя в преподавательской деятельности, у вас получится.
ЗЫ а вот помочь Jerry Rezet видимо вам не судьба, если обладаете серьезным багажом знаний, в отличии от меня. Пока я увидел лишь сарказм и в мою сторону и в сторону Jerry Rezet. Вы только мешаете, "хотите об этом поговорить" - это была ирония.
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (01:06 02-03-2018), всего редактировалось 6 раз(а) |
|
|
Shirson 1605 EGP
Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002 |
|
БулерМэн : |
Ширсон, вам заняться больше нечем, кроме как знакомить с википедией?
|
В зачем ты рассуждаешь о темах, в которых не в зуб ногой?
Цитата: |
ЗЫ а вот помочь Jerry Rezet видимо вам не судьба
|
Ссылки на его вопрос я нашёл.
Но с Питоном незнаком и тут уже помочь никак немогу.
Цитата: |
Пока я увидел лишь сарказм и в мою сторону и в сторону Jerry Rezet.
|
Тебе померещилось. Саркзм был только в твою сторону (почему - сказано в первом абзаце)
_________________ У меня бисера не доxеpа.
Последний раз редактировалось: Shirson (01:06 02-03-2018), всего редактировалось 1 раз |
|
|
|
|
|
Канал Игры Мечты: «Техническая помощь в реализации самописных игр» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Слышал, что в Москву-реку активно запускают осетров. Если они там не растворятся, это будет хорошая традиция.(Ocean) - С тем раствором, что вместо воды в Москве-реке, как бы через пару лет они не вылезли на берег и не начали жрать прохожих (Tantis)
|
» Техническая помощь в реализации самописных игр | страница 12 |
|