平滑的PostScript动画

fal*_*lse 6 x11 animation postscript ghostscript double-buffering

我想顺利地在PostScript中运行动画.为了看看我想要什么,让我直接切换到PostScript.调用ghostscript,和

200 dup scale .5 setgray 0 0 3 3 rectfill
Run Code Online (Sandbox Code Playgroud)

我们现在有一个灰色方块.

0 setgray 0 1 3 1 rectfill
Run Code Online (Sandbox Code Playgroud)

带有黑色条纹.我们现在将填充该条纹,连续一次白色和黑色:

{1 setgray 0 1 3 1 rectfill 0 setgray 0 1 3 1 rectfill} loop
Run Code Online (Sandbox Code Playgroud)

您现在将看到一些小于原始黑色条纹的黑色和白色矩形的闪烁.理想情况下,我们会看到原始的灰色方块.或差不多.我今天在哪里可以获得这样的功能?

要查看更有趣的动画序列,搜索大小为5的魔术方块:

wget http://www.complang.tuwien.ac.at/ulrich/gupu/l5.eps.gz
zcat l5.eps.gz | ghostscript -
Run Code Online (Sandbox Code Playgroud)

几年前,我确实试图解决这些问题.但它从未进入过ghostscript或Xfree.看到 这个页面.也许现在有更好的想法?

编辑:到目前为止阅读回复后,让我在这里澄清一个问题.从本质上讲,这个问题有两个独立的问题:

  • 如何从语言层面查看动画?我相信,最好的方法是将每个帧视为一个页面.通过copypage低成本可以实现增量更改.可悲的是,这种语义copypage只出现在1级和2级.在3级,意思copypage改变为showpage.我做了 - 很多年前 - 对ghostscript做了一点修改,将所有可见的变化延迟到copypageshowpage.以这种方式,在服务器(即,显示器)上本地XCopyArea执行包含改变区域的单个.

  • 如何同步视觉显示器上的实际变化以避免所描述的图形中不存在的假象?您看到的不规则闪烁不是PostScript的特权,它似乎存在于我迄今为止看到的任何双缓冲系统中.试着用你认为合适的系统编程.

进一步编辑:

要获得正确的语言级别,即1级或2级(对于ghostscript):

systemdict /.setlanguagelevel known {2 .setlanguagelevel} if
Run Code Online (Sandbox Code Playgroud)

编辑:我添加此评论可能会吸引一些新的贡献者.

lus*_*oog 4

我们在comp.lang.postscript 的这个线程中探讨了其中一些问题。

自 Level 2 标准发布以来,Postscript 就是一种垃圾收集语言。您可以使用fragment 禁用用户对象的收集-2 vmreclaim,但它并没有多大作用。您可以通过使用选项调用来禁用所有-dNOGCGhostscript 垃圾收集。这应该有助于防止图像的某些部分出现停顿和溢出。

Ghostscript 有一个名为flushpage 的非标准运算符,它使渲染与执行同步。这有助于确保所有内容在消失之前都能被看到。

- flushpage -
On displays, flushes any buffered output, so that it is guaranteed to
show up on the screen; on printers, has no effect
Run Code Online (Sandbox Code Playgroud)

而对于时序控制,似乎没有比简单的忙等待更好的方法了。


/smallpause {
    /flushpage where{pop flushpage}if
    50 sleep } def
/pagepause {
    /flushpage where{pop flushpage}if
    1000 sleep } def

/sleep {
    usertime add {
        10 {
            1 100000 div pop %busy
            .1 sin 257 cos atan pop %busy busy
        } repeat
        dup usertime le {exit}if
    } loop pop
} def 
Run Code Online (Sandbox Code Playgroud)

围绕flushpage的守卫where允许您将相同的代码发送到除ghostscript之外的解释器(如打印机)。

如果您有实际的 Display Postscript 服务器,则可以使用wait操作员而不是忙等待。