一个关于for循环的快速简单的问题.
情况 当我突然想知道for循环实际上是如何表现时,我正在编写一些高性能代码.我知道我之前偶然发现了这一点,但不能为我的生活再次找到这个信息:/
不过,我主要担心的是限制器.说我们有:
for(int i = 0; i < something.awesome; i++)
{
// Do cool stuff
}
Run Code Online (Sandbox Code Playgroud)
问题 是something.awesome存储为内部变量还是循环不断检索某些东西.是否进行逻辑检查?我问的原因当然是因为我需要遍历很多索引的东西而且我真的不希望每次传递都有额外的函数调用开销.
然而,如果something.awesome只被召唤一次,那么我会回到我快乐的摇滚之下!:)
我试图想出一种方法,用于在给定区域(在我的情况下是一个正方形)中生成X量的随机点.造成这种问题的一个原因是每个点必须至少与所有其他点相距Y个单位.
首先想到的是(在c#中)检查新点和所有现有点之间的距离:
while(points.Count < pointsToGenerate)
{
Point newPoint = NewPoint();
bool addPoint = true;
foreach(Point p in points)
{
if((p - newPoint).Length() < minDistance)
{
addPoint = false;
break;
}
}
if(addPoint)
{
points.Add(newPoint);
}
}
Run Code Online (Sandbox Code Playgroud)
现在这肯定会有效,但如果没有找到有效点,这将成为一个永无止境的循环.所以在那里投入一个神奇的数字Z作为尝试的极限?
if(loopCount > 100)
{
break;
}
Run Code Online (Sandbox Code Playgroud)
现在这有一些明显的问题.如果这些点是随机生成的,那么即使存在放置点的位置,loopCount也可以超过Z. 它不仅可以,而且会发生!
我能做的是为每个传递创建一个可用点列表,然后选择其中一个随机点.除了一件事:性能,这将完美无缺.我的应用程序中不需要超级性能,但面积为1000 ^ 2.即使我将自己限制为整数,每次通过也要检查很多要点!
所以,我能想到的可能还不够,因此我希望得到一些帮助.有没有更好的方法在区域A中生成X点,点Y之间的距离最小?
谢谢!
编辑:更好,我的意思是通常更好地实现性能与完美的平衡.我知道,有点模糊.我并不确定我有多少开销可以产生这些点,所以我基本上比我自己的方法更优雅.
〜罗伯特
我正在编写一个带有ListBox的C#App(WinForm),其中包含用户添加的内容.现在,我可以在ListBox下面有一个普通的按钮来删除项目,但是我希望按钮位于内容旁边,因此位于ListBox内部.
像这样:
问题是我缺乏.NET经验,所以我不知道如何通过所有自动化控件继续实现这一点.我用谷歌搜索了它,但没有得出任何有意义的结果.
任何有关实现此目的的提示,线索或片段都是受欢迎的!:)
另一个XNA问题的时间.这一次纯粹是从技术设计的角度来看.
我的情况是这样的:我已经创建了一个基于GPU计算的粒子引擎,远非完整但它的工作原理.我的GPU可以轻松处理10k颗粒而不会出汗,如果我能添加更多的话,我也不会感到惊讶.
我的问题:每当我同时创建大量粒子时,我的帧率就讨厌我了.为什么?大量的CPU使用,即使我已将其最小化以包含几乎只有内存操作.
仍然通过CPU调用来完成粒子的创建,例如:
当我有大约4个发射器每帧创建一个粒子时,我的FPS降低(当然,每秒只有4帧但是15个发射器将我的FPS降低到25).
创建粒子:
//### As you can see, not a lot of action here. ###
ParticleVertex []tmpVertices = ParticleQuad.Vertices(Position,Velocity,this.TimeAlive);
particleVertices[i] = tmpVertices[0];
particleVertices[i + 1] = tmpVertices[1];
particleVertices[i + 2] = tmpVertices[2];
particleVertices[i + 3] = tmpVertices[3];
particleVertices[i + 4] = tmpVertices[4];
particleVertices[i + 5] = tmpVertices[5];
particleVertexBuffer.SetData(particleVertices);
Run Code Online (Sandbox Code Playgroud)
我的想法是,也许我不应该经常创建粒子,也许有一种方法让GPU创建所有东西,或者我可能只是不知道你是如何做这些东西的.;)
编辑:如果我不经常创建粒子,那么仍然使它看起来很好的解决方法是什么?
所以我发帖在这里,希望你知道如何设计一个好的粒子引擎,如果我在某个地方采取了错误的路线.
我最近开始使用ANTLR并发现了ANTLRWorks IDE.虽然编辑器工作正常,但是,当我运行测试装置时,它似乎停留在编译语法文件(或者更确切地说是编译语法没有做什么?),无论我给它什么输入.这是我得到的输出:
ANTLR Codegen
参数:[ - o,C:\ Users \\ AppData\Local\Temp\TestRigTask-1395567588803,-lib,C:\ Users \\ Desktop,-no-listener,-no-visitor,C:\ Users \\ Desktop\Test.g4]
ANTLR Testrig
编译语法文件......
以下是我给它测试问题的输入:
语法
grammar Test;
CUP : 'cup';
MUG : 'mug';
TEA : 'tea';
COFFE: 'coffe';
drinker : 'drinking a' holder 'of' liquid;
holder : MUG | CUP;
liquid : TEA | COFFE;
Run Code Online (Sandbox Code Playgroud)
测试文件
drinking a mug of coffe
Run Code Online (Sandbox Code Playgroud)
我做错了什么/错过了重要的事情吗?
我在某处读到,当渲染大量3D对象时,可以将它们合并形成一个巨大的网格,这样就只能进行一次绘制调用.因此,让,引用:"GPU做它的魔力",而CPU可以自由地进行其他调用而不是绘制.
那么就我的问题而言,在考虑到性能的2D环境中这样做是否可行?
例如,假设我们有一个简单的tile系统,而不是为视图中的每个tile进行绘制调用,而是将所有tile合并为一个大的sprite,然后在其上调用draw.
任何有关此事的见解 - 提示,链接或诸如此类 - 都非常受欢迎,因为我之前没有图形性能方面的经验.
编辑:对不起,我的解释很糟糕.我正在创造一个供个人使用的瓷砖发动机,并希望它尽可能多样化.因此,我希望优化,以防万一我必须在不久的将来绘制大量的瓷砖.
我确实使用了一个瓷砖表,但我对这个问题的意思是,将从工作表中绘制的所有瓷砖合并到一个新的Texture2D中是否会获得性能.例如:
我们在屏幕上绘制了128x72的瓷砖.我们不是循环遍历所有图块并为每个要绘制的图块调用绘图,而是将所有图块合并为一个大小为1280x720的新图形并绘制它.这样,draw()方法每帧只调用一次.我的问题是,这是否会提高性能,因为它会在制作3D时将3d对象合并为单个网格.
因为我收集的信息是调用draw()是一个性能损失,应该尽可能少地调用.有人确认或否认?:)
我非常抱歉这个头衔,但用几句话描述我的问题有点难.我认为帖子的其余部分会更好地解释它!;)
描述
我基本上有一个瓷砖/对象/符号的二维数组,每当一组瓷砖被特殊瓷砖分隔时,我想把它分成两个(或更多)新的二维数组.
例如,如果我有:
[x] [x] [0] [0]
[0] [0] [x] [0]
[0] [0] [x] [0]
[0] [0] [0] [x]
如果不需要符号x,那么应该给我两个新的数组:
[x] [x] [0] [0]
[x] [x] [x] [0]
[x] [x] [x] [0]
[X] [X] [X] [X]
和
[X] [X] [X] [X]
[0] [0] [x] [x]
[0] [0] [x] [x]
[0] [0] [0] [x]
每组互连瓦片的一个阵列.
在我的特定情况下,我将null对象作为x,并将其余对象作为任意对象.基本上,如果我不能从瓦片A到达瓦片B而没有穿过零,那么这两个是两个不同的组.
我已经在脑海里玩了一段时间了,我能想到的最好的肯定比O(n ^ 2)差得多,因为它们甚至在第一时间工作.洪水填充会让人想起可以用来查找组的东西,但除此之外,我不确定我是否可以在此实例中提出任何其他类似的问题.
这个问题
所以我要问的是,你是否碰巧知道在哪个方向上解决我的问题和/或如何解决它.计算复杂性并不是那么重要,因为我计划不经常执行此操作,也不会在大型数组上执行.不过,我希望我没有遇到NP难题!:3
谢谢!
我是相当新的C#,但我会尽力使这个快!;)
这只是一个理论情况,但想象一下:
I)一个人有一个'ClassA',里面有'ClassB','ClassB'里面有'ClassC'.
II) ClassA有一个被调用的方法.方法本身是(不知道这个名称)用已经存在的classB变量"构造"一个新的ClassB.如下:
/*CLASS A*/
ClassA
{
ClassB classB;
ClassA()
{
classB = new ClassB();
}
MethodA()
{
classB = new ClassB();
}
// Other Methods...
}
/*CLASS B*/
ClassB
{
ClassC classC;
ClassB()
{
classC = new ClassC();
}
// Methods...
}
/*CLASS C*/
ClassC
{
// Loads of variables being used...
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道的是:
a)使用classB会在内存方面发生什么?堆中的相同空间是用于类还是会分配新空间?如果后者是这种情况,GC会以某种方式释放先前的内存吗?
b)无论上述结果是什么,classC会发生什么,加载变量篡改内存?
我们将非常感谢您直接回答或只是阅读一些简单的链接.我试图找到自己的答案,但似乎没有人解释这种荒谬的(?)情况.
在你开始理论这个问题的起源之前,我已经告诉你了.我确实把自己置于类似的情况中:
所以这个三级应用程序有时会在Sub-Class1和Sub2之间进行更改,它们都控制着"场景".这些"场景"有一些类来帮助管理(通常).这是(我的想法)无法实现的.
问题是Sub-Class1和Sub-Class 2都会占用一些内存并使用一些"资产".因此,我想擦除,是的,你听到了我,将它们从存在中删除,然后在以后再次重新创建它们.我做了一些阅读,但无法提出解决方案.(如上所述,我是C#的新手以及整个托管的.net的事情).关于这方面的任何建议都应该受到赞赏.
好吧,我写了一些比计划更多但是就是这样!期待对此有所了解!:)
问候,罗伯特
我对XNA中的3D东西相当新,不幸的是我遇到了一个我找不到解决方案的问题.(甚至不知道问题是什么).
简而言之:我在游戏中使用以下方法绘制四边形:
effect.World = Matrix.Identity *
Matrix.CreateRotationX(Rotation.X) *
Matrix.CreateRotationY(Rotation.Y) *
Matrix.CreateRotationZ(Rotation.Z) *
Matrix.CreateTranslation(Position);
// Apply camera-matrixes
effect.View = viewMatrix;
effect.Projection = projectionMatrix;
graphics.VertexDeclaration = vertDec;
// Begin effect drawing
effect.Begin();
foreach (EffectPass pass in
effect.CurrentTechnique.Passes)
{
pass.Begin();
graphics.DrawUserIndexedPrimitives
<VertexPositionNormalTexture>(
PrimitiveType.TriangleList,
quad.Vertices, 0, 4,
quad.Indexes, 0, 2);
pass.End();
}
effect.End();
Run Code Online (Sandbox Code Playgroud)
我的效果也有这些属性:
this.effect.TextureEnabled = true;
this.effect.Texture = texture;
Run Code Online (Sandbox Code Playgroud)
它有效.我的四边形绘制得很好,我很高兴.但是有一个小问题.如果一个四边形位于另一个四边形或常规模型后面,那么确定在顶部绘制的四边形的方式就是我绘制它们的顺序.
假设我在Quad B之前绘制了Quad A,那么B将显示在Quad A的顶部,即使它在Z轴上小于40个单位.我必须说,看起来很混乱!;)
现在我的常规网格没有像这样的任何问题,当涉及原语时,事情会变得混乱.绘制常规线条也是同样的问题:
graphics.DrawUserIndexedPrimitives<VertexPositionColor>(
PrimitiveType.LineStrip,
pointList,
0, // vertex buffer offset to add to each element of the index buffer
6, …Run Code Online (Sandbox Code Playgroud)