Я использую вершинный буферный объект (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. В коде 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 ()
?
Сохранение вывода dbConnect ()
в файл не работает, поскольку истекло время ожидания соединения. Однако исходный
файл .R
из каталога пользователя, содержащий
library(RMySQL)
con <- dbConnect(MySQL(), dbname = "mydb", user = "myuser", pass = "mypass")
, работает.
Однако я не знаю, насколько безопасен этот подход.