ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Техническая помощь в реализации самописных игр | страница 13 |
|
|
|
Канал Игры Мечты: «Техническая помощь в реализации самописных игр» |
|
|
БулерМэн
420 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Заслуженный художник (+40 EGP)](/conference/images/ranks/medals/artist.gif) Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
Shirson : |
В зачем ты рассуждаешь о темах, в которых не в зуб ногой?
|
Потому что в отличии от вас, Ширсон, я с питоном знаком, а вы нет.
Поэтому кто тут не в зуб ногой по моему все сказано вами же.
добавлено спустя 3 минуты:
Если честно, у меня никакого желания с вами вести беседы в таком тоне нет, поэтому давайте жить дружно
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (01:14 02-03-2018), всего редактировалось 2 раз(а) |
|
|
Zachesa
151 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Рейтинг канала: 4(95) Репутация: 13 Сообщения: 1415 Откуда: Хабаровск Зарегистрирован: 12.11.2007
![Вы не можете голосовать](images/tool_cool.gif) |
|
Jerry Rezet : |
Либо я косячу, либо чего-то не понимаю (ну не питон же?!).
|
А что за main() в конце файла?
Код: |
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() |
Вообще прокомментируй, что эта функция должна делать?
добавлено спустя 45 минут:
Что ты в результате хочешь получить? (Кстати какой питон 2.7?, 3.6?, для Linux или Windows?)
добавлено спустя 2 минуты:
Вот интересный проект https://github.com/glumpy/glumpy по теме, как я понял там набор всяких примитивов и чего-то ещё полезного.
добавлено спустя 8 минут:
Здесь что-то вроде "Привет мир!" с примером кода и подробными комментариями.
https://habrahabr.ru/post/247123/
Noise специально поменяно на Noize?
_________________ Язык Образов, для ситуационного моделирования, программирования и как язык мысли, думающей машины.
Последний раз редактировалось: Zachesa (07:04 02-03-2018), всего редактировалось 6 раз(а) |
|
|
Minx
978 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Золотая медаль SETI@Home, EG team (4395844 credits)](/conference/images/ranks/medals/seti_gold_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Меценат](/conference/images/ranks/medals/mecenat.gif) ![Ученый года 2011 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Профессор космологии (+50 EGP)](/conference/images/ranks/medals/professor.gif) ![Знаток Elite: Dangerous (+15 EGP)](/conference/images/ranks/medals/ed_expert.png) Рейтинг канала: 6(328) Репутация: 135 Сообщения: 10528 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
Jerry Rezet : |
Minx : |
Оптимизация начинается с
|
До оптимизации там ещё три парсека на маневровых. Пока чтобы хотя бы работало приемлемо.
|
Если у тебя не работает приемлемо по скорости, и ты пытаешься решить это, то это и есть оптимизация (по скорости).
Если ты не знаешь что тормозит, то попытки решения представляют собой танцы с бубном.
_________________ μηδείς αγεωμέτρητος εισίτω |
|
|
БулерМэн
420 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Заслуженный художник (+40 EGP)](/conference/images/ranks/medals/artist.gif) Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
Zachesa : |
А что за main() в конце файла?
|
"main()" это вызов функции, определенной заранее после "def main():"
Судя по коду внутри данной функции, которая кстати не обязана называться main, там происходит задание параметров сцены и прочие настройки. То есть по сути - вынос данного кода в отдельную функцию не обязателен. Так же возможны косяки с глобальными переменными, то есть если внутри main создается ссылка на объект, то за пределами данной функции ссылка уже будет не видна, даже если будет иметь то же самое имя.
добавлено спустя 2 минуты:
ЗЫ но в именно этом коде я не вижу создания каких-то объектов, которые могут использоваться в других местах программы. Исключение команда list создающая судя по всему массив, но при этом не изменяемая внутри функции и никакие данные туда при этом не поступают.
добавлено спустя 3 минуты:
plane = [] в начале кода ничего не делает и нигде не участвует.
добавлено спустя 5 минут:
Код: |
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)
|
и
Код: |
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)
|
можно объединить в один цикл, если я не ошибаюсь.
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (16:44 02-03-2018), всего редактировалось 3 раз(а) |
|
|
Jurec
348 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Член команды `Elite Games Team`](/conference/images/ranks/medals/egt.png) Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
>можно объединить в один цикл, если я не ошибаюсь.
зачем? это будет одинаково по скорости и страшно выглядеть в коде
количество итераций будет одинаково, то есть O(n^2) что так что так
_________________ MOV topka, C++ |
|
|
Shirson
1605 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Профессор космологии (+50 EGP)](/conference/images/ranks/medals/professor.gif) ![Ученый года 2003 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Ученый года 2012 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Ученый года 2013 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Заслуженный скептик (+25 EGP)](/conference/images/ranks/medals/sceptic.gif) ![Кербонавт года 2014 (+50 EGP)](/conference/images/ranks/medals/ksp_year.png) ![Кербонавт года 2016 (+50 EGP)](/conference/images/ranks/medals/ksp_year.png) ![Ученый года 2016 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Ученый года 2017 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002
![Вы не можете голосовать](images/tool_cool.gif) |
|
БулерМэн : |
Потому что в отличии от вас, Ширсон, я с питоном знаком, а вы нет.
|
Т.е. ты хочешь сказать, что в Питоне, вложенные циклы работают медленее, чем равный им по вычислительной сложности не вложеный? Что, вот правда?
_________________ У меня бисера не доxеpа.
Последний раз редактировалось: Shirson (19:35 02-03-2018), всего редактировалось 1 раз |
|
|
БулерМэн
420 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Заслуженный художник (+40 EGP)](/conference/images/ranks/medals/artist.gif) Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
Jurec : |
зачем? это будет одинаково по скорости и страшно выглядеть в коде
количество итераций будет одинаково, то есть O(n^2) что так что так
|
Shirson : |
вложенные циклы работают медленее, чем равный им по вычислительной сложности не вложеный?
|
Вы меня видимо не правильно поняли, либо я криво объяснил.
добавлено спустя 5 минут:
Примерно вот так. Мне не совсем понятно правда, зачем в первом цикле Area-1
Код: |
for j in range (Area-1):
for i in range (Area-1):
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)
#берем из другого цикла:
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) |
добавлено спустя 14 минут:
Ваш код в оригинале прогоняет дважды один и тот же массив из 10*10 элементов.
В моем приведенном фрагменте - один раз.
В таком случае, при обработке на ходу - время выполнения возможно сократиться в два раза.
Пишу возможно, т.к. код не проверял. Сколько кушает процесорного времени первая часть и сколько вторая мне не известно, а то может это "стремная экономия", которой можно пренебречь. Пробуйте.
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (21:12 02-03-2018), всего редактировалось 7 раз(а) |
|
|
Shirson
1605 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Профессор космологии (+50 EGP)](/conference/images/ranks/medals/professor.gif) ![Ученый года 2003 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Ученый года 2012 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Ученый года 2013 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Заслуженный скептик (+25 EGP)](/conference/images/ranks/medals/sceptic.gif) ![Кербонавт года 2014 (+50 EGP)](/conference/images/ranks/medals/ksp_year.png) ![Кербонавт года 2016 (+50 EGP)](/conference/images/ranks/medals/ksp_year.png) ![Ученый года 2016 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Ученый года 2017 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002
![Вы не можете голосовать](images/tool_cool.gif) |
|
БулерМэн : |
Вы меня видимо не правильно поняли, либо я криво объяснил.
|
Так виноваты вложенные циклы или что, что они крутят?
Да, я нуджный и придирчивый. Но ведь истина, однако, важнее
_________________ У меня бисера не доxеpа. |
|
|
Sh.Tac.
151 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
Jurec : |
количество итераций будет одинаково, то есть O(n^2) что так что так
|
а чего ты не посоветовал один раз загнать всё на GPU и там менять? всяко лучше, чем гонять по шине каждый кадр
_________________ This is what you get ...
(c) Radiohead |
|
|
Jurec
348 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Член команды `Elite Games Team`](/conference/images/ranks/medals/egt.png) Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
>В моем приведенном фрагменте - один раз.
>В таком случае, при обработке на ходу - время выполнения возможно сократиться в два раза.
а) Так ты можешь подготовить данные в одном месте один раз, а вызвать в другом - каждый кадр
б) Даже если это в одном кадре - количество операций не меняется, откуда 2 раза то?
в) Вообще говоря cache-miss'ов в цикле где ты делаешь всё, будет больше, и я ставлю что твой вариант будет медленнее из-за этого.
Sh.Tac. : |
а чего ты не посоветовал один раз загнать всё на GPU и там менять? всяко лучше, чем гонять по шине каждый кадр
|
Та я на такой уровень даже не поднимался и код не читал особо. Тут на базовых вещах проблемы.
_________________ MOV topka, C++ |
|
|
Jerry Rezet
581 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Рейтинг канала: 5(113) Репутация: 86 Сообщения: 3365 Откуда: Санкт-Петербург. Зарегистрирован: 01.04.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
Zachesa : |
Noise специально поменяно на Noize?
|
БулерМэн : |
plane = [] в начале кода ничего не делает и нигде не участвует.
|
БулерМэн : |
Исключение команда list создающая судя по всему массив, но при этом не изменяемая внутри функции и никакие данные туда при этом не поступают.
|
О! За этими кусками стоит долгая история попыток "сделать всё кузяво", которые раньше использовались, а потом выпиливались. И от них оставалось вот это, которое пока не мешает, но ничего не делает.. Это просто пример того, насколько я туп в питоне и ЯП вообще.
БулерМэн : |
Мне не совсем понятно правда, зачем в первом цикле Area-1
|
Это потому, что массив вершин имеет размер не 10*10, а 100*1, при этом вершины вызываются как будто они 10*10 в порядке 1-2-11, 1-2-10 (два треугольника), чтобы он не рисовал треугольник 9-10-19 (9 и 19 вершины рядом, а 10-я - уже на другом краю поля). Поэтому и -1 пришлось сделать. Это временный костыль, дальше просто буду с NumPy работать, с нормальными массивами. А то задолбался..
добавлено спустя 10 минут:
Если вообще не соскочу с питона в OpenGL, когда освою MinGW (что тоже пока не без трудностей - даже примеры не запускаются как надо, хотя и компилируются даже без пердуперждений).
_________________ - Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c]
Последний раз редактировалось: Jerry Rezet (15:10 08-03-2018), всего редактировалось 2 раз(а) |
|
|
БулерМэн
420 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Заслуженный художник (+40 EGP)](/conference/images/ranks/medals/artist.gif) Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
Jurec : |
а) Так ты можешь подготовить данные в одном месте один раз, а вызвать в другом - каждый кадр
|
"Шум Перлина", который в даннм примере нифига не шум, предполагается наверное создавать на каждом шаге заново, или я не понял задачу?
Если на каждом шаге нужен пересчет данных - то лучше, на мой взгляд, считать на ходу вместе с циклом отрисовки. Никакой разницы между отрисовкой готового массива данных и отрисовки в процессе обработки этих данных нет - геометрия в течении шага не меняется, если данные в массиве являются "слепком" некой конечной геометрии, а не отражают какой-то динамический процесс, требующий пересчета соседних ячеек массива.
Jurec : |
б) Даже если это в одном кадре - количество операций не меняется, откуда 2 раза то?
|
Как это не меняется? У тебя есть два цикла, у каждого цикла обрабатывающего одинаковое число данных в массиве есть определенное время выполнения. Если вызвать один и тот же цикл два раза подряд - на это уйдет 2*T. Другой вопрос, что это незначительное время, но для "тяжелых" операций время будет значительным.
Jurec : |
в) Вообще говоря cache-miss'ов в цикле где ты делаешь всё, будет больше, и я ставлю что твой вариант будет медленнее из-за этого.
|
Если идет речь о cache-miss в таком ключе и есть сомнения в том, что доступ к таким новосозданным данным будет замедленнен из-за разбросанности данных в ОЗУ - то у меня плохие новости - питон гораздо медленнее работает чем ламповый Си. Так что тут скорее надо заботиться не о chache-miss, а вообще о тормозах кода.
Jerry Rezet : |
когда освою MinGW
|
А разве ничего кроме MinGW не существует в нашем космическом вакууме?
_________________ Дулички и фигушки |
|
|
Sh.Tac.
151 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
БулерМэн : |
разве ничего кроме MinGW не существует в нашем космическом вакууме?
|
я кста так и не смог разобраться во всём этом огороде msys2/mingw/cygwin
но сейчас винда вроде бы поддерживает линух напрямую, по крайней мере 10-ка
Control Panel | Programs | Windows Features | Windows Subsystem for Linux
добавлено спустя 1 минуту:
ссылка
_________________ This is what you get ...
(c) Radiohead
Последний раз редактировалось: Sh.Tac. (23:29 08-03-2018), всего редактировалось 1 раз |
|
|
Jerry Rezet
581 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Рейтинг канала: 5(113) Репутация: 86 Сообщения: 3365 Откуда: Санкт-Петербург. Зарегистрирован: 01.04.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
БулерМэн : |
А разве ничего кроме MinGW не существует в нашем космическом вакууме?
|
"В нашем космическом вакууме" наобормот, существует слишком много всего. LCC, например.. Да и вообще много слишком всего - мне бы хотя бы что-нибудь чтобы освоить.. Но я - ленивая опа, да. Осваивать майкрософтовские поделия чтобы пейсать чисто для винды не хочется - как-то греет душу "сама возможность писать кроссплатформенно" (что, может быть, ни разу и не реализуется, но сама мысль таки греет ЧСВ )
БулерМэн : |
"Шум Перлина", который в даннм примере нифига не шум, предполагается наверное создавать на каждом шаге заново, или я не понял задачу?
|
нет, предполагается допилить эту функцию до "нормального шума Перлина", а пока это просто "заглушка" с линейно сглаженным шумом по окресностям.
_________________ - Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c] |
|
|
Zachesa
151 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Рейтинг канала: 4(95) Репутация: 13 Сообщения: 1415 Откуда: Хабаровск Зарегистрирован: 12.11.2007
![Вы не можете голосовать](images/tool_cool.gif) |
|
Jerry Rezet : |
О! За этими кусками стоит долгая история попыток "сделать всё кузяво", которые раньше использовались, а потом выпиливались. И от них оставалось вот это, которое пока не мешает, но ничего не делает.. Это просто пример того, насколько я туп в питоне и ЯП вообще.
|
Может не стоит оно того? Вон как БулерМэн освой ГеймМаркет, или как я посмотри Блупринты в Анриале, от них легко перейти к плюсам потом.
_________________ Язык Образов, для ситуационного моделирования, программирования и как язык мысли, думающей машины. |
|
|
Jerry Rezet
581 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Рейтинг канала: 5(113) Репутация: 86 Сообщения: 3365 Откуда: Санкт-Петербург. Зарегистрирован: 01.04.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
Zachesa : |
Может не стоит оно того?
|
У меня не МегаПуперГиперИГРИЩЩА, а просто пробую освоить азы игростроительства. Хочу сделать "бесконечную" карту, а там посмотрим, что из этого получится. Собственно цель всех этих метаний - научиться чему-нибудь хорошему. Возможно и советуемое освою, но позже.
_________________ - Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c] |
|
|
Minx
978 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Золотая медаль SETI@Home, EG team (4395844 credits)](/conference/images/ranks/medals/seti_gold_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Меценат](/conference/images/ranks/medals/mecenat.gif) ![Ученый года 2011 (+50 EGP)](/conference/images/ranks/medals/scientist.gif) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Профессор космологии (+50 EGP)](/conference/images/ranks/medals/professor.gif) ![Знаток Elite: Dangerous (+15 EGP)](/conference/images/ranks/medals/ed_expert.png) Рейтинг канала: 6(328) Репутация: 135 Сообщения: 10528 Откуда: Gomel, Belarus Зарегистрирован: 19.11.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
Jerry Rezet : |
пробую освоить азы игростроительства. Хочу сделать "бесконечную" карту, а там посмотрим, что из этого получится
|
Только не следует путать игростроительство и картостоительство.
_________________ μηδείς αγεωμέτρητος εισίτω
Последний раз редактировалось: Minx (20:05 09-03-2018), всего редактировалось 1 раз |
|
|
Jurec
348 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Член команды `Elite Games Team`](/conference/images/ranks/medals/egt.png) Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
БулерМэн : |
Как это не меняется? У тебя есть два цикла, у каждого цикла обрабатывающего одинаковое число данных в массиве есть определенное время выполнения. Если вызвать один и тот же цикл два раза подряд - на это уйдет 2*T. Другой вопрос, что это незначительное время, но для "тяжелых" операций время будет значительным.
|
Блин, я обычно таким не занимаюсь, но давай разжевывать.
А - 1 секунда
В - 2 секунды
for 1-ый (n итераций)
for 2-ой (m итераций)
операция А (1)
операция В (2)
(1+2)*m*n = 3mn
и
for 1-ый (n итераций)
for 2-ой (m итераций)
операция А (1)
это 1mn
for 1-ый (n итераций)
for 2-ой (m итераций)
операция В (2)
это 2mn
1mn + 2mn = 3mn
разницы нет в сложности алгоритма никакой.
но есть скрытая цена, я ща позже разжую и это, надо просто твою цитату тут вставить
БулерМэн : |
то у меня плохие новости - питон гораздо медленнее работает чем ламповый Си. Так что тут скорее надо заботиться не о chache-miss, а вообще о тормозах кода.
|
питон, си, брейнфак -- неважно. код выполняется на железе. у железа есть память и процессор с кешом. если ты получаешь доступ к переменной, которой нет в кеше - читается кеш линия (64 байта) из озу. что в си, что в питоне. Доступ к кешу молниеносный. К памяти - на несколько порядков больше. Вот тут добавляется скрытая стоимость, которой не видно в оценке сложности алгоритма.
Но это я захожу сильно далеко, потому что твоя позиция неверная что с точки зрения сложности алгоритма, что с точки зрения железа.
_________________ MOV topka, C++ |
|
|
БулерМэн
420 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Заслуженный художник (+40 EGP)](/conference/images/ranks/medals/artist.gif) Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
Jurec : |
Но это я захожу сильно далеко, потому что твоя позиция неверная что с точки зрения сложности алгоритма, что с точки зрения железа.
|
Хорошо, ты меня хочешь убедить что я не прав. Давай проведем эксперимент, возьмем один и тот же код и выполним его на одном и том же железе? Где будет быстрее, с одним вложенным циклом, или с двумя вложенными.
Предлагаю код на Си и на Питон (чуть позже)
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (21:58 12-03-2018), всего редактировалось 2 раз(а) |
|
|
БулерМэн
420 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Заслуженный художник (+40 EGP)](/conference/images/ranks/medals/artist.gif) Рейтинг канала: 2(21) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
Чтобы было понятно, что я на это потратил не пять минут, приведу результаты измерений ниже.
Примеры на двух языках, выполненные максимально похоже.
Количество итераций выбрано разным для разных языков, но при этом в сопоставимом временном диапазоне выполнения.
Раздельные циклы, Си (кликните здесь для просмотра)
Код: |
#include <time.h>
#include <stdio.h>
#include <math.h>
int main(void)
{
time_t start_t, end_t;
double diff_t;
int i = 0;
int j = 0;
int x,y,z;
float xn,yn,zn, D, D_2;
x = 0;
y = 0;
z = 0;
xn = 0;
yn = 0;
zn = 0;
D = 0;
D_2 = 0;
time(&start_t);
for(i=0;i<10000;i+=1)
{
for(j=0;j<10000;j+=1)
{
x=i;
y=j;
z=1;
D = sqrt(x*x+y*y+z*z);
xn= x/D;
yn= y/D;
zn= z/D;
}
}
for(i=0;i<10000;i+=1)
{
for(j=0;j<10000;j+=1)
{
x=i;
y=j;
z=1;
D_2 = sqrt(x*x+y*y+z*z)+100*sqrt(x);
}
}
time(&end_t);
diff_t = difftime(end_t, start_t);
printf("Execution time = %f\n", diff_t);
system("pause");
return 0;
}
|
|
Объединенный цикл, Си (кликните здесь для просмотра)
Код: |
#include <time.h>
#include <stdio.h>
#include <math.h>
int main(void)
{
time_t start_t, end_t;
double diff_t;
int i = 0;
int j = 0;
int x,y,z;
float xn,yn,zn, D, D_2;
x = 0;
y = 0;
z = 0;
xn = 0;
yn = 0;
zn = 0;
D = 0;
D_2 = 0;
time(&start_t);
for(i=0;i<10000;i+=1)
{
for(j=0;j<10000;j+=1)
{
x=i;
y=j;
z=1;
D = sqrt(x*x+y*y+z*z);
xn= x/D;
yn= y/D;
zn= z/D;
//переместили из второго цикла в этот:
x=i;
y=j;
z=1;
D_2 = sqrt(x*x+y*y+z*z)+100*sqrt(x);
}
}
time(&end_t);
diff_t = difftime(end_t, start_t);
printf("Execution time = %f\n", diff_t);
system("pause");
return 0;
}
|
|
Раздельные циклы, Python 2.7 (кликните здесь для просмотра)
Код: |
import os
import time
import math
import sys
#print sys.version[]
#print('print to log')
start_time = time.time()
for i in range(2500):
for j in range(2500):
#print "...";
x=i;
y=j;
z=1;
D = math.sqrt(x*x+y*y+z*z);
xn= x/D;
yn= y/D;
zn= z/D;
for i in range(2500):
for j in range(2500):
#print "...";
x=i;
y=j;
z=1;
D_2 = math.sqrt(x*x+y*y+z*z)+100*math.sqrt(x);
print("--- %s seconds ---" % (time.time() - start_time))
raw_input();
|
|
Объединенный цикл, Python 2.7 (кликните здесь для просмотра)
Код: |
import os
import time
import math
import sys
#print sys.version[:3]
#print('print to log')
start_time = time.time()
for i in range(2500):
for j in range(2500):
#print "...";
x=i;
y=j;
z=1;
D = math.sqrt(x*x+y*y+z*z);
xn= x/D;
yn= y/D;
zn= z/D;
#move code from second 'for'
x=i;
y=j;
z=1;
D_2 = math.sqrt(x*x+y*y+z*z)+100*math.sqrt(x);
print("--- %s seconds ---" % (time.time() - start_time))
raw_input();
|
|
Результаты:
Си: | Номер теста | Раздельные циклы Си,сек | Объединенный цикл Си,сек |
1 | 34 | 33 | 2 | 33 | 33 | 3 | 34 | 34 | 4 | 33 | 33 | 5 | 33 | 34 | Python 2.7: |
Номер теста | Раздельные циклы Python 2.7,сек | Объединенный цикл Python 2.7,сек |
1 | 30.43 | 29.5 | 2 | 29.95 | 29.25 | 3 | 30.17 | 29.078 | 4 | 29.84 | 29.54 | 5 | 30.23 | 29.71 | 6 | 29.98 | 29.09 | среднее: | 30.1 | 29.36 | разница: | 0.74 |
Вывод: разница в коде на Си - отсутствует, как и говорил Jurec.
В коде на Python 2.7 разница чуть меньше секунды, из-за применения функции range() в качестве аналога 'i<=...;i+=1' в Си.
Однако, смотрим далее, время выполнения команды range() с тем же количеством "повторов" дает результат 0.15555 сек, а не 0.75
Cкрытый текст (кликните здесь для просмотра)
Код: |
import os
import time
import math
import sys
#print sys.version[:3]
#print('print to log')
start_time = time.time()
my_list = range(6250000)
print("--- %s seconds ---" % (time.time() - start_time))
raw_input();
|
|
Следовательно в Питоне что-то тормозит еще, кроме функции range(), но это тема отдельной дискуссии.
Да, ускорение не в два раза, как я утверждал ранее.
С точки зрения оптимизации - если убрать в коде на питоне второй цикл - время сократится где-то на 0.5 сек на 1 кадр анимации при условии, что в каждом цикле будет 2500 итераций (по 2500 на X и Y)
В пересчете на матрицу из 10*10 значений - это ноль целых, ноль-ноль-ноль-ноль... секунды выигрыша в скорости.
Но на больших объектах или "текстурах" тормоза могут вылезти в падении FPS (если для питона вообще применимо это).
Еще есть вариант использовать не for, а while.
Cкрытый текст (кликните здесь для просмотра)
Код: |
import os
import time
import math
import sys
#print sys.version[:3]
#print('print to log')
start_time = time.time()
i=0;
j=0;
while i<=2500:
while j<=2500:
#print "...";
x=i;
y=j;
z=1;
D = math.sqrt(x*x+y*y+z*z);
xn= x/D;
yn= y/D;
zn= z/D;
#move code from second 'for'
x=i;
y=j;
z=1;
D_2 = math.sqrt(x*x+y*y+z*z)+100*math.sqrt(x);
j+=1;
i+=1;
j=0;
print("--- %s seconds ---" % (time.time() - start_time))
raw_input();
|
|
Но результат еще хуже, чем два отдельных "медленных" цикла for.
Все зависит от реализации механизма цикла в языке.
Для данных примеров программа на языке Си работает в 16 раз быстрее чем аналогичная на питоне.
_________________ Дулички и фигушки
Последний раз редактировалось: БулерМэн (02:29 13-03-2018), всего редактировалось 8 раз(а) |
|
|
|
|
|
Канал Игры Мечты: «Техническая помощь в реализации самописных игр» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Ну и с какого сайта мы инфу копи-пастим? Егопки с репками зарабатываем? (поинтересовался Харлей)
|
» Техническая помощь в реализации самописных игр | страница 13 |
|