Это дополнительный вопрос к этим вопросам:
Я хотел бы в интерактивном режиме увидеть выходные данные пространственного дискретногомоделирование клеточных автоматов в 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