给对象唯一的 ID onStart
Giving objects unique ids onStart
我有一堆游戏对象,我在 Start 函数中为其分配了唯一的 ID。
void Start() {
UniqueID = String.Format("{0:X}", DateTime.Now.Ticks);
}
我认为这可行,但时不时地我会收到重复的 ID。我怎样才能确保它们始终是唯一的?
我会使用 guid。
UniqueID = Guid.NewGuid.ToString();
根据您的建议,2 个实例 运行 同时可以将相同的 "unique" UniqueID 应用于 2 个不同的对象。
Guid 即使在实例之间也应该是唯一的。
此方法不会在您的应用程序的多个实例中提供唯一 ID!
我建议使用 static long
变量并使用 Interlocked.Increment 来处理并发和同步,这样您就可以轻松地将 Id 分配给您的对象。它在调试方面比 GUID 更好,可读性更好,它使用的内存比 GUID 少。
//define an accessible static variable somewhere in your code
public static long __Id = 0;
//use it to assign unique Id to objects
UniqueID = Interlocked.Increment(ref __Id);
它的性能也比 GUID 好,这里是一个快速检查和结果
public static long __Id = 0;
private static void Main(string[] args)
{
var sw1 = new Stopwatch();
var guid = Guid.NewGuid();
sw1.Start();
for (var i = 0; i < 10000000; i++)
{
guid = Guid.NewGuid();
}
sw1.Stop();
Console.WriteLine(guid);
Console.WriteLine(sw1.ElapsedTicks);
var sw2 = new Stopwatch();
long id = 0;
sw2.Start();
for (var i = 0; i < 10000000; i++)
{
id = Interlocked.Increment(ref __Id);
}
sw2.Stop();
Console.WriteLine(id);
Console.WriteLine(sw2.ElapsedTicks);
}
结果
f91419e0-9d3a-4e64-b7fd-ed2080dad599
10376104 (guid time)
10000000
304231 (long time) 34 times faster than guid
Unity
已经为每个对象实例提供了唯一的 ID,请查看 GetInstanceID.
我有一堆游戏对象,我在 Start 函数中为其分配了唯一的 ID。
void Start() {
UniqueID = String.Format("{0:X}", DateTime.Now.Ticks);
}
我认为这可行,但时不时地我会收到重复的 ID。我怎样才能确保它们始终是唯一的?
我会使用 guid。
UniqueID = Guid.NewGuid.ToString();
根据您的建议,2 个实例 运行 同时可以将相同的 "unique" UniqueID 应用于 2 个不同的对象。
Guid 即使在实例之间也应该是唯一的。
此方法不会在您的应用程序的多个实例中提供唯一 ID!
我建议使用 static long
变量并使用 Interlocked.Increment 来处理并发和同步,这样您就可以轻松地将 Id 分配给您的对象。它在调试方面比 GUID 更好,可读性更好,它使用的内存比 GUID 少。
//define an accessible static variable somewhere in your code
public static long __Id = 0;
//use it to assign unique Id to objects
UniqueID = Interlocked.Increment(ref __Id);
它的性能也比 GUID 好,这里是一个快速检查和结果
public static long __Id = 0;
private static void Main(string[] args)
{
var sw1 = new Stopwatch();
var guid = Guid.NewGuid();
sw1.Start();
for (var i = 0; i < 10000000; i++)
{
guid = Guid.NewGuid();
}
sw1.Stop();
Console.WriteLine(guid);
Console.WriteLine(sw1.ElapsedTicks);
var sw2 = new Stopwatch();
long id = 0;
sw2.Start();
for (var i = 0; i < 10000000; i++)
{
id = Interlocked.Increment(ref __Id);
}
sw2.Stop();
Console.WriteLine(id);
Console.WriteLine(sw2.ElapsedTicks);
}
结果
f91419e0-9d3a-4e64-b7fd-ed2080dad599
10376104 (guid time)
10000000
304231 (long time) 34 times faster than guid
Unity
已经为每个对象实例提供了唯一的 ID,请查看 GetInstanceID.