嘿yo,这是我第一次在这里问问题,所以如果我搞砸了,请原谅我吧~~ <
我正在开发一个类似于openCanvas的程序,早期的程序允许多人通过Internet实时在同一张 Canvas 上绘制。 OC确实是个 buggy ,并且有很多局限性,这就是为什么我想写这个。
我将其设置为使 Canvas 在所有方向上“无限期地”延伸,并由512x512像素的像素块组成,这些像素在被绘制之前不会变为事件状态,这应该真的很容易制作,我在考虑使用Direct3D使其硬件加速,即512平方块。
我的问题是当我想使用图层时,我不太确定如何在不使用大量内存的情况下快速组成图层,因为我的目标是具有128m内存的DirectX9兼容视频卡以及具有约3.2 ghz的系统CPU功率和2到8演出的ram之间。我正在考虑使用几种不同的方法,并且想知道哪种方法最好,以及是否有什么我可以研究以使其运行更好的方法。
我的第一个想法是通过将所有块上的所有层都用作纹理来使gfx硬件尽可能多地工作,并且可以通过锁定更改的区域,在cpu上更新它们并对其进行解锁来对其进行更新。当前未更改的块被展平为一个纹理,各个层本身保留在系统内存中,这将减少使用的gfx内存,但可能会大大增加系统和gfx内存之间的带宽使用率。我可以看到不断的锁定和解锁也可能会减慢系统的运行速度。另一个可能的问题是,我听说有些人使用了多达200层,并且鉴于上述情况,我想不出任何优化该层的好方法。
我的另一个想法是在系统内存中完全构成纹理,将它们写入纹理,然后将该纹理复制到gfx内存中以在每个块中进行渲染。这似乎消除了其他方法的许多问题,但是与此同时,我将所有工作移到了CPU中,而不是平衡它。不过,只要它仍然可以快速运行,这并不是什么大不了的事情。但是,仍然存在数百层的问题。不过,在这种情况下,我可能只能更新实际更改的最终像素,这就是我认为像Sai和Photoshop这样的大型程序所要做的。
我主要是在寻找建议,可能会改善上述内容的建议,更好的方法,或链接到可能与该项目相关的文章。当我用C++编写代码时,可以很容易地从其他语言进行翻译。谢谢你的时间〜
最佳答案
数据结构
您绝对应该使用四叉树(或其他分层数据结构)来存储 Canvas ,并且其节点应包含比512x512像素小的和较小的块。也许不小于1x1像素,因为分层开销会杀死您-通过测试,您会找到一个很好的平衡点。
工程图
让您的用户仅使用一种(最高)分辨率。想象一个无限大的均匀网格(二维阵列)。由于您知道鼠标的位置以及用户从原点滚动的数量,因此可以得出绝对坐标。将四叉树遍历到该区域中(最终添加新节点),并在用户将其绘制到四叉树中时插入块(例如32x32)。我会缓冲用户在2D数组中绘制的内容(例如,与他的屏幕分辨率一样大),并使用单独的线程来遍历/更改四叉树,并从缓冲区复制数据以规避任何延迟。
渲染
遍历四叉树并将所有图块复制到一个纹理并将其发送到GPU?不!您会看到,发送一个与屏幕分辨率一样大的纹理不是问题(在带宽方面)。但是遍历四叉树并组装最终图像是(至少如果您想要很多fps)。答案是将四叉树存储在系统内存中,并从GPU对其进行流传输。意思是:异步地,另一个线程进行遍历,并将当前查看的数据尽可能快地分块复制到GPU。如果您的用户没有以全分辨率查看 Canvas ,则不必遍历树到叶级别,这将为您提供自动的细节级别(LOD)。
关于拟议策略的一些随机想法
..离开我的头顶。如果您还有其他问题,请告诉我!
关于c++ - 我正在寻找可以在图形编辑程序中进行的任何优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4986847/