我正在寻找可以在graphics编辑程序中进行的任何优化

嘿哟,这是我第一次在这里问一个问题,所以如果我把事情搞得一团糟,就原谅我

我正在开发类似于openCanvas的程序,早期的程序允许多人在互联网上实时绘制相同的canvas。 OC的确很麻烦,而且有很多限制,所以我想写这个。

我已经设置了canvas,使canvas在所有方向上“无限”地延伸,并由512×512像素块组成,这些像素在被绘制之前不会变得活跃,这应该很容易制作,而且我正在考虑使用Direct3D使硬件加速,从而达到512平方块。

我的问题来了,当我想要使用图层,我不太确定如何快速构build图层,而不使用大量的内存,因为我的目标是128M内存的DirectX9兼容video卡,以及约3.2 ghz的系统的CPU的功率和2至8演出之间的RAM。 我有几种不同的方法,我正在考虑使用,并想知道哪个可能是最好的,如果有什么我可以研究,使其运行更好。

我的第一个想法是通过让所有块上的所有图层都作为纹理来使gfx硬件尽可能多地工作,并且通过locking更改的区域,在CPU上更新它们并解锁它们来更新它们。 当前未被更改的块被拼合成一个纹理,并且单独的图层本身保存在系统内存中,这将减less使用的gfx内存,但是会显着增加系统和gfx内存之间的带宽使用。 我可以看到不断的locking和解锁,可能会减慢系统的速度。 另一个可能的问题是,我听说有人使用200层,我想不出有什么好的方法来优化给定的上述。

我的另一个想法是将系统内存中的纹理完全合成,将它们写入纹理,然后将纹理复制到gfx内存以在每个块中渲染。 这似乎消除了其他方法中的很多问题,但同时我将所有工作都移到了CPU中,而不是平衡它。 但是,只要它仍然很快运行,这并不是什么大问题。 然而,再次,有几百层的问题。 在这种情况下,我可能只能更新实际上正在改变的最终像素,这是我认为像Sai和Photoshop这样的大型程序所做的。

我主要是在寻找build议,可能改善上述的build议,更好的方法,或链接到可能与这样的项目有关的文章。 当我用C ++编写它时,我从其他语言翻译没有麻烦。 谢谢你的时间〜

Solutions Collecting From Web of "我正在寻找可以在graphics编辑程序中进行的任何优化"

数据结构
你一定要使用四叉树(或其他分层数据结构)来存储你的画布,它的节点应该包含比512×512像素小得多的块。 也许不会像1×1像素一样小,因为那样的层次开销会杀了你 – 你会通过测试找到一个很好的平衡。

画画
让用户只用一个(最高)的分辨率。 想象一下无限大的均匀网格(二维数组)。 由于您知道鼠标的位置以及用户从原点滚动的数量,因此可以导出绝对坐标。 将四叉树遍历到该区域(最终添加新节点),并在用户将其绘制到四叉树中时插入块(例如32×32)。 我会缓冲用户在二维数组中绘制的内容(例如与其屏幕分辨率一样大),并使用单独的线程来遍历/更改四叉树,并从缓冲区中复制数据以规避任何延迟。

渲染
遍历四叉树并将所有图块复制到一个纹理并将其发送到GPU? 没有! 你看,发送一个像屏幕分辨率一样大的纹理不是问题(带宽方面)。 但是遍历四叉树并且组装最后的图像是(至少如果你想要很多fps的话)。 答案是将四叉树存储在系统内存中并从GPU流式传输。 意思是:另一个线程异步执行遍历,并以尽可能快的速度将当前查看的数据复制到GPU中。 如果您的用户没有以全分辨率查看画布,则不必将树遍历到叶级别,这会为您提供自动细节级别(LOD)。

关于所提出的策略的一些随机想法

  • 四叉树方法非常棒,因为它非常有效率。
  • 流媒体的想法可以扩展到HDD … SeaDragon
  • 一个复杂的实现需要像CUDA这样的东西。
  • 如果您的GPU没有提供必要的性能/可编程性,只需在CPU上执行遍历 – 稍微延迟一段时间,直到图像完全显示,但应该可以接受。 不要忘记使用多线程异步编程,以便在等待CPU时屏幕不会冻结。 你可以使用不同的效果:一次显示整个图像,首先模糊,慢慢增加细节(广度优先搜索(BFS))或按瓦片(深度优先搜索(DFS))渲染 – 也许混合一些很酷的效果。
  • 软件实现应该非常简单,只允许以全分辨率查看画布。 如果可以缩小步骤,这是对遍历的一个小改动。 如果可以无缝缩放,则需要在相邻四叉树节点的图块之间进行线性插值 – 而不是微不足道,但是可行。
  • 层:四叉树应该给你足够低的内存消耗,让你可以简单地存储每层四个树。 但是当你有很多图层时,你需要进行一些优化来保持实时:每帧不能组装200个纹理,并将它们发送到GPU。 也许 (不完全确定这是否是最好的解决方案),删除每个图层下的四方形的所有节点,其图块的像素完全被上面的图层覆盖。 这需要在绘图时在运行时完成,并且需要深度缓冲区。 如果提供橡皮擦工具,则不能删除节点,而必须将其标记为“不可见”,以便在遍历期间可以省略这些节点。

..我的头顶。 如果您还有其他问题,请告诉我!