Как эффективно анимировать растры изображений, используя ускорение OpenGL в R? - PullRequest
0 голосов
/ 06 мая 2019

Это дополнительный вопрос к этим вопросам:

Я хотел бы в интерактивном режиме увидеть выходные данные пространственного дискретногомоделирование клеточных автоматов в 2D.Поэтому я начинаю с простого и пытаюсь понять, как быстро я могу рисовать матрицы целочисленных значений.Я пытаюсь здесь с пакетом rgl, который, насколько мне известно, является пакетом, обеспечивающим (теоретически) самое быстрое (?) Графическое устройство в R.

Я пробую этот подход с rgl, ночастота кадров составляет 30 кадров в секунду, что я считаю довольно низким (см. код ниже).Мой пример - рисование растровых изображений из R матриц, которые имеют размер только 100x100.Более того, у меня мерцает, я не знаю почему.

Вот мой подход (после ответа от @ ben-bolker) и теперь использую обратную связь от @ user2554330.

library(viridisLite)
library(rgl)

n_colours <- 100
n_row <- 500
n_col <- 500
vv <- viridis(n_colours)

setup <- function() {
  view3d(theta=0, phi=0)  ## head-on view
  #par3d(zoom=0.65, windowRect = c(0,0, n_col, n_row), viewport = c(0,0, n_col, n_row))
  par3d(zoom=0.65, windowRect = c(0,0, n_col, n_row), viewport = c(0,0, n_col, n_row))
}

# draw <- function(m) {
#   d <- dim(m)
#   surface3d(x = 1:d[1], y = 1:d[2], z = matrix(0, d[1], d[2]), 
#             color = vv[m],
#             smooth=FALSE, lit=FALSE  ## turn off smoothing/lights
#   )
# }

# draw2 <- function(m) {
#   par3d(skipRedraw = TRUE)  # but skip blank update
#   clear3d()
#   
#   d <- dim(m)
#   surface3d(x = 1:d[1], y = 1:d[2], z = matrix(0, d[1], d[2]), 
#             color = vv[m],
#             smooth=FALSE, lit=FALSE  ## turn off smoothing/lights
#   )
#   par3d(skipRedraw = FALSE) # Make sure image is shown
# }

draw3 <- function(colours) {
  par3d(skipRedraw = TRUE)  # but skip blank update
  clear3d()

  d <- dim(m)
  surface3d(x = 1:d[1], y = 1:d[2], z = matrix(0, d[1], d[2]), 
            color = colours,
            smooth=FALSE, lit=FALSE  ## turn off smoothing/lights
  )
  par3d(skipRedraw = FALSE) # Make sure image is shown
}

nframes <- 100

n_matrices <- list()
for(i in 1:nframes) {
  n_matrices[[i]] <- vv[matrix(sample(1:n_colours, n_row*n_col, replace = TRUE), nrow = n_row)]
}

setup()
# time <- system.time({
#   for (i in 1:nframes) {
#     draw(n_matrices[[i]])
#     par3d(skipRedraw = FALSE) # Make sure image is shown
#     
#     par3d(skipRedraw = TRUE)  # but skip blank update
#     pop3d()
#   }
#   par3d(skipRedraw = FALSE)
# })

time <- system.time({
  for (i in 1:nframes) {
    draw3(n_matrices[[i]])
  }
})


fps <- nframes/time[3]
fps

1 Ответ

1 голос
/ 08 мая 2019

Причина мерцания также замедляет отображение. Ваш pop3d() вызов просит rgl перерисовать изображение без отображаемой поверхности. Вы можете увеличить скорость примерно вдвое, сказав rgl, чтобы пропустить эту перерисовку:

time <- system.time({
  for (i in 1:nframes) {
    draw(n_matrices[[i]])
    par3d(skipRedraw = FALSE) # Make sure image is shown

    par3d(skipRedraw = TRUE)  # but skip blank update
    pop3d()
  }
  par3d(skipRedraw = FALSE)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...