Elite Games - Свобода среди звезд!
.
  » Техническая помощь в реализации самописных игр | страница 13
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 13 из 15
На страницу: Пред.  1, 2, 3 ... 12, 13, 14, 15  След.    Перейти:   Все страницы
Поиск в этой теме:
Канал Игры Мечты: «Техническая помощь в реализации самописных игр»
БулерМэн
 390 EGP


Рейтинг канала: 2(21)
Репутация: 64
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
Shirson :
В зачем ты рассуждаешь о темах, в которых не в зуб ногой?

Потому что в отличии от вас, Ширсон, я с питоном знаком, а вы нет.
Поэтому кто тут не в зуб ногой по моему все сказано вами же.

добавлено спустя 3 минуты:
Если честно, у меня никакого желания с вами вести беседы в таком тоне нет, поэтому давайте жить дружно Улыбка
_________________
Дулички и фигушки

Последний раз редактировалось: БулерМэн (01:14 02-03-2018), всего редактировалось 2 раз(а)
    Добавлено: 01:14 02-03-2018   
Zachesa
 115 EGP

Рейтинг канала: 4(95)
Репутация: 13
Сообщения: 1402
Откуда: Хабаровск
Зарегистрирован: 12.11.2007
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 раз(а)
    Добавлено: 05:37 02-03-2018   
Minx
 872 EGP


Модератор
Рейтинг канала: 6(320)
Репутация: 139
Сообщения: 10406
Откуда: Gomel, Belarus
Зарегистрирован: 19.11.2005
Jerry Rezet :
Minx :
Оптимизация начинается с
До оптимизации там ещё три парсека на маневровых. Пока чтобы хотя бы работало приемлемо. Задница

Если у тебя не работает приемлемо по скорости, и ты пытаешься решить это, то это и есть оптимизация (по скорости).

Если ты не знаешь что тормозит, то попытки решения представляют собой танцы с бубном.
_________________
μηδείς αγεωμέτρητος εισίτω
    Добавлено: 09:30 02-03-2018   
БулерМэн
 390 EGP


Рейтинг канала: 2(21)
Репутация: 64
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
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 раз(а)
    Добавлено: 16:44 02-03-2018   
Jurec
 443 EGP


Ведущий раздела
Рейтинг канала: 4(70)
Репутация: 106
Сообщения: 1439
Откуда: Seattle
Зарегистрирован: 25.02.2006
>можно объединить в один цикл, если я не ошибаюсь.
зачем? это будет одинаково по скорости и страшно выглядеть в коде

количество итераций будет одинаково, то есть O(n^2) что так что так
_________________
MOV topka, C++
    Добавлено: 17:02 02-03-2018   
Shirson
 1594 EGP


Модератор
Рейтинг канала: 7(626)
Репутация: 215
Сообщения: 16511
Откуда: 79°W 44°N
Зарегистрирован: 29.01.2002
БулерМэн :
Потому что в отличии от вас, Ширсон, я с питоном знаком, а вы нет.

Т.е. ты хочешь сказать, что в Питоне, вложенные циклы работают медленее, чем равный им по вычислительной сложности не вложеный? Что, вот правда?
_________________
У меня бисера не доxеpа.

Последний раз редактировалось: Shirson (19:35 02-03-2018), всего редактировалось 1 раз
    Добавлено: 19:35 02-03-2018   
БулерМэн
 390 EGP


Рейтинг канала: 2(21)
Репутация: 64
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
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 раз(а)
    Добавлено: 21:06 02-03-2018   
Shirson
 1594 EGP


Модератор
Рейтинг канала: 7(626)
Репутация: 215
Сообщения: 16511
Откуда: 79°W 44°N
Зарегистрирован: 29.01.2002
БулерМэн :

Вы меня видимо не правильно поняли, либо я криво объяснил.
Так виноваты вложенные циклы или что, что они крутят? Улыбка
Да, я нуджный и придирчивый. Но ведь истина, однако, важнее Улыбка
_________________
У меня бисера не доxеpа.
    Добавлено: 04:40 03-03-2018   
Sh.Tac.
 145 EGP


Рейтинг канала: 5(108)
Репутация: 14
Сообщения: 1425

Зарегистрирован: 27.07.2005
Jurec :
количество итераций будет одинаково, то есть O(n^2) что так что так
а чего ты не посоветовал один раз загнать всё на GPU и там менять? всяко лучше, чем гонять по шине каждый кадр Улыбка
_________________
This is what you get ...
(c) Radiohead
    Добавлено: 15:23 03-03-2018   
Jurec
 443 EGP


Ведущий раздела
Рейтинг канала: 4(70)
Репутация: 106
Сообщения: 1439
Откуда: Seattle
Зарегистрирован: 25.02.2006
>В моем приведенном фрагменте - один раз.
>В таком случае, при обработке на ходу - время выполнения возможно сократиться в два раза.

а) Так ты можешь подготовить данные в одном месте один раз, а вызвать в другом - каждый кадр
б) Даже если это в одном кадре - количество операций не меняется, откуда 2 раза то?
в) Вообще говоря cache-miss'ов в цикле где ты делаешь всё, будет больше, и я ставлю что твой вариант будет медленнее из-за этого.

Sh.Tac. :
а чего ты не посоветовал один раз загнать всё на GPU и там менять? всяко лучше, чем гонять по шине каждый кадр

Та я на такой уровень даже не поднимался и код не читал особо. Тут на базовых вещах проблемы.
_________________
MOV topka, C++
    Добавлено: 12:42 05-03-2018   
Jerry Rezet
 570 EGP


Рейтинг канала: 5(113)
Репутация: 86
Сообщения: 3363
Откуда: Санкт-Петербург.
Зарегистрирован: 01.04.2005
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 раз(а)
    Добавлено: 15:10 08-03-2018   
БулерМэн
 390 EGP


Рейтинг канала: 2(21)
Репутация: 64
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
Jurec :
а) Так ты можешь подготовить данные в одном месте один раз, а вызвать в другом - каждый кадр

"Шум Перлина", который в даннм примере нифига не шум, предполагается наверное создавать на каждом шаге заново, или я не понял задачу?
Если на каждом шаге нужен пересчет данных - то лучше, на мой взгляд, считать на ходу вместе с циклом отрисовки. Никакой разницы между отрисовкой готового массива данных и отрисовки в процессе обработки этих данных нет - геометрия в течении шага не меняется, если данные в массиве являются "слепком" некой конечной геометрии, а не отражают какой-то динамический процесс, требующий пересчета соседних ячеек массива.
Jurec :
б) Даже если это в одном кадре - количество операций не меняется, откуда 2 раза то?

Как это не меняется? У тебя есть два цикла, у каждого цикла обрабатывающего одинаковое число данных в массиве есть определенное время выполнения. Если вызвать один и тот же цикл два раза подряд - на это уйдет 2*T. Другой вопрос, что это незначительное время, но для "тяжелых" операций время будет значительным.
Jurec :
в) Вообще говоря cache-miss'ов в цикле где ты делаешь всё, будет больше, и я ставлю что твой вариант будет медленнее из-за этого.

Если идет речь о cache-miss в таком ключе и есть сомнения в том, что доступ к таким новосозданным данным будет замедленнен из-за разбросанности данных в ОЗУ - то у меня плохие новости - питон гораздо медленнее работает чем ламповый Си. Так что тут скорее надо заботиться не о chache-miss, а вообще о тормозах кода.

Jerry Rezet :
когда освою MinGW

А разве ничего кроме MinGW не существует в нашем космическом вакууме? Улыбка
_________________
Дулички и фигушки
    Добавлено: 19:18 08-03-2018   
Sh.Tac.
 145 EGP


Рейтинг канала: 5(108)
Репутация: 14
Сообщения: 1425

Зарегистрирован: 27.07.2005
БулерМэн :
разве ничего кроме 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 раз
    Добавлено: 23:29 08-03-2018   
Jerry Rezet
 570 EGP


Рейтинг канала: 5(113)
Репутация: 86
Сообщения: 3363
Откуда: Санкт-Петербург.
Зарегистрирован: 01.04.2005
БулерМэн :
А разве ничего кроме MinGW не существует в нашем космическом вакууме?
"В нашем космическом вакууме" наобормот, существует слишком много всего. LCC, например.. Да и вообще много слишком всего - мне бы хотя бы что-нибудь чтобы освоить.. Но я - ленивая Задница опа, да. Осваивать майкрософтовские поделия чтобы пейсать чисто для винды не хочется - как-то греет душу "сама возможность писать кроссплатформенно" (что, может быть, ни разу и не реализуется, но сама мысль таки греет ЧСВ Ой, не могу!.. )
БулерМэн :
"Шум Перлина", который в даннм примере нифига не шум, предполагается наверное создавать на каждом шаге заново, или я не понял задачу?
нет, предполагается допилить эту функцию до "нормального шума Перлина", а пока это просто "заглушка" с линейно сглаженным шумом по окресностям.
_________________
- Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c]
    Добавлено: 01:03 09-03-2018   
Zachesa
 115 EGP

Рейтинг канала: 4(95)
Репутация: 13
Сообщения: 1402
Откуда: Хабаровск
Зарегистрирован: 12.11.2007
Jerry Rezet :
О! За этими кусками стоит долгая история попыток "сделать всё кузяво", которые раньше использовались, а потом выпиливались. И от них оставалось вот это, которое пока не мешает, но ничего не делает.. Это просто пример того, насколько я туп в питоне и ЯП вообще.
Может не стоит оно того? Вон как БулерМэн освой ГеймМаркет, или как я посмотри Блупринты в Анриале, от них легко перейти к плюсам потом.
_________________
Язык Образов, для ситуационного моделирования, программирования и как язык мысли, думающей машины.
    Добавлено: 06:25 09-03-2018   
Jerry Rezet
 570 EGP


Рейтинг канала: 5(113)
Репутация: 86
Сообщения: 3363
Откуда: Санкт-Петербург.
Зарегистрирован: 01.04.2005
Zachesa :
Может не стоит оно того?
У меня не МегаПуперГиперИГРИЩЩА, а просто пробую освоить азы игростроительства. Хочу сделать "бесконечную" карту, а там посмотрим, что из этого получится. Собственно цель всех этих метаний - научиться чему-нибудь хорошему. Возможно и советуемое освою, но позже.
_________________
- Вы не представляете, как вам повезло, что я здесь. Вы об этом еще пожалеете. [c]
    Добавлено: 15:54 09-03-2018   
Minx
 872 EGP


Модератор
Рейтинг канала: 6(320)
Репутация: 139
Сообщения: 10406
Откуда: Gomel, Belarus
Зарегистрирован: 19.11.2005
Jerry Rezet :
пробую освоить азы игростроительства. Хочу сделать "бесконечную" карту, а там посмотрим, что из этого получится

Только не следует путать игростроительство и картостоительство.
_________________
μηδείς αγεωμέτρητος εισίτω

Последний раз редактировалось: Minx (20:05 09-03-2018), всего редактировалось 1 раз
    Добавлено: 19:58 09-03-2018   
Jurec
 443 EGP


Ведущий раздела
Рейтинг канала: 4(70)
Репутация: 106
Сообщения: 1439
Откуда: Seattle
Зарегистрирован: 25.02.2006
БулерМэн :
Как это не меняется? У тебя есть два цикла, у каждого цикла обрабатывающего одинаковое число данных в массиве есть определенное время выполнения. Если вызвать один и тот же цикл два раза подряд - на это уйдет 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++
    Добавлено: 22:20 09-03-2018   
БулерМэн
 390 EGP


Рейтинг канала: 2(21)
Репутация: 64
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
Jurec :
Но это я захожу сильно далеко, потому что твоя позиция неверная что с точки зрения сложности алгоритма, что с точки зрения железа.

Хорошо, ты меня хочешь убедить что я не прав. Давай проведем эксперимент, возьмем один и тот же код и выполним его на одном и том же железе? Где будет быстрее, с одним вложенным циклом, или с двумя вложенными.
Предлагаю код на Си и на Питон (чуть позже)
_________________
Дулички и фигушки

Последний раз редактировалось: БулерМэн (21:58 12-03-2018), всего редактировалось 2 раз(а)
    Добавлено: 21:56 12-03-2018   
БулерМэн
 390 EGP


Рейтинг канала: 2(21)
Репутация: 64
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
Чтобы было понятно, что я на это потратил не пять минут, приведу результаты измерений ниже.

Примеры на двух языках, выполненные максимально похоже.
Количество итераций выбрано разным для разных языков, но при этом в сопоставимом временном диапазоне выполнения.

 Раздельные циклы, Си   (кликните здесь для просмотра)

Код:

#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();






Результаты:



Си:
Номер теста Раздельные циклы Си,сек Объединенный цикл Си,сек
13433
23333
33434
43333
53334
Python 2.7:
Номер теста Раздельные циклы Python 2.7,сек Объединенный цикл Python 2.7,сек
130.4329.5
229.9529.25
330.1729.078
429.8429.54
530.2329.71
629.9829.09
среднее:30.129.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 раз(а)
    Добавлено: 01:01 13-03-2018   
Канал Игры Мечты: «Техническая помощь в реализации самописных игр»
На страницу: Пред.  1, 2, 3 ... 12, 13, 14, 15  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Не нарушайте хотя бы половину правил... (Tension MAN просит флудеров в канале Х3)

  » Техническая помощь в реализации самописных игр | страница 13
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18