LINUX.ORG.RU

почему vtk так затормозил?

 , , ,


1

3

Конкретно затормозил биндинг для tcl/tk. Я создаю 300 цилиндров. c++ и python всё это создают и прорисовывают быстро, скажем, за секунду. А tcl/tk - за минуту.

Все исходники тут:

https://bitbucket.org/budden/vtkad/src

Причём файл .py и .cxx там в единственном экземпляре, а в tcl/tk работа немного размазана по разным файлам. Но делается всё то же самое, это я проверил и перепроверил.

Собственно создание цилиндров - здесь https://bitbucket.org/budden/vtkad/src/50bdee609c8c54411f2b0a6e3a4d9198ad7c75...

Головной файл, откуда вызывается - здесь https://bitbucket.org/budden/vtkad/src/53a4039b7a4df914fbc85cc2f4ab178b0e1ebe...

★★★★★

В тикль-варианте при заполнении сцены объектами уже создано окно вывода, связано с рендерером и работает главный цикл. В питоньем - все наоборот, сцена, окно, главный цикл. В С++ - окно, сцена, цикл. Оно?

Ну, и пофлудить по обычаю...

string cat - это что? Мой тикль такого не умеет. Это ведь так пишется: "::world3d::Source$Name" ?

Зачем "::cty::CheckIdentifierOk $Name" с таким regexp? Ну, о "::" позаботился, и порядок.

«foreach {x y z} $Center {}» - начиная с 8.5 есть lassign.

fopen ★★
()
Ответ на: комментарий от fopen

Ну что, ты меня спас, мил человек! Убрал я puts при вставке каждого актора (а puts в моём случае вызвает update, т.к. это форк tkcon) и стало быстрее раз в 20. Не всё ещё ясно, но куда копать - понял.

string cat - это да, просто сложение строк, появилось в 8.6. Мне так привычнее, у меня мозг не заточен под tcl. Если б знал, что оно так недавно появилось, не стал бы применять.

Зачем "::cty::CheckIdentifierOk $Name" с таким regexp? Ну, о "::" позаботился, и порядок.

Это нужно точно понимать, как не попасть в кавычечный ад. А я пока далёк от этого.

«foreach {x y z} $Center {}» - начиная с 8.5 есть lassign.

Спасибо, буду знать!

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Вот в таком виде всё одинаково: 3000 цилиндров обе программы рисуют примерно 12 секунд. Т.е. тезис «tcl тормозит» не подтвердился.

https://bitbucket.org/budden/vtkad/src/default/ManyCylinders.tcl?at=default&a...

Другое дело, что я бы хотел использовать vtkTkRenderWidget, а вот с ним пока нет такой же ясности.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

eval - очень медленный и пользоваться им стоит в крайнем случае

# вместо
# eval [cylinderActor$i GetProperty] SetColor [expr {0.5+0.5*sin($i+2*$pi*1/3)}] [expr {0.5+0.5*sin($i+2*$pi*2/3)}] [expr {0.5+0.5*cos($i+2*$pi)}]
# лучше 
{*}[cylinderActor$i GetProperty] SetColor [expr {0.5+0.5*sin($i+2*$pi*1/3)}] [expr {0.5+0.5*sin($i+2*$pi*2/3)}] [expr {0.5+0.5*cos($i+2*$pi)}]

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Ладно, но дело явно не в этом. Не будет же 300 эвалов минуту выполняться на современном компе :)

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Окончательно решить вопрос помог RTFM. В примерах есть MaceTk.tcl. Сделал по его образу и подобию:

https://bitbucket.org/budden/vtkad/src/default/ManyCylindersRenWidget.tcl?at=...

Теперь tcl, python и С++ идут ноздря в ноздрю, причём tcl быстрее python-а процентов на 10-20. Хотя не стану утверждать, что код эквивалентен - он разный. В любом случае, теперь tcl рисует 3000 цилиндров за 10 секунд, а раньше 300 цилиндров рисовал за минуту.

den73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.