Я думаю, что если вы хотите сопоставление по лицу, то вам, возможно, придется дублировать вершины. В основном уникальная вершина + нормальный + ультрафиолетовый комбо для всего. В противном случае вам понадобится несколько индексных буферов, один для вершин, один для нормалей, один для uvs. Я склонен не слишком беспокоиться о количестве вершинных данных. Что действительно влияет на производительность, так это вызовы отрисовки. Большинство графических процессоров могут обрабатывать> 1 м вершин в кадре, но максимально в 300 - 1000 вызовов отрисовки. Я упрощаю, но это приблизительная оценка.
Редактировать:
Похоже, я неправильно понял вопрос. Ответ прост:
handler1 () { do_something; }
handler2 () { do_something_else; }
handler3 () { handler1; handler2; }
trap handler3 SIGNAL1 SIGNAL2 ...
Оригинал:
Просто перечислите несколько сигналов в конце команды:
trap function-name SIGNAL1 SIGNAL2 SIGNAL3 ...
Вы можете найти функцию, связанную с конкретным сигналом, используя trap -p
:
trap -p SIGINT
Обратите внимание, что он перечисляет каждый сигнал отдельно, даже если они обрабатываются одной и той же функцией.
Вы можете добавить дополнительный сигнал к известному, выполнив следующие действия:
eval "$(trap -p SIGUSR1) SIGUSR2"
Это работает, даже если есть другие дополнительные сигналы, обрабатываемые той же функцией. Другими словами, предположим, что функция уже обрабатывает три сигнала - вы можете добавить еще два, просто сославшись на один существующий и добавив еще два (где только один показан выше внутри закрывающих кавычек).
Если вы используете Bash> = 3.2, вы можете сделать что-то вроде этого, чтобы извлечь функцию по сигналу. Обратите внимание, что это не совсем надежно, потому что могут появиться другие одинарные кавычки.
[[ $(trap -p SIGUSR1) =~ trap\ --\ \'([^\047]*)\'.* ]]
function_name=${BASH_REMATCH[1]}
Затем вы можете перестроить свою команду прерывания с нуля, если вам нужно использовать имя функции и т. Д.
trap 'handler1;handler2;handler3' EXIT
trap "$( trap -p EXIT | cut -f2 -d \' );newHandler" EXIT
handlers="$( trap -p EXIT | cut -f2 -d \' )"
trap "${handlers}${handlers:+;}newHandler" EXIT
trap-add() {
local sig="${2:?Signal required}"
hdls="$( trap -p ${sig} | cut -f2 -d \' )";
trap "${hdls}${hdls:+;}${1:?Handler required}" "${sig}"
}
export -f trap-add
Использование:
trap-add 'echo "Bye bye"' EXIT
trap-add 'echo "See you next time"' EXIT
Комментарий : Это работает, только имеет долго, поскольку обработчики являются именами функций, или простые инструкции, которые не сделали, содержат любой простой cote (простые конфликты Коутса с cut -f2 -d \'
).
Лучшее, что вы могли бы сделать, это запустить несколько команд из одной ловушки
для данного сигнала, но вы не можете иметь несколько одновременных ловушек для одного сигнала . Например:
$ trap "rm -f /tmp/xyz; exit 1" 2
$ trap
trap -- 'rm -f /tmp/xyz; exit 1' INT
$ trap 2
$ trap
$
Первая строка устанавливает ловушку на сигнал 2 (SIGINT). Вторая строка печатает текущие ловушки - вам нужно будет захватить стандартный вывод из этого и проанализировать его для нужного вам сигнала. Затем вы можете добавить свой код к тому, что уже было, отметив, что предыдущий код, скорее всего, будет включать операцию «выхода». Третий вызов ловушки очищает ловушку на 2 / INT. Последний показывает, что выдающихся ловушек нет.
Вы также можете использовать trap -p INT
или trap -p 2
, чтобы распечатать ловушку для определенного сигнала.