gpt4 book ai didi

objective-c - 在 NSView 中制作网格

转载 作者:太空狗 更新时间:2023-10-30 03:40:58 25 4
gpt4 key购买 nike

我目前有一个 NSView 绘制网格图案(本质上是水平线和垂直线的指南),其想法是用户可以更改网格的间距和网格的颜色.

网格的目的是在排列对象时为用户提供指导。除了一个异常(exception),一切正常。当我通过拖动调整大小 handle 调整 NSWindow 大小时,如果我的网格间距特别小(比如 10 像素)。拖动调整大小本质上变得昏昏欲睡。

我的网格drawRect代码如下:

-(void)drawRect:(NSRect)dirtyRect {

NSRect thisViewSize = [self bounds];

// Set the line color

[[NSColor colorWithDeviceRed:0
green:(255/255.0)
blue:(255/255.0)
alpha:1] set];

// Draw the vertical lines first

NSBezierPath * verticalLinePath = [NSBezierPath bezierPath];

int gridWidth = thisViewSize.size.width;
int gridHeight = thisViewSize.size.height;

int i;

while (i < gridWidth)
{
i = i + [self currentSpacing];

NSPoint startPoint = {i,0};
NSPoint endPoint = {i, gridHeight};

[verticalLinePath setLineWidth:1];
[verticalLinePath moveToPoint:startPoint];
[verticalLinePath lineToPoint:endPoint];
[verticalLinePath stroke];
}

// Draw the horizontal lines

NSBezierPath * horizontalLinePath = [NSBezierPath bezierPath];

i = 0;

while (i < gridHeight)
{
i = i + [self currentSpacing];

NSPoint startPoint = {0,i};
NSPoint endPoint = {gridWidth, i};

[horizontalLinePath setLineWidth:1];
[horizontalLinePath moveToPoint:startPoint];
[horizontalLinePath lineToPoint:endPoint];

[horizontalLinePath stroke];
}
}

我怀疑这完全与我绘制网格的方式有关,并且愿意接受有关如何更好地进行处理的建议。

我可以看到效率低下的地方,拖动调整 NSWindow 的大小会在调整大小时不断调用此 View 中的 drawRect,并且网格越近,父窗口的每像素拖动计算越多。

我曾考虑在调整窗口大小时隐藏 View ,但感觉不那么动态。我希望用户体验非常流畅,没有任何延迟或闪烁。

有没有人对绘制网格的更好或更有效的方法有任何想法?

所有帮助,一如既往,非常感谢。

最佳答案

您无意中引入了一个 Schlemiel进入你的算法。每次在循环中调用 moveToPointlineToPoint 时,实际上是在向同一路径添加更多线条,所有当您在该路径上调用 stroke 时。

这意味着您第一次画一条线,第二次画两条线,第三次画三条线,等等...

一个快速的修复方法是 每次循环都使用一条新路径 简单地执行 stroke after 循环(感谢Jason Coco 的想法):

path = [NSBezierPath path];
while (...)
{
...

[path setLineWidth:1];
[path moveToPoint:startPoint];
[path lineToPoint:endPoint];
}
[path stroke];

更新:另一种方法是避免完全创建 NSBezierPath,而只使用 strokeLineFromPoint:toPoint:类方法:

[NSBezierPath setDefaultLineWidth:1];
while (...)
{
...
[NSBezierPath strokeLineFromPoint:startPoint toPoint:endPoint];
}

更新#2:到目前为止,我对这些方法进行了一些基本的基准测试。我使用的窗口大小为 800x600 像素,网格间距为 10 像素,我让 cocoa 重绘窗口一千次,从 800x600 缩放到 900x700,然后再缩放回来。在我的 2GHz Core Duo Intel MacBook 上运行时,我看到以下时间:

Original method posted in question:  206.53 seconds  
Calling stroke after the loops: 16.68 seconds
New path each time through the loop: 16.68 seconds
Using strokeLineFromPoint:toPoint: 16.68 seconds

这意味着减速完全是由重复引起的,并且任何几个微改进都对实际加快速度的作用很小。这不足为奇,因为在屏幕上实际绘制像素(几乎总是)比简单的循环和数学运算需要更多的处理器。

要吸取的教训:

  1. 隐藏的 Schlemiel 可以真正减慢速度。
  2. 始终分析您的代码 before doing unnecessary optimization

关于objective-c - 在 NSView 中制作网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2717372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com