OpenGL ES 2.0: наиболее эффективная настройка для VBO с GL_STREAM_DRAW?

Я использую вершинный буферный объект (VBO) в OpenGL ES 2.0.

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

Фактическое количество вычерчиваемых вершин быстро изменяется с течением времени. В одном кадре я могу иметь 1000 и в следующем 2500. Следуя совету, полученному здесь ранее, я теперь указываю целое число UPPER как верхнюю границу числа вершин, которые когда-либо будут нарисованы. Я malloc мои массивы данных вершин и индексов только один раз при запуске на основе этого значения.

Я передаю подсказку использования GL _ STREAM _ DRAW каждому вызову glBindBuffer , чтобы указать, что данные изменяют каждый кадр.

Пытаясь быть максимально эффективным, я создал следующую установку:

// SETUP: Called only once.
glBindBuffer(GL_ARRAY_BUFFER,...);
glBufferData(GL_ARRAY_BUFFER,...); // Pass vertex data for UPPER vertices.
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,...); // Pass index values 0 - (UPPER-1).
glEnableVertexAttribArray(...); // Setup vertex attributes.
glVertexAttribPointer(...);
glUseProgram(...); // Use program with custom shaders.
glUniformMatrix4fv(...); // Identify shader uniforms.

// UPDATE: Called when vertex data changes (on each frame).
glBindBuffer(GL_ARRAY_BUFFER,...);
glBufferSubData(GL_ARRAY_BUFFER,...); // Update VBO data.

// RENDER: Called on each frame.
glDrawElements(GL_TRIANGLES, numberOfVerticesThisFrame, ...); // Number of vertices and indices to be used is inherently specified in here.

Однако это происходит с помощью EXC _ BAD _ ACCESS на glDrawElements , и я знаю, что это связано с упорядочением команд gl .

У меня была похожая настройка, которая работала ранее:

// UPDATE: Called when vertex data changes (on each frame).
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,...); // Pass index values 0 - (actual number of vertices to draw - 1)

// RENDER: Called on each frame.
glBindBuffer(GL_ARRAY_BUFFER,...);
glBufferData(GL_ARRAY_BUFFER,...); // Pass vertex data for actual number of vertices (not UPPER).
glEnableVertexAttribArray(...); // Setup vertex attributes.
glVertexAttribPointer(...);
glUseProgram(...); // Use program with custom shaders.
glUniformMatrix4fv(...); // Identify shader uniforms.
glDrawElements(GL_TRIANGLES, numberOfVerticesThisFrame, ...);

Однако эта настройка требует гораздо больше работы на кадр, и, как вы видите, включает изменение размеров VBO (поскольку в ней используется фактический размер, а не UPPER ), что, как мне сказали, является большой утечкой производительности.

Не могли бы кто-нибудь объяснить мне какие-либо очевидные проблемы с моей новой настройкой, и самое главное, какие команды я должен вызывать каждый кадр перед glDrawElements ? Мое предположение, что я могу подготовить все возможные индексы заранее, а затем передать фактическое число вершин в glDrawElements , явно неверно.

-121--1607865-

Как разрешить rapache/brew безопасное подключение к базе данных MySQL? Я разрабатываю веб-приложение с использованием rapache и brew. В коде R я хочу использовать пакет RMySQL для запроса базы данных MySQL, но я ставлю под сомнение лучший способ доступа к данным входа в систему...

Я разрабатываю веб-приложение, используя rapache и brew. В коде R я хочу использовать пакет RMySQL для запроса базы данных MySQL, но я ставлю под сомнение наилучший способ доступа к данным входа в базу данных из скрипта R.

Следуя некоторым предложениям относительно подобной проблемы с PHP , одна мысль заключалась в том, чтобы сделать следующее в интерактивном сеансе, чтобы сохранить детали подключения в файл за пределами /var/www :

con <- dbConnect(MySQL(), dbname = "mydb", user = "myuser", pass = "mypass")
save(con, file = "/home/myuser/sqlconnect.rda")

А затем в сценарии, запущенном rapache/brew, загрузить файл .rda :

<%
load("/home/myuser/sqlconnect.rda")
query <- "MY QUERY"
result <- dbGetQuery(con, query)
%>

Я еще не пробовал этот подход. Я даже не уверен, что мой sqlconnect.Файл rda будет содержать всю информацию, необходимую для подключения.

Существует ли более безопасный способ настройки инструкции dbConnect () ?

Update

Сохранение вывода dbConnect () в файл не работает, поскольку истекло время ожидания соединения. Однако исходный файл .R из каталога пользователя, содержащий

library(RMySQL)
con <- dbConnect(MySQL(), dbname = "mydb", user = "myuser", pass = "mypass")

, работает.

Однако я не знаю, насколько безопасен этот подход.

7
задан Community 23 May 2017 в 12:21
поделиться