- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
开发 iPad PDF 阅读器时,我们决定准备渲染密集型页面(其中有很多路径)的高分辨率图像,并使用这些图像代替 pdf 页面以避免性能问题。我们认为 3*768 x 3*1024
是可读性和渲染性能之间的一个很好的折衷,这导致 ~1.5 MB jpeg。
但是,我们测试了显示图像页面的两种实现方式。一个使用 CATiledLayer
子类,该子类还负责处理“普通”PDF 页面(使用 CGContextDrawImage
绘制),另一个使用 UIImageView
。后者的优点是显示和缩放非常快,但内存使用率非常差 - 大约需要 30 MB 内存(这与图像的位图大小一致)。另一种方法 (CATiledLayer
) 需要更多时间来首次显示页面,并且在缩放后需要另外两秒钟重新呈现(类似于 pdf 页面,但速度快得多)但不会占用更多内存它需要显示小得多的图像或 PDF 页面。
有谁知道幕后发生了什么,以及是否可以通过使用 Quartz 框架将 CGContextDrawImage
的低内存使用率与 UIImageView
的高性能结合起来。
最佳答案
不确定这个问题是否仍然相关,但如果是这样,也许这会有所帮助:
我在我的 tiled image view 中打过一场有效显示大 View 的战斗。以及。这个问题有很多潜在的部分:
UIView
,包括 UIImageView
,似乎总是完全由内存支持其图像。即使您实现了 drawRect:
方法,它似乎也总是通过 View 的整个边界,而不仅仅是 ScrollView 中的可见区域。正如您所发现的,这会很快占用很多内存,因为每个像素需要 4 个字节。CATiledLayer
确实仅请求可见图 block 的内容。它还会丢弃不再可见的图 block ——这就是内存节省的来源。但是,它在后台线程上执行通知和绘图,同时从白色到内容进行动画处理。它似乎是通过私有(private) API 来实现的,我还没有找到一种方法来将 CATiledLayer
的功能重新实现为我自己的 CALayer
子类,因为看起来很简单不是我们可以作为凡人使用的通知机制。drawRect:
消息。不过,UIKit 似乎难以处理一个 View 下的太多 subview 。对于您来说,我可以看到几个可能的选择:
CATiledLayer
的实现。 fadeDuration
默认为 0.25 秒,如果您的加载时间很短,这可能会太长。您可以将其降低到 1.0/60.0
之类的值,即一帧。从您的描述中不清楚的一件事是您的图像是覆盖整个页面大小还是仅覆盖每个 256x256 像素的图 block 。为每个图 block 一遍又一遍地解码整个 JPEG 比解码单个图 block 文件要慢得多。CATiledLayer
线程执行所有操作的延迟太高,您可以手动创建一堆图 block 作为 UIImageView
subview 到空白 UIView
这是 ScrollView 的主要 subview 。这些 subview 中的每一个都分配有自己的平铺图像。如果幸运的话,UIKit 会足够聪明,可以删除这些 View 的内容并根据需要重新加载相应的 JPEG。drawRect:
中加载它们的 JPEG。如果它仍然太不稳定,请尝试使用您自己的 CALayers,这将是您的单个 View 空白层的子层,并再次按需加载它们的图像。这就是我最终使用的平铺 ImageView 。这应该包括滚动,但如果您允许用户直接缩小(最小化),它仍然可能非常慢。在这种情况下,我建议您存储适当的低分辨率版本,并以最外层的缩放级别加载/显示这些版本。
关于ios - 与 CGContextDrawImage 相比,为什么 UIImageView 如此占用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955458/
我一直在尝试实现这一点,但找不到任何可以在删除它们时像 iPhone 应用程序抖动一样抖动它的代码! CABasicAnimation *animation =
我有一个代码在 UIImageView.isAnimating 为 false 之后执行一些操作 但有趣的是它永远不会出错,它总是处于 YES 状态。 "isAnimating return is f
我的 UIViewController 中有一个 UIImageView。我在上面设置了一个图像。我做了如下旋转。 - (void) runSpinAnimationOnView:(UIImageVi
我有一个带有图像的 UIImageView。我在显示之前旋转了图像,方法是将 UIImageView 的变换属性设置为 CGAffineTransformMakeRotation(angle),其中角
如果有解决我的问题的答案,请给我一个链接。否则这是我的问题: 我目前正在运行 Swift 2.0 (Xcode 7) Sprite Kit Game,想知道 UIImageView 是否可以跟随另一个
我不知道我的想法是否正确,但我的问题是我在 UITableView 中有自定义单元格(看起来像汽车),每个单元格包含 2 个 UIImageViews(车轮图像),我需要旋转当 UITableView
我想知道是否有办法使用透明的 UIImageView(框 C)来剪辑移动到其上方的某些图像。 在我的示例中,我将均为 UIImageView 的框 A 和 B 移向透明的框 C。一旦盒子发生碰撞,我只
我有一个带有固定图像的 UIImageView。我想在顶部添加第二个 UIImageView,我打算旋转它。我需要在运行时创建顶部图像。我找不到在哪里处理透明度。它在 UIImage 中还是在 UII
我有一个要求,我有一个 UIImageView 在另一个之上。当用户在其上“绘制”时,我需要使顶部透明。实际上,不是绘制用户将要做的事情,而是“删除”顶 View ,让下面的 View 显示出来。 我
您好,我有一个 UIImageView,它部分在屏幕上,部分在屏幕外。 我想围绕屏幕外的一个点( View 的中心)旋转 View 。 我该怎么做? fullRotationAnimation
我有两张图片。一个图像是矩形第二个是三角形我想使用一根手指或触摸事件从矩形图像的中心点旋转三角形图像。 最佳答案 好吧,如果您希望图像围绕矩形中心点以任意大小的圆旋转,那么数学会变得相当复杂,但是一个
我想知道是否可以将更多的 UIImageView 分组到一个 ImageView 中。例如,如果我有 4 个 imageView,并且我想以完全相同的方式为它们制作动画,我可以将它们组合成一个,然后为
我正在代码中创建多个 UIImageView,并且想要移动和删除我选择的任何 UIImageView。现在,我只能移动使用 UIPanGestureRecognizer 创建的最后一个 UIImage
现在,我已经让它能够在我的应用程序上移动图像、缩放图像、捏合图像……应有尽有。但我的问题是,当一个 UIImageView 位于另一个 UIImageView 时,我如何才能让应用程序注册? 最佳答案
我有一个 UIImageView 应该从 size (0,0) --> (93,75) 开始动画 我有以下内容 [UIView animateWithDuration:0.5 delay:0 op
我这里的问题应该是一个相当简单的问题。基本上,我试图将一个对象 (UIImageView) 从 A 点(它在 Storyboard中设置的位置)移动到我以编程方式定义的 B 点。 我第一次通过这个导致
我有一个带有包含图像的单元格的 UITableView。我想从服务器下载一个大图像并将其插入到我的单元格中。 我的 UITableViewCell 有一个固定的高度并且填满了屏幕的整个宽度。最好的解决
当用户选择新的图像过滤器时,我尝试对图像进行交叉淡入淡出。 所以我在第一个ImageView之上创建了第二个ImageView,并对顶部 View 的alpha进行动画处理以显示或隐藏底部 View
我有一个 UIScrollView,其中包含 n 个占位符 UIImageView。下面我有一个 StackView,其中包含 10 个图像,用户可以从中选择并将图像拖动到上面的特定占位符 Image
尝试设置“选定框”图形的边界的多种组合,该图形仅显示用户在 UIImageView 中触摸的位置。它仍然继续坚持 super View 坐标系 class ViewController: UIView
我是一名优秀的程序员,十分优秀!