我正在尝试使用球拍“2htdp / image”翻转图像列表。
以下是不起作用的最小示例:
#lang racket
(require 2htdp/image)
(define images
(list
(bitmap "../data/player/player1.png")
(bitmap "../data/player/player2.png")
(bitmap "../data/player/player3.png")))
(define flipped (map flip-horizontal images))
在我看来(由于图像在DrRacket中绘制的速度),“翻转”列表的内容被懒惰地评估。只有在我尝试访问图像时才会计算其翻转版本。一旦我将这个球拍文件导入到宇宙中(使用“2htdp / universe”),这就成了一个问题,因为我在使用翻转的图像时性能很差。
我看了implementation的“翻转水平”,我看不出任何明显的原因。我还没有考虑“make-translate”和“make-image”的实现。
我无法强制使用force评估图像,调试器显示object:image作为列表内容。我不确定究竟发生了什么以及如何防止这个问题,并在启动时实际计算所有图像。
为什么会发生这种情况和/或如何正确修复它?感谢。
批准的答案是我的问题的解决方案,所以我最后只是将最后一行更改为:
(define flipped (map (compose freeze flip-horizontal) images))
答案 0 :(得分:2)
你是对的,在显示图像内容时才会实际计算图像内容。如果您需要提前计算,可以使用freeze
将图像转换为位图。
在您的示例中,尝试将flipped
的定义更改为以下内容:
(define flipped (map (compose1 freeze flip-horizontal) images))