我正在编写一个粒子引擎,并注意到它的速度比应有的慢得多(我编写的高度未经优化的3D C++粒子引擎能够以60 fps渲染50k粒子,这一粒子在1.2k左右下降到32 fps. .),我对代码做了一些分析,假设渲染粒子或旋转是CPU占用最多的操作,但是我发现实际上图形对象的这两个小属性实际上占据了我性能的70%以上....
public void RotateParticle(Graphics g, RectangleF r,
RectangleF rShadow, float angle,
Pen particleColor, Pen particleShadow)
{
//Create a matrix
Matrix m = new Matrix();
PointF shadowPoint = new PointF(rShadow.Left + (rShadow.Width / 1),
rShadow.Top + (rShadow.Height / 1));
PointF particlePoint = new PointF(r.Left + (r.Width / 1),
r.Top + (r.Height / 2));
//Angle of the shadow gets set to the angle of the particle,
//that way we can rotate them at the same rate
float shadowAngle …Run Code Online (Sandbox Code Playgroud) 好吧,所以我已经对这个主题做了一些研究,我发现的大多数解决方案都声称可以解决这个问题,但我发现它们的工作效果并不是很好.我正处于实现一个简单的小粒子引擎的早期阶段,没有什么可疯狂的我只是出于无聊而做到这一点.我以前没有用WinForms做过这样的事情,我肯定用C/C++,但这对我来说是个新事物.以下是我用于将粒子绘制到屏幕上的代码,粒子的锅炉板代码不相关,因为它工作正常,我对我的实际游戏循环更加好奇.
这是更新和重绘的主要代码
public MainWindow()
{
this.DoubleBuffered = true;
InitializeComponent();
Application.Idle += HandleApplicationIdle;
}
void HandleApplicationIdle(object sender, EventArgs e)
{
Graphics g = CreateGraphics();
while (IsApplicationIdle())
{
UpdateParticles();
RenderParticles(g);
g.Dispose();
}
}
//Variables for drawing the particle
Pen pen = new Pen(Color.Black, 5);
Brush brush = new SolidBrush(Color.Blue);
public bool emmiter = false;
private void EmitterBtn_Click(object sender, EventArgs e)
{
//Determine which emitter to use
if (emmiter == true)
{
//Creates a new particle
Particle particle = new Particle(EmitterOne.Left, EmitterOne.Top, .5f, …Run Code Online (Sandbox Code Playgroud) 我写了以下代码:
void incrementNumber(int *num)
{
*num++;
printf("%i\n", *num);
}
int main()
{
int i = 3;
printf("%i\n", i);
int *ptr = &i;
incrementNumber(&i);
printf("%i\n", i);
getchar();
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
每当我以增量编号输出num时,它只会打印垃圾,但是如果我将代码更改为:
void incrementNumber(int *num)
{
*num += 1;
printf("%i\n", *num);
}
Run Code Online (Sandbox Code Playgroud)
它按预期输出值.我正试图摆脱使用引用,所以我可以更好地理解指针因为(像大多数人一样)我对指针的知识相当有限,所以我试图更好地掌握它们.
还让我重新解释一下这个问题,我知道为什么它输出那个垃圾值,这是因为它增加了内存地址并在那个位置打印垃圾而不是增加内存地址中包含的值,我想我问的是为什么它是通过增量而不添加来实现的吗?它只是这两个命令编译成汇编的方式吗?有没有办法以这种方式增加指针指向的值?
我试图向朋友解释免费是如何工作的,所以我想到了下面的代码示例来尝试解释它(复杂,我知道):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *stringPtr = NULL;
//Pass the size of the string in bytes to malloc
stringPtr = (char *)malloc(10 * sizeof(char));
strcpy(stringPtr, "A String. ");
printf("%s", stringPtr);
free(stringPtr);
printf("%s", stringPtr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
认为这段代码会释放堆上分配的内存,我假设如果我然后打印出分配给指针的字符串,它会做一些奇怪的事情或者崩溃程序,因为我认为它会尝试输出空值; 然而,当我运行它时,它最终只输出两次字符串.我想我会一步一步看看为什么,因为在我的脑海里,我想也许它将字符串复制到堆栈或其他东西然后指针指向一个新的内存地址,旧的内存毕竟被清理干净了(并不是说这种情况会有任何意义,但是,嘿,我不知道它会是什么),但当我逐步完成代码不仅没有释放内存,指针实际上仍然指向相同的内存地址,它具有相同的值.
当我调查它时,人们说你需要在调用free后指定一个空值,但我的问题是为什么?不应该释放只是解除分配该内存并将指针设置为null?保留价值的重点是什么?或者我只是不理解某事?
我认为fill_parent有很大的价值,我想自己实现它,所以我可以做的不仅仅是填充剩余的空间(例如:填充80%的剩余空间等)
fill_parent实际上如何在引擎盖下工作?如何计算剩余空间,它如何在运行时工作等.
我在过去做过类似的事情,fill_parent根据当前的屏幕大小,元素应该占用的屏幕大小等来计算元素应该占用的空间等等.但我想知道Android是如何做到的与fill_parent.