- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
以高帧率将图像渲染和缩放到表面的最快方法是什么?
我正在使用 drawRect 以大约 30FPS 的速度绘制(缩放)NSBitmapImageRep,但它使用了大量的 CPU。
将 NSBitmapImageRep 中的像素设置为 30FPS 的示例代码:
NSInteger x, y;
unsigned char *imgptr = nsBitmapImageRepObj.bitmapData;
unsigned char *ptr;
NSInteger rowBytes = nsBitmapImageRepObj.bytesPerRow;
for (y = 0; y < nsInputFrameRect.size.height; y++) {
ptr = imgptr + (y * rowBytes);
for (x = 0; x < nsInputFrameRect.size.width; x++) {
*ptr++ = 1; // R
*ptr++ = 2; // G
*ptr++ = 3; // B
}
}
[self setNeedsDisplay:YES];
平局发生在 30FPS:
- (void)drawRect:(NSRect)pRect {
[NSGraphicsContext saveGraphicsState];
[nsBitmapImageRepObj drawInRect:pRect];
[NSGraphicsContext restoreGraphicsState];
} // end drawRect
NSBitmapImageRep 上的 drawInRect 使用大量 CPU。以高帧率缩放和绘制图像的最快方法是什么?源图像应该是我可以直接设置像素的图像,例如通过获取位图数据指针。
如果我将 NSBitmapImageRep 转换为 CIImage 并使用 [ciImage drawInRect] 进行绘制,那么速度会提高大约 10%。如果我绘制到 NSOpenGLView 而不是 NSView,它又快了大约 10%,但 scale/drawInRect 仍然占用了大量 CPU 时间。
最佳答案
首先,您应该删除 NSGraphicsContext
的保存和恢复,因为 -[NSImageRep drawInRect:]
方法本身会执行此操作。请参阅“Cocoa 绘图图形上下文”:
Important: Saving and restoring the current graphics state is a relatively expensive operation that should done as little as possible.
下一点是像素数据的结构:每个样本 8 位,每个像素 3 个样本,这意味着每个像素 24 位。这对硬件(GPU?)非常不友好,因为 32 位值比 24 位值处理起来更快。有一种简单的方法可以使像素处理更好(更快):使用 4 个字节而不是 3 个字节:为每个像素添加一个填充字节,这不会损害图像!这个填充字节不是图像的一部分,而只是像素存储的一部分,不用于任何绘图操作。它只是为了使像素操作更快。所以在你的 NSBitImageRep
的描述中使用它:
bitsPerSample:8
samplesPerPixel:3
hasAlpha:NO
isPlanar:NO // must be meshed
bytesPerRow:0 // let the system do it
bitsPerPixel:32 // <-- important !!
因此您的代码必须修改:
*ptr++ = 3; // B
*ptr++ = 123; // new!! value is unimportant
顺便说一句:如果您将 jpeg 图像读入 NSBitmapImageRep
,那么这些 imageReps 总是有 3 个字节的像素加上一个填充字节。为什么会浪费存储空间?这样做有充分的理由!
关于objective-c - 快速替代 drawInRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24442017/
我正在开发我的应用程序的新版本并尝试替换已弃用的消息,但我无法通过这个。 我不明白为什么 drawInRect:withAttributes 不工作。代码在 drawInRect:withFont:l
我正在将 iphone 应用程序移植到 Mac 应用程序,我必须将所有 UIKit 相关类更改为 AppKit。如果您能在这方面帮助我,我将不胜感激。这是执行以下部分的最佳方法吗.. Iphone 应
我想“提取” UIImage 的一部分,但我遇到了一些麻烦。 例如,原始图像大小为 320x480,我想在 CGRect(10, 10, 100, 100) 这样的矩形中渲染一个新的 UIImage
现在我有以下内容: - (void)drawRect { // some drawing [bgImage drawinRect:self.bounds]; // some d
我正在尝试使用渐变填充来填充一些文本,其中我将文本绘制模式设置为剪切,然后绘制渐变填充。问题是,每当我将文本绘制模式设置为剪辑时,文本字符串的每个字符都会放置在彼此的顶部,而不是按顺序绘制以形成单词
我正在做的是将 2 个图像合并为单个图像。 这是代码。 UIGraphicsBeginImageContext(CGSizeMake(1024, 768)); [image1 drawInRect:C
我对正确使用 UIImage 和方法 drawInRect 有疑问。 我使用 iPad 4,Xcode 版本 6.1.1 , IOS 8.1.2我使用了 ARC,我尝试过不使用 ARC 所以,我有图像
我有以下代码在 UITableViewCell 中绘制文本,它可以很好地绘制和返回文本,但在 UITableViewCell 的中心。所以我给它正确对齐但没有工作!! UIColor * textCo
我正在更新一个旧应用程序,但我无法使 drawInRect 在 PDF 上下文中工作。 我将已弃用的函数 CGContextShowTextAtPoint 替换为 CGContextShowTextA
我正在尝试在上下文中绘制文本,它起作用了。 我正在尝试为该文本设置一个 UIfont,但它不起作用。文字大小保持不变。 这是我的代码 - (UIImage *)imageByDrawingCircle
我有一个应用程序[基于窗口],我需要在屏幕上“绘制”一些图像,[我正在遵循一个实现一些自定义图表绘图的示例项目,这样做,但它不使用 UIImage View ,只是UI图像) 我正在使用 - (voi
我创建了一个名为 MySegment 的新类,它继承自 UIControl。 首先,我使用 CAGradientLayer 初始化了一条渐变线。 第二,[self.layer addSublayer:
我创建了一个自定义的 UIView 类,以便可以显示 Map 对象的内容。经过大量研究,我仍然无法确定为什么下面的方法不绘制任何东西: - (void)drawRect:(CGRect)rect {
正在尝试修复 iOS 应用程序中的一些警告并更改了此更新: [[self text] drawInRect:rect withFont:[UIFont systemFontOfSize:kFontSi
我在背景中画了一些图像。有时我的应用程序会因奇怪的错误而崩溃: function signature specialization of MyApp. 我检查了所有崩溃,并且所有崩溃都发生在不使用上
我正在使用 drawInRect: 将文本绘制到 UIView。我从服务器端脚本获取要绘制的文本。至少在一种情况下,字符\U00a0 出现在我从服务器接收到的字符串中,并且该单个字符破坏了 drawI
我正在尝试缩小 2 倍图像,然后在矩形中绘制 UIImage,但不知何故这没有任何效果。即使 .scale 属性发生变化,图像看起来仍具有相同的比例。 这是我的drawRect()的实现 ove
以高帧率将图像渲染和缩放到表面的最快方法是什么? 我正在使用 drawRect 以大约 30FPS 的速度绘制(缩放)NSBitmapImageRep,但它使用了大量的 CPU。 将 NSBitmap
我正在学习 OpenGLES,我正在尝试将 GLKViewer 放入 UIViewController 中。 我知道我可以通过使用 GLViewController 来解决主要问题,但我正在努力学习如
我在这个网站上读过一些关于使用drawInRect而不是CGContext绘制方法的帖子。它仍然把它画得颠倒吗?我认为使用 drawInRect 会将其正面朝上打印,坐标系起始于左上角? -(void
我是一名优秀的程序员,十分优秀!